AIGC|利用大语言模型实现智能私域问答助手

随着ChatGPT的爆火,最近大家开始关注到大语言模型(LLM)这个领域。像雨后春笋一样,国内外涌现出了很多LLM。作为开发者,我们通常会关注LLM各自擅长的领域和能力,然后思考如何利用它们的能力来解决某个场景或下游任务。

假如现在有一个需求是实现一个私域知识的文本生成问答助手,我们应该如何去实现呢?

下面就来试验一下。

一、模型选择

首先,我们要明确需求:我们需要一个模型,能理解用户的问题并生成固定格式的回答。这就要求模型具备良好的语义分析和文本生成能力。在这种情况下,我们选择使用ChatGPT的GPT-3.5模型。

然而,像GPT这样的大模型,要训练自己的数据集是既困难又昂贵的,所以我们采用了一种称为“zero-shot-prompt”的方法,也就是“0样本”无需训练,直接使用模型。但zero-shot也存在一个难题:我们需要将我们的私域知识全部放入输入中,作为上下文和问题一起交给LLM处理。

但大家知道,OpenAI的API由于底层机制的原因,存在Token数的限制。这就意味着我们交给模型的输入内容文本长度是有限制的。因此,我们不能一次性将所有内容交给LLM处理。

二、向量数据库

向量数据库的出现为我们解决了这一问题。传统关系型数据库主要进行关键字匹配查询,而向量数据库则擅长进行语义查询,能检索出与输入内容相似的结果。这里先引入一个关键概念,即Embedding,也就是将文本知识或其他数据格式的内容通过Embedding算法转换成向量数据,然后存入向量数据库中。这样,数据库就能基于相似性算法找出最接近的数据并返回给我们。目前市面上的向量数据库有很多,这里暂不一一介绍,感兴趣的读者可以自行了解。

在ChatGPT中,使用了Pinecone和Chroma两种向量库。本例中,我们采用Milvus向量数据库来存储私域知识,Embedding算法直接使用了OpenAI提供的算法。

三、LangChain

作为应用端开发人员,我们可能对模型交互不太了解,但这并不妨碍我们使用LangChain这个开源框架来快速构建端到端的应用程序。LangChain可以帮助我们轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库等。通过使用LangChain,我们可以轻松地将模型和数据库集成起来。

下面我将开始使用LangChain将模型和数据库集成起来。

# 准备数据 提前将私域信息向量化后存入数据库中
fromlangchain.vectorstores importMilvus
fromlangchain.embeddings importOpenAIEmbeddings
embedding_function=OpenAIEmbeddings()
vector_db = Milvus(
embedding_function,
collection_name="test_01",
connection_args={"host": "127.0.0.1", "port": "19530"},
)
text1 = 'xxxx公司下有AI服务器产品:KunTai A222、KunTai A722、 KunTai A924'
text2 = 'xxxx公司下有单路服务器产品:KunTai R222、KunTai R224'
text3 = 'xxxx公司下有四路服务器产品:KunTai R822'
vector_db.add_texts([text1,text2,text3])

上图可以看到vector字段里面的数据就是Text的Embedding结果

#设置open_api_key
importos
os.environ[ "OPENAI_API_KEY"] = "自己的key"# 接入模型
fromlangchain.llms importOpenAI
llm = OpenAI(temperature=0)# 定义memory ,这里我们自定义出一个memory类,从Milvus查询相似度高的信息作为上下文,同时利用redis缓存历史用户对话信息
fromlangchain.schema importBaseMemory
frompydantic importBaseModel
fromtyping importAny, Dict, List, Union
fromlangchain.schema importDocument
fromlangchain.memory importRedisChatMessageHistory
fromlangchain.embeddings.openai importOpenAIEmbeddings
fromlangchain.vectorstores importMilvus
fromlangchain.schema import(
AIMessage,
HumanMessage
)classSelfMemory(BaseMemory, BaseModel):
........省略
@property
defmemory_variables(self)-> List[str]:
return[self.context_memory_key,self.chat_memory_key]defload_memory_variables(self, inputs: Dict[str, Any])-> Dict[str, Union[List[Document], str]]:
# 根据用户的输入先从milvus里面去检索出相识度比较高的几条信息
docs = self.vector_db.similarity_search(query = inputs[list(inputs.keys())[0]],k = 5)
result: Union[List[Document], str]
result = "\n".join([doc.page_content fordoc indocs])
# 获取用户历史对话
chat_result = self.spit_chat_history(self.chat_history.messages)
return{self.context_memory_key: result,self.chat_memory_key:chat_result}defsave_context(self, inputs: Dict[str, Any], outputs: Dict[str, str])-> None:
#只存储会话相关信息存储到redis里面
self.chat_history.add_user_message(inputs[list(inputs.keys())[0]])
self.chat_history.add_ai_message(outputs[list(outputs.keys())[0]])
# 定义PromptTemplate 
fromlangchain.prompts importPromptTemplate
_DEFAULT_TEMPLATE = """以下是用户和助手之间的友好对话。助手十分智能,能够自己结果上下文进行回答问题。已知信息是在私有数据库里面检索出来比较接近的信息,
历史对话是用户之前和助手的聊天记录,请结合已知信息和对话信息来做出回答,回答请使用下面我给出的格式回答。如果不知道答案,请直接告诉我不知道。已知信息:
{context}
历史对话:
{history}
当前对话:
用户: {input}
助手:"""
PROMPT = PromptTemplate(
input_variables=["context","history", "input"], template=_DEFAULT_TEMPLATE
)
# 构造chain 模拟对话 当前用户为lisi
fromlangchain.chains importConversationChain
user_name = 'lisi'
conversation = ConversationChain(
llm=llm,
verbose=False,
memory=SelfMemory(user_name),
prompt=PROMPT
)
conversation.run("我想买一台AI服务器")

conversation.run("KunTai A222")

根据打印的日志信息,LangChain会将问题、历史对话以及通过Milvus检索到的相似信息整合到Prompt中,然后交给LLM处理。这样,我们就可以获得所需的回答。

四、总结

以上示例展示了如何利用LangChain快速接入LLM和向量库,实现本地私域知识问答的简单模拟。

关于LLM、LangChain以及向量库的应用,这里只是介绍了冰山一角。为了让大家更深入了解并构建出满足自己需求的功能更为丰富的应用程序,建议感兴趣的读者详细学习官方的文档。通过掌握这些技术,我们将能够更好地应对复杂多变的应用场景,并为用户带来更加智能、高效的使用体验。

参考资料:

  1. https://python.langchain.com/en/latest/
  2. https://milvus.io/docs
  3. https://www.modb.pro/db/516016
  4. https://www.modb.pro/db/516016

作者 :张任华 | 高级后端开发工程师

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,了解更多AI相关技术干货。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Table ‘mysql.proc‘ doesn‘t exist

使用workbench 同步model 報錯 "Table ‘mysql.proc‘ doesn‘t exist" 爲什麽會出現這個錯誤? 原因:误删了mysql数据库 解决办法如下: 1、在服务列表里找到mysql,停止服务 2、把mysql文件夹下的data文件夹备份&…

GaussDB向量数据库为盘古大模型再添助力

在今年7月7日的华为开发者大会2023(Cloud)期间,华为云盘古大模型3.0正式发布。目前盘古大模型已在政务、金融、制造、医药研发、气象等诸多行业发挥巨大价值。此次华为云发布的GaussDB向量数据库,具备一站式部署、全栈自主创新优势,不仅如此,它的ANN算法在行业排名第一,…

华为、小鹏大定爆单,智驾苦尽甘来,车主终于愿意买单

‍作者|德新 编辑|王博 国庆假期结束,车圈的最大热点事件,当属问界M7卖爆,上市不到一个月时间内,狂揽5万张大定订单。 在华为手机强势回归,改款问界M7大热的高光之下,还有一个重要趋势值得关注&#xff1…

[MySQL]基础篇

文章目录 1. MySQL基本使用1.1 MySQL的启动和登录1.1.1 MySQL的启动1.1.2 MySQL的客户端连接 1.2 数据模型 2. SQL2.1 SQL类型2.1.1 数值类型2.1.2 字符串类型2.1.3 日期类型 2.2 DDL2.2.1 数据库操作2.2.2 表操作 - 查询2.2.3 表操作 - 创建表2.2.4 表操作 - 修改 2.3 DML2.3.…

C++语言实现网络爬虫详细代码

当然&#xff01;下面是一个用C语言实现的基本网络爬虫的详细代码示例&#xff1a; #include <iostream> #include <string> #include <curl/curl.h> size_t writeCallback(void* contents, size_t size, size_t nmemb, std::string* output) {size_t totalS…

linux系统配置Samba实现与Windows系统的文件共享

1.linux系统下载安装Samba sudo apt install samba 2.在linux文件系统中创建一个共享目录(通常在用户目录下面创建一个名为share的目录) mkdir share 3.修改samba配置文件 sudo vim /etc/samba/smb.conf 添加配置信息(path share路径,需要修改) ,保存修改 [Share]comm…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack

堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一个子组件覆盖前一个子组件。该组件从API Version 7开始支持。可以包含子组件。 一、接口 Stack(value?: { alignContent?: Alignment }) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 二、…

交流回馈老化测试负载的应用

交流回馈老化测试负载的应用非常重要&#xff0c;老化测试是一种对产品进行长时间运行和负载测试的方法&#xff0c;旨在模拟产品在实际使用中的长期稳定性和可靠性。在老化测试过程中&#xff0c;负载是指对产品施加的工作负荷&#xff0c;可以是CPU、内存、硬盘等资源的使用情…

docker 部署lnmp

目录 1、部署nginx\ 1.1、vim Dockerfile 1.2、 1.3、vim nginx.conf 2、部署mysql&#xff08;容器IP 为 172.18.0.20&#xff09; 2.1、vim Dockerfile 2.2、vim my.cnf 2.3、 3、部署php&#xff08;容器IP 为 172.18.0.30&#xff09; 3.1、 vim Dockerfile 3.2、…

常见的Web安全漏洞(2021年9月的OWASP TOP 10)

聊Web安全漏洞&#xff0c;就不得不提到OWASP TOP10。开放式Web应用程序安全项目&#xff08;OpenWeb Application Security Project&#xff0c;OWASP&#xff09;是一个开源的、非营利的组织&#xff0c;主要提供有关Web应用程序的实际可行、公正透明、有社会效益的信息&…

【办公自动化】在Excel中按条件筛选数据并存入新的表2.0(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

mysql面试题29:大表查询的优化方案

该文章专注于面试&#xff0c;面试只要回答关键点即可&#xff0c;不需要对框架有非常深入的回答&#xff0c;如果你想应付面试&#xff0c;是足够了&#xff0c;抓住关键点 面试官&#xff1a;说一下大表查询的优化方案 以下是几种常见的大表优化方案&#xff1a; 分区&…

数据治理的核心是什么?_光点科技

数据治理是当今数字化时代中企业管理的关键组成部分。在信息爆炸的时代&#xff0c;企业积累了大量的数据&#xff0c;这些数据不仅是企业宝贵的资产&#xff0c;也是推动业务决策和创新的重要驱动力。数据治理的核心在于建立有效的框架和流程&#xff0c;以确保数据的质量、安…

TensorFlow入门(十七、神经元的拟合原理)

深度学习的概念源于人工神经网络的研究,神经网络是由多个神经元组成,。一个神经元由以下几个关键知识点组成: ①激活函数 ②损失函数 ③梯度下降 单个神经元的网络模型如图所示 用计算公式表达如下: z为输出的结果,x为输入,w为权重,b为偏置值。z…

Python大数据之Python进阶(五)线程

文章目录 线程1. 线程的介绍2. 线程的概念3. 线程的作用4. 小结 线程 学习目标 能够知道线程的作用 1. 线程的介绍 在Python中&#xff0c;想要实现多任务除了使用进程&#xff0c;还可以使用线程来完成&#xff0c;线程是实现多任务的另外一种方式。 2. 线程的概念 线程是进程…

安装JAVA 依赖环境 Maven 教程

一、下载链接与Tips Maven 过去版本下载传送门&#xff1a;&#xff08; Java 8 兼容 Java 7&#xff0c;即 Java 8 的 JDK 能运行 3.8.8 以下的 Maven&#xff09; Maven Releases History Download 点击 release notes 点击 available for download. 选择 bin 的安装包 然…

深度学习DAY2:n-gram

什么是LM(language model语言模型)&#xff1f; 引例&#xff1a; 1、统计机器学习时期的语言模型–语音识别 2、贝叶斯公式求P(s|A)——在有了语音信号的前提下是文本的概率 1 n-gram模型概述 n-gram模型是一种统计语言模型&#xff0c;用于建模文本数据中的语言结构。…

【Java】微服务——Feign远程调用

目录 1.Feign替代RestTemplate1&#xff09;引入依赖2&#xff09;添加注解3&#xff09;编写Feign的客户端4&#xff09;测试5&#xff09;总结 2.自定义配置2.1.配置文件方式2.2.Java代码方式 3.Feign使用优化4.最佳实践4.1.继承方式4.2.抽取方式4.3.实现基于抽取的最佳实践1…

【深度学习】Chinese-CLIP 使用教程,图文检索,跨模态检索,零样本图片分类

代码&#xff1a;https://github.com/OFA-Sys/Chinese-CLIP/blob/master/deployment.md 文章目录 安装环境和onnx推理转换所有模型为onnx测试所有onnx模型的脚本onnx cpu方式执行docker镜像 安装环境和onnx推理 安装环境&#xff0c;下载权重放置到指定目录&#xff0c;进行on…

制造业进销存管理怎么做?

进销存是什么&#xff1f;生产制造业如何进行进销存管理&#xff1f;制造进销存都能为企业提供什么&#xff1f;进销存管理系统的优势&#xff1f;本文将带大家深入浅出的聊聊制造进销存&#xff0c;全面剖析制造进销存的前世今生。 接下来我会通过一些例子为大家深入浅出的讲…