这道题其实问的是,当检索已经返回了相关文档,但生成结果还是不理想,本质是检索结果和生成需求之间没对齐。检索的相关性不等于对生成有用,这是个常见误区。具体来说,可能的原因有几种:信息过载,比如Top-K太多,噪声把信号淹没了;碎片化,多个文档各含一部分答案,模型缺乏整合能力;格式混乱,原始文档结构被破坏,表格、代码这些语义丢了;还有歧义冲突,检索结果互相矛盾,模型不知道怎么选。
那怎么优化呢?我分三个层面讲。先说提示工程,这是最快见效的。你可以做[[重排序]],用 [[Cross-Encoder]] 对检索结果二次排序,把高置信度的文档放前面。也可以做上下文压缩,比如用LLM提取关键片段,或者只保留跟问题相关的句子。还有结构化提示,明确标出 [Document 1] [Document 2],强制模型引用来源。另外加指令,比如“如果文档不足以回答,请明确说明”,这样能抑制 [[Hallucination]]。举个例子,客服退款场景里,用户问“退款到账时间”,检索回来一堆政策文档,但生成结果却说“3-5个工作日”,实际上不同支付方式时间不同。用重排序和压缩,把最相关的支付方式文档排前面,生成就准了。
再一个是上下文建模,这更偏架构层面。动态窗口分配,长文档用滑窗加层次摘要,短文档直接拼接。多文档融合,先让模型分别总结各文档,再综合生成,有点像Map-Reduce模式。还可以训练轻量分类器做噪声过滤,剔除低质量检索结果。这里有个坑:如果文档太多,上下文窗口塞满,模型注意力会分散,生成质量反而下降。所以我会特别关注窗口利用率,不是越多越好。
最后是模型微调,这是深度优化。做检索感知 [[SFT]],训练数据包含 (问题, 检索文档, 答案) 三元组,让模型学会“信文档而不是背知识”。还有负样本挖掘,故意混入不相关文档,训练模型识别和忽略噪声。另外可以做引用生成训练,强制输出 [cite:1] 格式,提升可验证性。但微调的前提是数据和算力充足,而且不能解决所有问题,比如底层检索质量太差,微调也救不了。
说到微调,我其实更倾向先做可控实验:固定检索结果,人工构造理想上下文,测试生成上限。如果上限还差,说明模型本身能力不够,需要微调;如果上限好,那优化提示和上下文工程空间还大。所以我会把[[RAG]]和微调看成互补,而不是二选一。比如企业SOP场景,文档更新频繁,RAG更灵活;但如果是垂直领域,比如法律合同,微调一个领域模型效果更好。真正落地常常是RAG加微调一起上。
总结一下,遇到检索相关但生成差,我会先诊断是信息过载、碎片化还是歧义,然后从提示工程快速试,不行再动上下文建模和微调。关键是要有系统思维,不能单点修复。