“由于ChatGPT的数据更新目前只截止到2021年9月,并且它也不一定有特定垂直领域的数据。如何将这些领域的最新数据“喂”给ChatGPT,使其成为一名领域专家呢?今天就来从系统设计的角度来聊聊这个话题。
本文讲解了建设一个基于知识库的AI问答机器人的设计思想,适用领域:各种垂直领域知识库、AI客服机器人的搭建场景。
1 建设AI问答机器人面临的难点
各个行业都会积累很多垂直领域的商业数据,随着ChatGPT浪潮席卷全球,大家都在思考如何利用ChatGPT的能力最大化这些数据的价值。而受限于以下三个原因,这些数据无法直接接入ChatGPT:
- ChatGPT不是搜索引擎,它只会收录通用领域的语料库,很多垂直领域商业数据不在这部分语料范围内。
- 垂直领域数据更新较快,但ChatGPT这种大模型无法做到实时收录最新的公开数据。
- 受限于垂直领域商业数据的保密需求,使得这部分数据无法直接接入ChatGPT这类公开大模型。
接下来我们将一步一步的讲解如何设计一个垂直领域的AI问答机器人,解决以上这些问题。
2 段落切分和意图识别
假设我们的场景是要建立一个公司的AI自动客服系统,手头有公司的一整套知识库。
我们清楚ChatGPT有4096的Token上下文的限制,是无法一次性将整套知识库灌给ChatGPT的。这就要求我们想办法将数据“剪枝”,而剪枝的方法就是将用户的“问题”和知识库中可能的“段落上下文”联系起来。
首先,用户的提问肯定是包含意图的,比如他问“我如何登录?”,这个问题明显是“登录”这个意图,而如果我们知识库中有关于解答“如何登录”的相关文章段落,就可以将这个段落抽取出来,作为prompt上下文,连带用户的提问发给ChatGPT。他就可以基于上下文给出特定问题的答案。
这需要我们将知识库的数据预先切分成一小段一小段的段落文本,然后将这些段落文本输入到一个自建或托管的语义引擎中。用户提问时,实际是先请求语义引擎,匹配到相关段落后,再将此段落上下文+用户提问一起发给ChatGPT:
这里最关键的是两步:
- 识别用户意图
- 匹配知识库中相同或相近意图的段落并将上下文抽取出来
3 向量检索
要实现这两步,首先需要解释一下文本的向量化存储。上文中的语义引擎实际就是利用向量化存储引擎构建的。
向量化存储非常重要,你可以简单理解为将文本段落转化为一个个向量空间的过程,而由于向量和向量之间是可以计算余弦角度的,角度越小,文本在语义层面就越接近。
这样,我们就可以将用户提问的文本向量,和知识库中的向量集合进行比较,从而找到用户意图和知识库匹配的段落。
4 实例:登录场景问答
假设下图是我们知识库中有关“登录”的段落:
语义检索的过程:
- 将知识库中的每个段落计算向量,存入向量存储引擎。
- 通过计算用户提问和知识库段落之间的向量相似度,将高相似度的段落提取出来。
- 将提取出来的段落作为上下文放入prompt中,同时放入prompt中的还有“角色信息”和“用户提问”。
- 把封好的prompt整体发给ChatGPT,它就能根据这些信息,给出答复:
有朋友可能会问:在第二步中实际已经匹配出答案段落了,为什么不能直接用这个答案回复用户呢?从上图可以看到,ChatGPT的回答是比较精炼的,也就是说它会针对问题和上下文做匹配,返回更加智能和准确的结果。
5 保密数据处理
在将prompt发给ChatGPT之前,可以先做一下数据的脱敏,将文本中的涉密内容“扣”掉,替换为一些占位符。这样既可以保留上下文语义,又避免了垂直领域的数据泄露。
例如,在上文中“VideoGram”作为网站名称,如果不想泄露的话,可以将此名称替换为{{SiteName}},待ChatGPT返回答案后,再将答案中的{{SiteName}}替换回来。一般的涉密实体信息,都可以通过这种处理方式避免泄露。
6 避免回答和问题不相关
对于垂直类知识库,有时候用户的提问可能并不能匹配到相关答案。在对答案精确率要求较高的场景,为了避免ChatGPT一本正经的胡说八道,可以考虑两个方法:
- 在向量匹配计算余弦相似度时有一定的阈值,如果问题和知识库的段落相似度太低则直接给用户固定的答复,例如:很抱歉,您的问题我暂时无法回答,请问您需要转人工客服吗?
- 更严格的场景下,可以利用LIamaIndex最新的evaluation工具,在问题+答案+上下文均匹配时,该API才会返回YES。这可以避免ChatGPT产生“幻觉”答案等情况。
7 总结
上文讲解了构建一个AI知识库问答机器人的设计思路,工程化实现方面,有一些开源工具例如LangChain可以帮助我们快速实现这个知识库机器人。我已将LangChain的示例代码链接放入后台,感兴趣的朋友可以关注本订阅号,后台发送知识库获取相关链接。