RAG 出错就骂模型,这条弯路我绕过,而且绕得比大多数人久。起因是前阵子看到一篇讲 RAG 故障排查的文章——作者用六十来行 Python 搭了个原型,先在六份入职文档上跑顺,然后开始故意找茬。看完我只有一个感觉:她踩的坑我全踩过,还踩得更久。
那篇文章里最值钱的一句话,大意是:出错的 RAG,问题几乎从来不在模型,而在你喂给模型的证据。证据要么缺了一块,要么混了一堆。
我以前不信这个。我第一版画的 RAG 图长这样:
提问 ──► 检索 ──► 塞进 prompt ──► 模型 ──► 答案
四个框,一条线。答错了?那肯定是模型不行,换个更强的。动手试了几次,不对——换模型跟没换一样,该错还错。我盯着输出看了半天,脑内只有羊叫,才反应过来一件事:模型那格没毛病,毛病是我把“检索”那格里藏着的两层给压扁了。
掰开应该是这样:
提问 ──► [切分层:文档怎么切块] ──► [检索层:块怎么被挑中] ──► prompt ──► 答案
那篇文章的两个翻车案例,正好一层踩一个。
第一个。问“家庭办公报销多少”,检索回来的块里压根没有金额——750 美元设立津贴、250 美元年度更新,那些数字全在隔壁块里躺着。模型拿到的证据本身残缺,它当然只能答一半。这不是幻觉,这是你把一张账单撕成两半,只递给它半张,然后怪它算不清账。
根子在切分。按段落切,标题和内容分了家,福利名目和福利金额不在一个块里。修法也不玄:按标题切,标题带着它下面的内容一起进块。完事。
第二个更有意思。问“90 天规则”,检索唰地回来四个块,分数都挺高——但它们来自四份不同的文档:一个讲试用期,一个讲 RRSP 匹配,一个讲费用提交,一个讲安全权限。四件事都叫“90 天”,你让模型猜你问的是哪个?
这种坑我自己撞见过类似的。当时我以为是 embedding 不行,还认真琢磨过要不要换模型。后来才明白:同一个词在不同语境里是不同的事,纯相似度搜索天生分不出来。修法是加元数据——存块的时候打个来源标签,查之前先把候选集过滤到员工手册,“90 天”就只剩一个意思了。还能再进一步:让一个小模型从问题里自动提取该用什么过滤器,再让大模型基于过滤后的结果回答。两层模型各干各的。
真正让我咔哒一下扣上的,是那个图。RAG 不是一个框,是切分和检索两层叠着。你骂模型,是因为你自己把它画成了一个框。
打个比方:RAG 像闭卷考试前,有人替你从课本里撕几页纸塞进考场。答案错了,你一直怪考生脑子不行——其实是撕纸的人撕错了页。要么撕了半页(切分层),要么把四本课本里同名的章节全撕进来还搅在一起(检索层)。
这个比喻有地方漏风,我老实标一下:撕纸的人不知道你要考什么,真实的检索至少还看了一眼问题。而且“撕纸”听着像一次性的,实际每问一次都得重撕一遍。大方向能用,抠细节回到机制。
还有一条我想单独拎出来讲,虽然它跟主线有点岔。那篇文章下面有评论指出:检索质量只是下限——检索器越好,错误答案可能反而显得越可信,所以光看检索不够,得单独量“答案是不是真基于检索回来的内容”,不忠实的答案宁可弃权。作者回说这是她后续要写的主题。我倒觉得这条比正文那堆技术还重要。检索修好了,模型更“有底气”,错了也更理直气壮。这一格我到现在也没完全画明白,先放在这里,懂了再补。
扯远了,拉回来。Chroma 那个结论也值得记一笔:切分方式对检索质量的影响,跟选哪个 embedding 模型是同一个量级的。我们挑 embedding 挑得死去活来,chunking 随手一个固定大小就交差——账算错了。
切分策略一堆——固定大小、递归、语义、父子——没有普适最优。检索侧那堆也是,混合搜索、重排序、HyDE、多跳,文章的建议是从简单往复杂加,一次只动一个变量,配二三十个测试问题量效果。这条朴素得容易被跳过,但它是唯一能告诉你“修复到底修没修上”的东西。不量的话,你只是在换着姿势祈祷。
所以下次 RAG 答错,先别骂模型。画张图,把中间那格掰成两层,看看证据是缺了还是混了。多半是证据的事。
这玩意儿真的太酷了——一张“撕纸撕错了页”的图,能省下你换三个模型的时间。下期想画开哪个?我手上候着的是“重排序到底在排什么”,你说了算。
