本地知识库优化,让 AI 回答更精准
大家在使用百度和谷歌搜索引擎的时候,搜索出来的内容第一页都是强相关的(广告不算),越往后内容可能越偏离。
这是因为搜索引擎会根据相似度&相关度进行综合排列后,按照从高到低的顺序进行返回,这就会导致越靠后就离搜索内容越偏移。
而由于文字是有多种类型,并且拥有成千上万种组合方式,因此在转成向量进行相似度匹配时,很难保障其精确性。在向量方案构建的知识库中,通常使用 topk 召回的方式,也就是查找前 k 个最相似的内容,丢给大模型去做更进一步的语义判断、逻辑推理和归纳总结,从而实现知识库问答。因此,在知识库问答中,向量搜索的环节是最为重要的。
影响向量搜索精度的因素非常多,主要包括:向量模型的质量、数据的质量(长度,完整性,多样性)、检索器的精度(速度与精度之间的取舍)。与数据质量对应的就是检索词的质量。
基于 FastGPT 项目,我们来挨个进行讲解。从索引阶段(数据导入)和召回阶段(数据搜索)两个方面进行优化。
一、索引阶段
索引阶段主要是两种方式,一种是分段导入,一种是 QA 导入。
1、分段导入
直接分段会利用句子分词器对文本进行一定长度拆分,大家可以看到我在导入个人经历
后会被切割成好几段内容。
由于上下文长度是有限制的,所以在导入过长数据时会被自动切割成好几份,切割后就可能会出现连贯语义数据被切割。
- 提示词工程(Prompt Engineering):借助提示词工程理解数据内容,只能相对保证连贯语义内容不会被切割。
- 手动切割:既然内容太多,我们就可以自己手动切割,按照 Markdown 结构化格式进行拆分,大语言模型读取时很容易就能够识别出来。
手动切割比起利用提示词工程自动切割好处就在于:我们更加了解内容,可以将内容按照模块进行准确分割,保证知识库数据的完整性。
手动切割前:
大家好,我是知白。一个专注于输出 AI+ 编程内容的大厂资深程序员,全国最大付费社群 AI 破局初创合伙人,关注我一起进步......后续省略1000字
手动切割后:
# 知白
## 个人信息
大家好,我是知白。一个专注于输出 AI+ 编程内容的大厂资深程序员,全国最大付费社群 AI 破局初创合伙人,关注我一起进步......
## 工作经历
进入到工作后,第一个项目是做一个物业系统,是一家国企外包出来的千万项目......
由我们自己将数据切割好,并明确告诉模型每个模块对应的内容,这样检索起来效率和准确度都会更好。
2、QA 方式
QA 指的是 Question(问题) 和 Answer(答案),我们直接将数据拆分成问题-答案的方式来进行导入。
但仍然需要使用到句子分词器对文本进行拆分,但长度比直接分段大很多。在导入后,会先调用大模型对分段进行学习,并给出一些问题和答案,最终问题和答案会一起被存储到 Q 中。
导入数据格式为:
Q1:问题
A1:答案
Q2:问题
A2:答案
......
数据借助 AI 做拆分,让 AI 返回这样的数据格式给我们。
二、召回阶段
在做数据检索和生成回答时,就有很多配置可以调整。
1、温度&回复上限
可以看到温度的两头分别是严谨和发散,具体含义如下:
- 严谨:生成的内容要求精确,降低废话和错误信息,适用于学术、医学、报告解读等场景
- 发散:生成的内容会具有创造性,AI 会根据已有信息编造内容,适用于小说、创意生成等场景
而回复上限控制 AI 回复的最大 Tokens,较小的值可以一定程度上减少 AI 的废话,但也可能导致 AI 回复不完整。
2、相似度
学名称为距离,两个向量之间距离,可以认为是两个向量的相似度,又可以映射成文本之间的相似度。
在进行内容检索时,会将所有检索生成的信息与输入内容匹配,从而生成相似度。
需要注意的是,不同的向量模型之间的相似度是不能比较的,因为他们的距离值计算出来差距很大。例如,openai 的 embedding 模型,通常 0.8 以上的才是较为准确的内容,而 M3E 模型则是 0.35。
这里相似度配置调整,就是可以直接将低于这个相似度的内容剔除掉,从而保证结果的准确性。
3、单次搜索数量
每次触发搜索模块时,最多取 n 条作为最终引用,又称 topN。需要注意的是,取了 n 条引用不代表对话模型都可以使用,还会受对话模型最大 Tokens 的影响。
通过控制每次结果的搜索个数,从而只将高相似度内容同步给 ChatGPT 从而提升准确性,同时还能节约 Token 数。但是可能出现内容回答不完整的情况,需要按需调整。
4、提示词调整
当然通过调整提示词也能够提升准确性,我们可以在提示词中严格规则限定,从而保证输出结果。
例如我们可以这样约束模型:
你的背景知识:
"""
{{quote}}
"""
对话要求:
1. 背景知识是最新的,其中 instruction 是相关介绍,output 是预期回答或补充。
2. 使用背景知识回答问题。
3. 背景知识无法回答问题时,你可以礼貌的的回答用户问题。
我的问题是:"{{question}}"
三、总结
对于原始数据的清洗也是非常重要,去除数据中的脏乱差等现象,从而保证数据的可用性和准确度。这部分工作我们也可以借助 AI 来完成,帮我们找出其中的脏数据
。
参考文章:FastGPT 官网(https://doc.fastgpt.in/docs)
本文转载自 AI探索者知白,作者: 知白