检索增强生成(RAG)
检索增强生成是一种技术:从一批数据里检索出段落,作为上下文交给语言模型,让回答依据这些数据,而不只依据模型训练时学到的东西。
- 又称
- RAG、检索增强回答
- 擅长
- 答案就在某一段里的查找
- 不擅长
- 证据分散在整本书里的问题
它怎样工作
流程是:把资料切成碎片,做 embedding,把问题也做 embedding,取得分最高的碎片,再根据它们生成回答。
这非常适合查找。「这份合同的退款期限是多久?」答案就在某一段里,检索能找到那一段。
它在哪里失灵
当问题不再是查找时,它会以一种具体而可预测的方式变差:
- 证据分散在整份文档里。 作者在哪里改变了立场? 没有哪个碎片包含这个变化;它只有跨章节才看得出来。检索返回的是和问题最相似的碎片,这和「合起来能回答问题的碎片」不是一回事。
- 缺席。 这篇论文明确没有主张什么? 没有东西可以 embedding。搜索不存在的东西,返回的只会是存在的东西。
- 资料之间的分歧。 检索追求的是和问题相似,所以它很可能返回五段意见一致的话、一段异议都没有——而五段一致的话汇成的顺滑摘要,读起来就和共识一模一样。
- 结构。 切块毁掉了让一本书能被导航的东西。一堆段落大小的碎片没有章节,没有论证顺序,没有「前面」和「后面」。
问题需要的是第 4 章和第 11 章。检索返回的是看起来最像问题的内容——而回答里看不出它从没见过什么。
令人不安的是,这些失败没有一个会自己报出来。检索漏了和检索中了,产出的回答一样笃定,回答里也没有任何地方说明有三段相关的文字从没给模型看过。
检索质量可以改进——关键词加语义的混合匹配、重排、更大的重叠窗口——这些都有帮助。但都改变不了一个事实:模型是在一份它没有选择、你也看不到的样本上作答。
MindMax 怎样处理
不把检索当默认做法。一份文档如果装得进写明的阅读预算,就把全文放进上下文,完全不检索——见全文优先。不跑 embedding,不建向量库,打开文件夹和向它提问之间也没有建索引的等待。
对确实太大的材料,先用结构,再谈相似度:先读章节地图,再把和问题相关的章节完整读完——就像人使用目录那样——而不是抽取几个得分高的碎片。找某一句特定的话被当作查找,用关键词搜索来做,因为精确的字眼正是相似度会模糊掉的东西。
这就是常说的无向量 RAG:由模型通过对结构的推理来决定读什么,而不是由一个相似度分数替它决定。
底下依然有搜索,因为一千份文档永远装不进上下文窗口。变化在于:搜索负责定位要读什么,而不是替代阅读;它产出的每条说法,都带着一句你一点就能核对的引文。
你加入的文档最先读;文件夹其余部分只在问题需要时才搜索。
常见问题
为什么 RAG 在长文档里会漏信息?
因为它只凭和问题最相似的碎片作答。当证据分散在各章、本身是一种缺席,或者是资料之间的分歧时,真正要紧的碎片往往并不是最相似的那些——而回答里看不出它们被漏掉了。
上下文窗口已经这么大了,还需要 RAG 吗?
对大批资料,需要:几千份文档装不进任何窗口。对一篇论文或一份报告,常常不需要——一份装得进合理阅读预算的文档可以直接整篇读,这样就彻底没有检索遗漏。
MindMax 用 RAG 吗?
不把它当默认做法。装得进阅读预算的文档整篇读;更长的按章节地图导航、一节一节地读。搜索用来定位要读的文档和章节,每条说法都带着一句对照原文核对过的引文。