这道题其实是在问,当我们想让大模型用外部知识时,到底应该把检索当成一个独立的前置步骤,还是把它融到模型内部去。传统做法是先检索再生成,检索和生成是两条独立的流水线,中间就靠硬拼文档进去。而[[RAG]]的核心变化是把检索从预处理变成了模型内部的一个运算步骤,检索出来的向量通过注意力机制软融合到生成过程中。你可以这么理解,传统做法是先把一堆材料扔给模型让它自己看,RAG是让模型在写答案的时候随时能翻书,而且翻哪页是由模型自己决定的。
具体到信息融合机制,传统方法就是把检索到的Top-K文档直接拼到输入前面,简单粗暴,但问题也很明显,上下文太长,文档之间互相干扰,模型很难区分哪些信息重要。RAG有三种融合方式:早期融合、中间融合和生成式检索。早期融合最常用,像FiD那样,把检索到的每个文档单独编码,然后和问题一起做注意力计算;中间融合更灵活,像kNN-LM,模型在生成每一步都能动态去检索;生成式检索更激进,直接让模型生成文档ID。实际落地时,早期融合最成熟,对工程改动最小,效果也稳。
再说效果。RAG最大的优势就是显著降低[[幻觉]],因为生成的内容有据可查。比如电商客服场景,用户问“满200减50的活动今天还有吗”,传统模型可能瞎编,但RAG能实时查活动规则库,给出准确回答。但这里有个坑,如果检索到的文档本身是错的,模型也会被带偏,这叫检索噪声污染。所以上线前一定要做知识库质量审核,常见失败场景就是知识库里混了过期或错误的信息。另一个挑战是延迟,检索会增加首token时间,尤其知识库大的时候,不满足实时性需求。我的做法是缓存高频query的检索结果,或者用[[Hybrid Search]]先粗筛再精排。
从架构演进角度看,RAG的本质是把知识从模型参数里搬到了外部存储。传统LLM知识固化在参数里,更新一次就要全量微调,成本极高。RAG让模型能力保持稳定,知识动态更新,这对电商这种有千万级SKU、价格分钟级变动的场景特别关键。说白了,RAG实现了模型能力和知识存储的解耦。
不过这里有一个值得深入的点:当检索到的知识和模型参数里记住的知识冲突时,RAG其实缺乏显式的消解机制。比如模型参数里记得某个产品是199元,但知识库里刚更新成179元,模型该信谁?这其实涉及[[Faithfulness]]和[[Corrective RAG]]的方向。
所以总的来说,我不会把RAG和传统流程看成非此即彼的选择,真正落地往往是混合的。对实时性要求高、知识稳定的场景,传统预检索加缓存可能更优;对知识变化快、需要溯源的高价值场景,RAG才是首选。我更倾向把RAG看作一个可插拔的知识模块,根据业务场景灵活配置。