写在前面
微调场景中,RAG(检索增强生成)是让许多团队心水的、相对低成本又能快速见效果的方法。
但!RAG方案本身,也存在一些难以避免的问题。
这篇经典的论文就阐述了RAG有哪7个常见的错误,我们调侃为【RAG的“七宗罪”】。
先来一张总览图,便于直观了解7个错误所在的位置:
论文解读
“罪过”一:索引过程中,内容缺失
在知识完成切片、向量化并存入向量索引库的过程中,存在内容缺失,导致大模型回答问题的时候根本没有对应的知识依据。
论文中没有具体举例,我尝试补充一些例子:
- 知识源头就对特定知识存在遗漏
- 从原始文档摘录知识的过程中,发生了漏传
- 知识切片过程中,发生了缺漏,比如数据丢失、识别不准确、语义断裂等等
- embedding过程中,发生了缺漏
- 存入向量库过程中,发生了缺漏
- 等等
“罪过”二:查询过程中,未命中最高排名结果
知识已经存在,但是可惜没有被星探相中!也就是说,在基于一定检索方式进行检索后,被召回的知识片段里,不存在我们希望出现的那一个(些)。 理论上,所有的chunk都有排名,但是我们实践过程中所选择的采样方法,决定了采样的门槛,把阈值以下的片段都挡掉了。比如,top k采样中,我们会把相似度从高到低排,选择前K个片段召回;top p采样中,我们同样把相似度从高到低排,并累计概率和,直到这个数值大于等于P,选择这个最小集合。
那为什么会出现这种错误?论文里也没有具体举例,我也尝试补充一些例子:
- 检索方式有很多(语义检索?文本检索?混合检索?是否加了重排?),基于当前特定场景,是否设定合理?
- 相似度参数的设定,是否存在不合理?
- 知识编排是否存在不合理?比如颗粒过大,希望召回的内容不够聚焦,导致整个片段的相似度被拉低?
- 以及上一个点中提到的,如果知识切片过程中存在语义切断,也是会直接影响知识片段召回效果的
- 等等
“罪过”三:检索片段整合过程中,内容缺失
Consolidator(整合器):把从检索(Retrieval)阶段获取的多个信息片段进行整合。例如,检索出了关于某个主题的多个段落、句子或者数据点,这些信息可能是分散的、格式不一致的,“consolidator” 会将它们整理成一个更有逻辑性、连贯性的整体,以便后续的生成(Generation)阶段能够更好地利用这些信息来生成高质量的回答或内容。
这是整合策略本身的短板。尤其是在有很多文档片段被召回的时候,可能会发生这种情况。
“罪过”四:提取信息过程中,提炼错误
如上,相关的知识确实是有了,可是大模型却没有提炼到正确的回答内容。
一般来说,当信息中存在太多的噪音,或者存在自相矛盾、互相冲突的内容,就容易产生这个问题。
“罪过”五:提取信息过程中,格式错误
当需要提取一些特定格式的数据,比如表格、列表等,而大模型直接忽略了对格式处理相关的指令,最终导致结果错误。
“罪过”六:回答结果中,特异性不正确
终于,经过重重“障碍”,大模型的回答里终于出现了看似正确的内容!可是,当我们定睛一看,回答的内容实在是太笼统、太不够具体了;又或者是,太过于具体,以至于啰里八嗦让人抓狂……总之就是根本不能让用户满意!
这种情况更倾向于发生在:我们对于某些指定问题,有非常强期望的、指向性的回答结果。比如教育的细分场景下,老师给学生的答疑解惑。
还有一种情况:当提问者本身不太确定该如何描述自己的疑问、或者问得过于笼统的时候(感觉很经常发生啊!),大模型的回答也可能出现这种情况。
“罪过”七:回答结果中,信息不完整
这种时候,大模型的回答并不是有错误内容,而是有点“真话我都说,但真话我不全都说”的味儿了~~~
但,终归要列为“罪过”一项!毕竟断章取义的后果,大家懂的都懂……
论文里倒是也给了一个例子,比如当你提问 What are the key points covered in documents A, B and C? (文档A、B、C的核心要点是什么?)这时候大模型给的回答可能是不够完整的。
论文里还提到,目前比较快的解决办法,就是用户提问的时候,针对这三个文档分开进行提问……
总结
论文中还提到其他很多会影响RAG效果的因素,包括文档切片的手段(启发式vs语义式),以及多模态的chunk(图表、图形、公式等);以及很多涉及到其他领域的研究,都还有待投入资源探索和时间验证。此外,这篇论文只是他们探索系列中的第一部。
不管怎么说,RAG在特定条件下,依旧是一个比较务实的解决方案。了解一个方案背后的特性,分析其优劣,能更好地评估自己当下场景需求的匹配性。