平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“基于本地知识的问答机器人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 问答。
二、以淘宝衣服为例,测试问答效果
实际处理时,以淘宝衣服属性构建本地知识,测试问答效果。将淘宝链接为(链接已移除),内容如下所示:
身高: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 |
- linux环境部署清华大学大模型最新版 chatglm2-6b 图文教程
- macbook安装环境chatglm2-6b的详细过程
- ChatGLM-6B+LangChain环境部署与采用实战
- ChatGPT平替- ChatGLM多用户同时行访问部署过程
- ChatGPT平替-ChatGLM环境搭建与部署运行效果
- ChatGLM 集成LangChain工具详解
- 基于prompt tuning v2训练好一个垂直领域的chatglm-6b
- 从实现思路看,最简化ChatGLM2-6b小白部署教程【windows系统,16G内存即可,对显卡无要求,CPU运行】

