跳到主要内容

RAG 效果上不去,你多半一直在修错的那一半

画唠
画唠

· 阅读约 5 分钟

8 月有篇论文,arXiv:2608.00658,《Select-And-Extract》,Chenming Tang 和 Jiawei Han。预印本,一百七十来 KB,薄。但它给了个切口,让我把自己调 RAG 那点破经验重新排了一遍。

先说结论——RAG 效果上不去,大概就两种死法。而绝大多数人,包括我,把全部力气花在修前一种上。

来,画开看看。

我第一版是这么理解 RAG 的:

你提问 ──► 向量检索 ──► 拼进 prompt ──► 模型回答
              ▲
              └─ 我以为问题全在这一格

这不是我瞎画的,是我真干过的事。chunk size 512 试到 1024 又试回来,embedding 模型换了三四个,top-k 调到我自己都不记得调到几。全在这条链左边那一格。

然后有一批 case 我死活搞不定。查回来的东西是对的,答案还是错的。我盯着看了半天,第一反应"检索没找对"——可把召回结果打出来一看,那段原文就在里面躺着,清清楚楚。模型就是没用它。

论文那个切分就落在这儿:

            ┌── 检索失败:该找的东西根本没被召回
RAG 出问题 ─┤
            └── 阅读失败:召回了,但生成器没用上 / 用歪了

我第一次看到不怎么服气——这不废话吗,谁不知道有两种。重点在后面:这两类失败,解法方向不一样,甚至互相打架。

检索那一侧,常见做法是把索引结构搞得越来越精细。论文里一句话点得挺狠,说这类结构化索引可能卡在固定结构的泛化能力上——你为某种语料设计的结构,换一批数据就不灵。阅读那一侧,常见做法是查询时做结构化,但那通常要大量调语言模型,而且极吃模型本身的能力。

两边都有各自的账要付。大部分人(我)的选择是:挑一个,付更狠的代价,把那一侧堆到极致。

SANE 不是这个路子。它没往上加重量,而是在两个位置各加了一次"判断"。

先看检索那一步。它不让语义检索器一步到位,先拿一个比较大的候选集合——撒网,撒宽点——再让语言模型读候选的摘要,把靠前的挑出来。论文说这样比原始检索器的召回更好。

打个比方:原来是一个管理员凭经验直接从书架上抽一本递给你,抽错了就没了;现在先把一整排搬过来,再让人扫一眼挑。多一道工序,但便宜——因为读的是摘要,不是全文。

这个比喻在这里漏风,得标出来:图书馆里书是确定的,"哪本对"有客观答案;RAG 里"相不相关"是模型判的,没有一份标准答案摆那儿等你。所以"让人扫一眼"这步本身也可能扫错——它不是免费的正确性,只是一个更便宜的判断点。

再看阅读那一步。你撒网捞回一堆候选,原封不动全塞进 prompt,模型照样抓不住重点——这个我踩过。SANE 的做法是给一份蓝图,按蓝图从候选里抽证据,抽出来的东西紧凑、结构化,生成器只看这一小坨。

这一步我卡了挺久才反应过来:它不是在压缩,是把"哪些信息是这次推理真正需要的"这件事,从生成器脑子里挪到生成之前。生成器本来就该专心推理,不该同时分心从一堆噪声里刨料。

原来是这样。✨ 我之前总觉得"上下文塞得越全越好",其实塞得越全,那道分心的工序就越重。

论文自己把 SANE 定位成轻量插件,说它是那些更重方案的简单替代,还顺口撂了句:高性能的 RAG 框架未必需要过度复杂。这句我认。补一句我自己的:SANE 那两个判断点——检索后挑候选、生成前抽证据——本质都是让语言模型在一个很小的、很局部的范围里做判断。它便宜不是因为步骤少,是因为每次判断的输入被削得很小。这跟"把 pipeline 一刀砍到最简"是两码事,别搞混。

顺带说,论文报告的提升和"适度的额外开销",我没复现。预印本嘛,先记着。

我照着这个切分,把手头十几个坏 case 分了一遍。结果有点意外:大概七个是阅读失败——召回结果里就躺着正确段落,答错了;剩下才是真没召回。我一直以为绝大多数问题是检索的锅,结果一半以上在右边那一格。怪不得 top-k 调到麻木也不见好。

……扯远了,拉回来。

前面说这两类失败是两条路,这里得自我推翻一下:切太干净也不对。一次糟糕的证据抽取,会让检索看起来像失败了——你查回来的东西没错,但抽出来的那一坨没带上关键那句,生成器答不出来,回看日志只会觉得"检索没召回"。这两格在真实 pipeline 里会互相甩锅。还有个更烦的地方:大部分调试界面只给你看召回结果,不给你看生成器到底吃进去了什么,所以你默认只能看到链子左边那一格。

就算它切得不绝对干净,价值也不在"给你一本手册",在于给你一个定位方向:出问题的时候,你至少能问自己一句"这次是没找回来,还是找回来了没用上"。这两种情况的下一步动作完全不同——前者动检索,后者动上下文组织。

而我以前连这个问句都问不出来,因为我脑子里只有一条线。

画开完了。照例自检:你手上那个 RAG,最近一次效果不好,你说得出是哪一格丢的吗?说不出来,你多半还在改 top-k。

下期想画开哪个概念,你说了算。候选清单上排着两个:embedding 的相似度到底怎么算,还有 KV cache——后者我绕了很久,到现在还有一格没画明白,画明白了再补。

画唠
画唠

把被讲玄的概念用图 + 比喻 + 动手实验拆到咔哒扣明白,错的也保留。

查看主页 →