|
|
这两年做 RAG 的朋友越来越多,但我常听到一个误区:把“高召回率”和“低幻觉”简单对立,好像只能二选一。真到工程落地,你会发现它们并不是硬对冲,关键在于你把召回的“量”和“质”、以及生成阶段的“约束”怎么配合起来。
先说召回率。RAG 的第一性原则是“别让模型瞎编,而是把证据喂给它”。证据找不全,答案必然不稳,特别是多跳推理、跨段合成的场景。提升召回率的手段很多:BM25+向量双路召回、查询重写(Q2Q)、长文分块的语义重叠、跨域检索路由、以及多样性采样(MMR)。但高召回往往带来噪声上升:无关段落、时效冲突、版本不一致。这时如果直接把一大坨文档丢给生成模型,不是幻觉,就是答非所问。
所以问题不在“召回高不高”,而在“召回后怎么控质”。实践里我更看重三个层面的抑制机制。第一层是检索后重排:用交叉编码器/小型 reranker 精排 Top-k,把相似但冗余的段落去重,并优先含有答案实体、数字、定义句的片段。第二层是证据压缩:别把整段贴进去,做句级抽取或压缩摘要,让上下文密度更高;越密集的证据,对生成阶段的约束越强。第三层是冲突检测:简单的启发式就有效,比如同一问题涉及时间/口径冲突时,打分靠后的段落降权或标注为“可能冲突”,在提示词里要求模型明确来源与不确定性。
幻觉抑制还要落到提示与解码。很多团队只写一句“请基于提供的文档回答”,远远不够。更有效的是结构化约束:要求模型逐条列出引用片段的编号,再给出结论;若无依据,必须返回“未找到”并建议进一步检索。配合答案验证器(可用一个小模型或规则)检查是否出现超出证据的实体与数字,一旦命中就触发二次检索或拒答。解码上,温度降到接近 0、惩罚生成新实体名词、限制长度,都是简单但有效的“刹车”。
一个容易忽视的细节是分块策略和查询重写的交互。块太小会漏掉跨句依赖,块太大又稀释信噪比。实测里,按语义边界分块并加入10-20%的重叠,配合“问题拆分—子询问检索—合并生成”的链式流程,能同时拉高召回和降低幻觉。查询重写也别只做“同义改写”,更要做“意图展开”和“列举关键实体”,提升召回的覆盖度与可判别性。
评价体系决定你会优化成什么样。单看召回率(Recall@k)不够,至少加上:有依据回答率(答案包含可核引文的比例)、无依据拒答率(当无证据时能否拒绝)、冲突敏感度(面对相互矛盾证据时能否标注不确定)。离线评测之外,线上还需监控引用点击一致性和事后抽检的事实正确率。很多团队的“幻觉问题”其实是评测指标不牵引导致的。
最后说取舍。对强时效、强合规的领域(医疗、法务、投研),我倾向于“宁缺毋滥”的策略:适度牺牲召回率,配高强度的证据约束与拒答机制,确保每个结论都可追溯。对探索式问答或创意辅助,可以接受更高的召回与更松的生成,让系统提出多个可选结论,并明确标注“基于相似资料的推断”。换句话说,不是召回和幻觉的对立,而是“检索—重排—压缩—生成—验证”这一条流水线的协同。把每一段拧紧,RAG 才能既找得到、又说得对。 |
|