1 文档加载准确性和效率
优化文档读取器
一般知识库中的文档格式都不尽相同,包括HTML、PDF、MarkDown、TXT、CSV等。每种格式文档都有其独有的数据组织方式。核心优化方向是:在读取这些数据时,如何将干扰项去除(如一些特殊符号等),同时还能保留原文本之间的关联关系(例如CSV文件保留其原有的表格结构)。
目前的探索方案:针对每一类文档,设计一个专门的读取器。例如LangChain中提供的WebBaseLoader就是专门用来加载HTML文本的。
参考链接:
python.langchain.com/v0.1/docs/m…
数据清洗与增强
输入垃圾,那也必定输出垃圾。 如果你的源数据质量低劣,比如包含互相冲突的信息,那不管你的RAG工作构建得多么好,它都不可能用你输入的垃圾神奇地输出高质量结果。
这个解决方案不仅适用于这个痛点,任何RAG工作流程想要获得优良表现,都必须先清洁数据。 根据您提供的图片内容,我已识别整理如下:
2 文档切分的粒度
粒度太大可能导致检索到的文本包含太多不相关的信息,降低检索准确性;粒度太小可能导致信息不全面,导致答案的片面性。问题的答案可能跨越两个甚至多个片段。
固定长度的分块
直接设定块中的字数,每个文本块有多少字。
内容重叠分块
在固定大小分块的基础上,为了保持文本块之间语义上下文的连贯性,在分块时,保持文本块之间有一定的内容重叠。
基于结构的分块
基于结构的分块方法利用文档的固有结构,如HTML或Markdown中的标题和段落,以保持内容的逻辑性和完整性。 根据您提供的图片内容,我已识别整理如下:
基于递归的分块
重复地利用分块规则不断细分文本块。在LangChain中会先通过段落换行符(\n\n)进行分割。然后,检查这些块的大小。如果大小不超过一定阈值,则该块被保留。对于大小超过标准的块,使用单换行符(\n)再次分割。以此类推,不断根据块大小更新更小的分块规则(如空格、句号)。
分块大小的选择
-
不同的嵌入模型有其最佳输入大小。比如OpenAI的
text-embedding-ada-002模型在256或512大小的块上效果更好。 -
文档的类型和用户查询的长度及复杂性也是决定分块大小的重要因素:
- 处理长篇文章或书籍时,较大的分块有助于保留更多的上下文和主题连贯性
- 而对于社交媒体帖子,较小的分块可能更适合捕捉每个帖子的精确语义
- 如果用户的查询通常是简短和具体的,较小的分块可能更为合适
- 相反,如果查询较为复杂,可能需要更大的分块
根据您提供的两张图片内容,我已识别整理如下:
3 内容缺失
准备的外挂文本中没有回答问题所需的知识。这时候,RAG可能会提供一个自己编造的答案。
增加相应知识库
将相应的知识文本加入到向量知识库中。
数据清洗与增强
输入垃圾,那也必定输出垃圾。 如果你的源数据质量低劣,比如包含互相冲突的信息,那不管你的RAG工作构建得多么好,它都不可能用你输入的垃圾神奇地输出高质量结果。
这个解决方案不仅适用于这个痛点,任何RAG工作流程想要获得优良表现,都必须先清洁数据。
更好的Prompt设计
通过Prompts,让大模型在找不到答案的情况下,输出"根据当前知识库,无法回答该问题"等提示。这样的提示,就能鼓励模型承认自己的局限,并更透明地向用户传达它的不确定。
虽然不能保证100%准确度,但在清洁数据之后,精心设计prompt是最好的做法之一。
根据您提供的图片内容,我已识别整理如下:
4 错过排名靠前的文档
外挂知识库中存在回答问题所需的知识,但是可能这个知识块与问题的向量相似度排名并不是靠前的,导致无法召回该知识块传给大模型,导致大模型始终无法得到正确的答案。
增加召回数量
增加召回的topK数量,也就是说,例如原来召回前3个知识块,修改为召回前5个知识块。
不推荐此种方法,因为知识块多了,不光会增加token消耗,也会增加大模型回答问题的干扰。
重排(Reranking)
该方法的步骤是,首先检索出topN个知识块((N > K),过召回),然后再对这topN个知识块进行重排序,取重排序后的(K)个知识块当作上下文。
重排是利用另一个排序模型或排序策略,对知识块和问题之间进行关系计算与排序。
5 提取上下文与答案无关
内容缺失 或 错过排名靠前的文档 的具体体现
6 格式错误
Prompt调优
优化Prompt,逐渐让大模型返回正确的格式。
7 答案不完整
将问题分开提问:一方面引导用户精简问题,一次只提问一个问题。另一方面,针对用户的问题进行内部拆分处理,拆分成数个子问题,等子问题答案都找到后,再总结起来回复给用户。
8 未提取到答案
提示压缩技术:
mp.weixin.qq.com/s/61LZgc1a5…