基于本地知识的问答机器人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 GB | 14 GB |
INT8 | 8 GB | 9 GB |
INT4 | 6 GB | 7 GB |