python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > 本地知识的问答机器人langchain-ChatGLM

基于本地知识的问答机器人langchain-ChatGLM 大语言模型实现方法详解

作者:无涯

这篇文章主要介绍了基于本地知识的问答机器人langchain-ChatGLM 大语言模型实现方法,结合具体实例形式详细分析了langchain-ChatGLM的功能、原理、部署方法与操作注意事项,需要的朋友可以参考下

背景

ChatGPT火了后,各种大语言模型(LLM)模型相继被发布,完全开源的有ChatGLM、BLOOM、LLaMA等。但是这些模型学到的知识是滞后的(比如ChatGPT的知识是截止到2021年),并且这些知识是通用领域的。

在实际应用场景中,除闲聊机器人外,大多数机器人是为了完成特定任务的。比如数字人虚拟主播、某公司的智能客服等都需要围绕具体的业务来进行问答。如何将具体业务知识融合到大语言模型里,是问答机器人落地应用需要考虑的一个重要问题。

一、langchain-ChatGLM简介

langchain-ChatGLM是一个基于本地知识的问答机器人,使用者可以自由配置本地知识,用户问题的答案也是基于本地知识生成的。github链接为:GitHub - imClumsyPanda/langchain-ChatGLM: langchain-ChatGLM, local knowledge based ChatGLM with langchain | 基于本地知识的 ChatGLM 问答

二、以淘宝衣服为例,测试问答效果

以淘宝衣服属性构建本地知识,测试问答效果。将淘宝链接为https://detail.tmall.com/item.htm?abbucket=6&id=656544342321&ns=1&spm=a230r.1.14.48.b3f84f64A9YLJ0的"宝贝详情"和"尺码推荐"整理成《local_knowledge_clothing_describe.txt》,内容如下:

身高:160-170cm, 体重:90-115斤,建议尺码M。
身高:165-175cm, 体重:115-135斤,建议尺码L。
身高:170-178cm, 体重:130-150斤,建议尺码XL。
身高:175-182cm, 体重:145-165斤,建议尺码2XL。
身高:178-185cm, 体重:160-180斤,建议尺码3XL。
身高:180-190cm, 体重:180-210斤,建议尺码4XL。
身高:180-195cm, 体重:210-230斤,建议尺码5XL。
面料分类:涤纶
图案:几何图案
领型:连帽
衣门襟:拉链
颜色:黑色302春秋款(斜插口袋) 深灰色302春秋款(斜插口袋) 蓝色302春秋款(斜插口袋) 米色302春秋款(斜插口袋) 黑色303春秋款(工装口袋) 深灰色303春秋款(工装口袋) 蓝色303春秋款(工装口袋) 黑色303(冬季棉衣款加棉加厚) 深灰色303(冬季棉衣款加棉加厚) 蓝色303(冬季棉衣款加棉加厚) 黑色302(冬季棉衣款加棉加厚) 米色302(冬季棉衣款加棉加厚) 黑色303春秋款+黑色302春秋款 深灰色303春秋款+黑色302春秋款
袖型:收口袖
适用季节:春秋
袖长:长袖
厚薄:常规
适用场景:其他休闲
衣长:常规款
版型:宽松型
款式细节:假两件
工艺处理:涂层
适用对象:青少年
面料功能:防风
穿搭方式:外穿
材质成分:聚酯纤维100% 

加载《local_knowledge_clothing_describe.txt》作为本地知识,问答效果如下所示:

用户:身高173,体重144斤,选什么尺寸客服: 您的身高为173厘米,体重为144斤,建议选择尺码为XL。这个尺寸适用于身高在170-178厘米之间,体重在130-150斤之间的人。选择XL尺寸可以确保衣服能够合适地遮盖住身体,同时不会过小或过大,确保穿着舒适。用户:衣服是什么材质客服: 衣服的材质成分为聚酯纤维100%

从测试的问答效果上来看,满足了基本的要求,具体情况仍需要更多的实测结果来说明。

三、langchain-ChatGLM的原理

先上图,langchain-ChatGLM的架构如下图所示:

图1、langchain-ChatGLM的架构

3.1、从本地知识中获取与用户query相关的context

通过Faiss搜索得到与query_embedding关系最紧密的Top K个Document,将这些Document的内容按换行符拼起来作为query的context。举例说明如下图所示:

图2、通过Faiss搜索得到query相关的context

3.2、用query和context填充模版得到prompt

模版示例如下,可根据问答效果自行修改

prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。不允许在答案中添加编造成分。
    已知内容:
    {context}
    问题:
    {query}"""

将context和query填充到模版得到的prompt,加它输入给ChatGLM-6B就能生成response。

四、langchain-ChatGLM使用中

五、问答需要优化的环节

个人认为langchain-ChatGLM是一种使用本地知识进行问答的框架,它的实际问答效果与下面两个问题相关:

1、如何通过得到query相关性高的context,即与query相关的Document尽可能多的能被召回;

2、如何让LLM基于query和context得到高质量的response。

5.1、让query相关的Document尽可能多的被召回

将本地知识切分成Document的时候,需要考虑Document的长度、Document embedding质量和被召回Document数量这三者之间的相互影响。在文本切分算法还没那么智能的情况下,本地知识的内容最好是已经结构化比较好了,各个段落之间语义关联没那么强。Document较短的情况下,得到的Document embedding的质量可能会高一些,通过Faiss得到的Document与query相关度会高一些。

使用Faiss做搜索,前提条件是有高质量的文本向量化工具。因此最好是能基于本地知识对文本向量化工具进行Finetune。另外也可以考虑将ES搜索结果与Faiss结果相结合。

5.2、基于query和context让LLM得到高质量的response

有了query相关的context后,如何让LLM生成高质量的response,也是一个非常重要的问题。优化的点有两个:①、尝试多个的prompt模版,选择一个合适的,但是这个可能有点玄学;②、用与本地知识问答相关的语料,对LLM进行Finetune。

补充:ChatGML模型对于硬件的要求比较高,内存需要32G以上,半精度的 ChatGLM2-6B 模型需要大概 13GB 内存。

查看专属GPU内存:因为ChatGLM2内存要求6GB以上才可以发挥出性能要求。

下表为ChatGLM2-2B的根据显存大小决定的问答性能。

量化等级最低 GPU 显存(推理)最低 GPU 显存(高效参数微调)
FP16(无量化)13 GB14 GB
INT88 GB9 GB
INT46 GB7 GB
您可能感兴趣的文章:
阅读全文