这道题我觉得本质是在问:当参考上下文本身有错时,怎么保证模型不跟着错,甚至能主动纠正。换句话说,[[RAG]]系统不能只依赖检索质量,还得有容错和纠错能力。
我一般会从四个层面搭一个分层防御体系,但根据场景不同,侧重点会差很多。先说输入层,也就是检索结果的质量过滤。这里我会用 [[Cross-Encoder]] 做二次 [[Rerank]],把相关性不够的片段直接过滤掉。同时加上时效性校验,比如知识库里文档有更新时间,就优先用最新的。还有一个容易忽略的点是来源可信度加权,比如官方文档、论文权重高,用户UGC内容降权。这些在金融、医疗场景特别重要,但如果是客服闲聊,就没必要这么严格。
接下来是推理层,约束模型行为。一个很实用的做法是引用锚定,强制模型在生成时标注信息来源,比如“根据[文档A]……”,这样方便追溯。另外我还会在 [[System Prompt]] 里显式要求模型识别上下文中的冲突信息并报告,这叫矛盾检测提示。再配合置信度阈值,如果模型对输出不确定,就让它说“我不知道”或者请求人工确认。这里有个坑:如果阈值设得太高,很多正确回答也被过滤了,所以得根据业务容忍度调。
输出层做后验校验也很关键。比如对生成内容里的数字、日期、人名,用独立模型或规则库做事实性验证。还有一个技巧是一致性投票,同一个问题多次采样,取高频答案;如果结果很离散,就标记不确定。这有点像 [[Self-Consistency]] 的思路,但用在RAG里要控制采样次数,不然延迟太高。
最后是系统层的持续迭代。用户反馈闭环肯定要做,点赞点踩数据回流到知识库修正队列。另外我会用 A/B 测试监控事实性错误率,对比不同检索策略的效果。但说句实话,这些策略都有代价,严格校验会增加延迟和成本,所以一定要按场景分级。比如客服闲聊可以宽松点,但医疗诊断、法律文书就必须多重校验。
这里有个我特别想展开的点:我最近在关注 [[Self-RAG]] 的方向,就是让模型自己判断检索结果是否相关、是否准确,甚至决定要不要重新检索。这个思路跟分层防御结合,可能会更灵活,但实现起来对模型能力要求很高,而且推理成本会明显上升。
所以总的来说,我更倾向把这个问题看成工程和产品的平衡,不是单纯的技术方案。关键是根据业务场景选对策略组合,并且持续监控和迭代。