背景
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的架构如下图所示:
3.1、从本地知识中获取与用户query相关的context
通过Faiss搜索得到与query_embedding关系最紧密的Top K个Document,将这些Document的内容按换行符拼起来作为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。