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.rhkb.cn/news/154963.html

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

相关文章

ARM day5

三盏灯流水 .text .global _start _start: 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<4)STR R1,[R0] 1.LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<5)STR R1,[R0] 2.LDR R0,0X50006000LDR R1,[R0]BIC R1,R1,#(0X3<<20)ORR R1,R1,#(0X1<<…

【数据结构】二叉树的顺序结构及实现

目录 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆向下调整算法 3.2 堆的创建 3.3 建堆时间复杂度 3.4 堆的插入 3.5 堆的删除 3.6 堆的代码实现 4. 堆的应用 4.1 堆排序 4.2 TOP-K问题 1. 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&…

【算法-动态规划】不同路径

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

智慧电力物联网系统引领电力行业数字化发展

智慧电力物联网系统是以提高用户侧电力运行安全、降低运维成本为目的的一套电力运维管理系统。综合分析采用智慧物联网、人工智能等现代化经济信息网络技术&#xff0c;配置智能采集终端、小安神童值班机器人或边缘网关&#xff0c;实现对企事业用户供配电系统的数字化远程监控…

linqjs记录

linqjs记录 在LINQ.js中&#xff0c;你可以使用一系列方法来操作数组。以下是一些常见的LINQ.js数组方法&#xff1a; 教程:https://medium.com/swlh/data-manipulation-in-javascript-using-linq-f3759e00aceb 1.Enumerable.From(array)&#xff1a;将普通数组转换为可查询…

GLTF纹理贴图工具让模型更逼真

1、如何制作逼真的三维模型&#xff1f; 要使三维模型看起来更加逼真&#xff0c;可以考虑以下几个方面&#xff1a; 高质量纹理&#xff1a;使用高分辨率的纹理贴图可以增强模型的细节和真实感。选择适合模型的高质量纹理图像&#xff0c;并确保纹理映射到模型上的UV坐标正确…

多媒体播放软件 Infuse mac中文特点介绍

Infuse mac是一款多媒体播放器应用&#xff0c;它支持播放多种格式的视频文件、音频文件和图片文件&#xff0c;并且可以通过AIrPlay将媒体内容投放到其他设备上。Infuse还支持在线视频流媒体播放和本地网络共享&#xff0c;用户可以通过它来访问家庭网络上的媒体文件。 Infuse…

猫头虎带您了解CSDN1024城市开发者大会分会场报名指南(文末送30元优惠券)

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

测试经理应该怎么写测试部门年终总结报告?

年终总结一般对季度、半年度或年度总结的一个整理&#xff0c;我们需要定期对工作中的内容进行定期总结和复盘。将每一次复盘中总结出来的一些收获叠加起来&#xff0c;在针对性地调整一下&#xff0c;就是一份合格的年终总结。具体可以分为如下几个步骤&#xff1a; 1.先把这…

c++视觉处理-----cv::findContours函数和图像进行去噪、平滑、边缘检测和轮廓检测,动态检测图形

cv::findContours cv::findContours 是OpenCV中用于查找图像中对象轮廓的函数。轮廓是对象的边界&#xff0c;通常用于对象检测、分割和形状分析。cv::findContours 函数的基本用法如下&#xff1a; cv::findContours(image, contours, hierarchy, mode, method, offset cv:…

【广州华锐互动】AR轨道交通综合教学平台的应用

轨道交通是一种复杂且精密的系统&#xff0c;涵盖了众多技术和工程学科&#xff0c;包括机械、电气和计算机科学等。对于学生来说&#xff0c;理解和掌握这些知识是一项挑战。然而&#xff0c;AR技术的出现为解决这一问题提供了可能。 通过AR技术&#xff0c;教师可以创建生动、…

国产化技术探究达梦8数据库搭建一主一从双机热备守护Data Watch集群搭建实战windows版本

国产化技术探究达梦8数据库搭建一主一从双机热备守护Data Watch集群搭建实战windows版本 如果是Linux版本达梦8部署则参考笔者另一篇博文 https://blog.csdn.net/nasen512/article/details/133737692此文章针对是windows版本的达梦部署 1、测试环境介绍 服务器类型IP地址操…

WorkPlus一站式解决方案,助力企业构建统一门户系统

在信息爆炸的时代&#xff0c;企业管理面临着海量的数据和各类业务应用的复杂性。如何实现信息的井然有序、高效管理&#xff0c;成为企业发展的关键。WorkPlus作为领先的品牌&#xff0c;致力于打造统一门户系统&#xff0c;为企业提供全方位的服务和解决方案。本文将以知乎的…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

Linux系统编程:编译过程以及GDB调试

编译工具链SDK&#xff08;Software Development Kit&#xff09; 在windows下编写程序&#xff0c;我们通常会用IDE&#xff0c;比如idea、vs等&#xff0c;这些工具将编译链接什么的全都暗地里解决好了我们只要写程序就行&#xff0c;但很明显&#xff0c;在Linux系统下做不…

前端axios发送请求,在请求头添加参数

1.在封装接口传参时&#xff0c;定义形参&#xff0c;params是正常传参&#xff0c;name则是我想要在请求头传参 export function getCurlList (params, name) {return request({url: ********,method: get,params,name}) } 2.接口调用 const res await getCurlList(params,…

ubuntu离线编译安装cmake 3.22.5(could not fonud OPENSSL) and cmake-versinon查不到版本问题

1、首先去cmake官网下载压缩包,例如: cmake-3.22.5.tar.gz 2、拉到ubuntu进行解压: tar -zxcf cmake-3.22.5.tar.gz 3、cd 进入目录 cd cmake-3.22.5 4、执行configure可执行文件 ./configure 如果在编译过程中出现报错:Could NOT findOpenSSL,原因可能是缺少ssl库 按…

从城市吉祥物进化到虚拟人IP需要哪些步骤?

在2023年成都全国科普日主场活动中&#xff0c;推出了全国首个科普数字形象大使“科普熊猫”&#xff0c;科普熊猫作为成都科普吉祥物&#xff0c;是如何进化为虚拟人IP&#xff0c;通过动作捕捉、AR等技术&#xff0c;活灵活现地出现在大众眼前的&#xff1f; 以广州虚拟动力虚…

【Acwing187】导弹防御系统(LIS+剪枝+贪心+dfs+迭代加深)

题目描述 看本文需要准备的知识 1.最长上升子序列&#xff08;lis&#xff09;的算法思想和算法模板 2.acwing1010拦截导弹&#xff08;lis贪心&#xff09;题解 本题题解&#xff0c;需要知道这种贪心算法 3.简单了解dfs暴力搜索、剪枝、搜索树等概念 思路讲解 dfs求最…

代数——第3章——向量空间

第三章 向量空间(Vector Spaces) fmmer mit den einfachsten Beispielen anfangen. (始终从最简单的例子开始。) ------------------------------David Hilbert 3.1 (R^n)的子空间 我们的向量空间的基础模型(本章主题)是n 维实向量空间 的子空间。我们将在本节讨论它。…