跳到主要内容
检索不是在一袋碎纸里捞——我重画了 RAG 那张图

检索不是在一袋碎纸里捞——我重画了 RAG 那张图

画唠
画唠

· 阅读约 4 分钟

RAG 被讲得最烂的一步就是检索,而且烂得出奇一致:一律画成“算相似度、取 top-k”。不是这一步有多难,是所有人都画得太懒了,我自己也在内。直到八月中 arXiv 上一篇做孟加拉语自动出题的论文,把我那张图摁着撕了。

先交代我错哪。第一版,也是网上到处都是的那版:

语料 ──切块──► 一堆 chunk ──embedding──► 提问,取最像的 k 个 ──► 塞给 LLM

顺理成章,demo 里也够用。我拿这版讲过好几回 RAG,没人提过异议——包括我自己。

论文叫 BengaliMCQ,八月十六那天挂出来的。干的事是拿孟加拉语教科书自动生成单选题,再做领域内的答案预测。低资源语言,LLM 在那儿本来就吃亏。但真正让我坐直的是检索那步:教科书没被切成一袋碎纸,而是建成了层次化的图。我读下来的理解是,教科书自己长的那副骨架,章、节、段落这种层次——全保留在图里,然后在图上用对比训练的方式训了个 GNN,只捞少量段落出来喂给 LLM。

我盯着这个设计看了半天。反应过来了。咔哒一下扣上了:我第一版丢的不是哪个模块,是一个前提,我默认“相关”等于“文本像”。

先别急着说“这不就是加了个目录嘛”。出题这个场景根本不吃 flat 那一套。打个比方:出一道考定义的题,定义在 3.2 节,最好的干扰项素材可能躺在 5.1 节的例子里,这两段话在 embedding 空间里八竿子打不着,但它们在目录上是亲戚。Flat 检索找的是“长得像的”,结构感知检索找的是“挂在同一个枝上的”。💡

重画:

第一版(我画的):
  [chunk][chunk][chunk][chunk] ……
   一袋碎纸,谁跟谁都平级,只比"像不像"

论文这版:
        章
       ╱  ╲
      节    节
     ╱ ╲   ╱ ╲
    段  段  段  段
   段落挂在树上,GNN 沿着结构找"哪几个枝值得摘"

再给个比喻:去图书馆找资料,没人趴在一大堆复印页上挨张看脸熟,你是先查索引、走到架、抽出一本,沿着结构走。Embedding 相似度是“脸熟”,图结构是“住址”。教科书能这么玩,是因为它的住址是作者亲手写好的。

这个比喻有两处漏风,得老实标出来。

一是教科书属于结构最干净的那种语料,目录是真的、骨架是真的。你要是换成论坛帖、聊天记录这种天生没脊柱的东西,“结构感知”立马瘸一半,没结构可感知。所以别急着把这套当万金油搬回自己的场景,先问一句:你的语料有脊柱吗。

二是这棵树也不是老实巴交的目录树。GNN 学的是图上的表示,对比训练教它的是“图上什么样的关系算相关”,所以它可能比目录还灵,目录只会说“这俩同节”,它也许能学到“跨章但讲同一个考点”。这是整套设计里我觉得最酷的地方。但代价是不白拿:得训练,得有正负样本对。顺带坦白,负样本在图上到底怎么采,我还没完全画明白,先放这儿,懂了再补。

还有一层是低资源语言本身,这层我想通了之后反而更兴奋。孟加拉语没有什么魔法,关键在于 LLM 对孟加拉语学术内容的参数记忆很薄:英语场景你检索拉了,模型还能靠肚里的存货兜一半;孟加拉语教科书的内容,模型肚子里基本没有,你捞回来什么,它就知道什么。检索在这儿不是锦上添花,是承重墙。所以论文里检索指标压过强 dense 基线、下游出题相关性和答案预测跟着涨,我一点不吃惊,这条因果链直得不像话,检索好一寸,下游好一截!

扯远了,“用 LLM 出题、再用 LLM 答题”这个自环本身就值得单独画一期,出的题自己都答不对,多半是题出歪了……算了,拉回来,那是另一张图的事。

把两次画 RAG 的账对一下:上次我补的是下游那格“模型判断信不信检索回来的东西”;这次是往上游走了一步,捞什么,在动手捞之前就分了高下。一头一尾,中间才是大家天天聊的 prompt。合起来,这张图才算齐。

照例留个自检:你能给一个没碰过 RAG 的人讲明白,为什么教科书场景里“最相关的段落”经常不是 embedding 最像的那几段吗?讲不动的地方丢给我,多半那儿我也还没画透。

我手里攒着两个候选:图上的负采样到底怎么采、embedding 量化是怎么回事。下期画哪个,你说了算。

画唠
画唠

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

查看主页 →