这道题问的是,当[[RAG]]系统召回了一堆乱七八糟的东西,怎么保证生成质量不掉。说白了就是两条防线,一条是检索阶段把输入搞干净,另一条是生成阶段让模型自己学会抗干扰。
先说检索阶段怎么净化。核心思路不是把召回量做上去,而是把质量提上来。最直接的方法是加一层 [[重排]],用 [[Cross-Encoder]] 把召回的候选文档逐对打分,过滤掉那些低相关的。这招效果很稳,但计算成本高,一般只对 top 几十的候选做,不会全量做。还有一种做法是上下文压缩,用个小模型或者 LLM 对长文档做摘要,减少噪声信息占比。举个例子,企业 SOP 合规场景,文档里可能夹杂了历史版本说明和废弃流程,压缩之后只保留当前有效条款,生成准确率明显提升。
再一个,我比较推荐搞 [[混合检索]],就是向量检索加 [[BM25]] 关键词检索,甚至接[[知识图谱]],多路召回之后做加权融合。这样能避免单一检索方式被噪声带偏。比如向量检索容易把语义相近但实际无关的文档召回来,关键词检索反而能纠正。但这里有个坑:融合策略不是简单的取交集或求平均,得根据场景调权重。比如小红书那种 UGC 内容,噪声类型很复杂,标题党、软广、过时笔记都有,我可能还会加时效性过滤和作者权威性评分,把低质量笔记压下去。
说完检索,再讲生成阶段怎么增强抗噪。其实更关键的是让模型学会“选择性忽略”。一种做法是置信度引导生成,让模型输出时附带引用来源和相关性评分,低置信度的直接降权或者拒绝回答。比如客服退款场景,如果检索到的政策文档里有一条和当前问题明显矛盾,模型应该优先采信高置信度的那几条,而不是硬凑答案。另一种是训练层面的,用 反事实训练 在 [[SFT]] 阶段注入噪声文档,让模型学会看到不相关内容时主动忽略。这招效果很好,但前提是你得有足够的噪声样本,而且噪声分布要和线上一致,否则模型学偏了反而坏事。
其实还有个方向我最近比较关注,就是让模型自己判断是否需要检索、是否信任检索结果,比如 [[Self-RAG]] 和 [[Corrective RAG]]。这类方案让生成过程更灵活,但代价是推理链路变长,延迟和成本得权衡。如果面试官感兴趣,我可以展开说说。
最后说落地风险。这些方法不是堆上去就有效,得看场景。比如重排对延迟敏感的应用就不太友好,可能得用 [[ColBERT]] 这种兼顾效率和精度的方案。反事实训练如果噪声分布和线上不一致,效果会大打折扣。我的判断是,先把检索阶段的净化做扎实,比如重排加混合检索,这步收益最稳,再根据线上 badcase 决定是否上生成阶段的抗噪手段。说白了,RAG 的鲁棒性不是靠一个模块解决的,而是整个链路一起调优。