RAG 如何判断“资料中没有答案”?
简化版
不能只用最高向量相似度判断无答案,因为“主题相关”不等于“证据可回答”。应组合检索覆盖、reranker/entailment 支持度、答案 claim 的引用校验和业务规则,训练或提示模型输出明确的 insufficient_evidence。阈值在有答案/无答案混合集上校准,并同时控制乱答率与过度拒答率。
详细版
流程先判断查询是否可检索及过滤是否合理,再对 Top-k 做 answerability 评分:是否包含所需实体、关系、时间和完整条件。生成后把答案拆成 claims,若关键 claim 无证据蕴含就拒答或只回答可支持部分。多条弱相关证据不能通过“投票”变成强证据。
评测构造三类负例:库中完全无主题、主题相关但缺答案、存在旧/冲突资料无法确定;同时保留邻近可回答正例。用 selective accuracy、coverage、无答案 Recall、误拒率和 risk-coverage 曲线选阈值。高风险领域宁可低 coverage,普通客服则可请求澄清或转人工。
检索 -> 可回答性验证 -> 生成候选 -> Claim支持校验
| |
不足--------------> insufficient_evidence / 部分回答
完整版教学
一、无答案不是“检索分低”
文档可能与问题高度相关,却没有所问字段。问“保修是否包含电池”,召回保修概览,全文没有电池条款;向量分数很高,答案仍未知。相反,精确编号文档语义分数不高,却直接包含答案。
因此相似度只能做一个特征。真正要判断的是证据是否蕴含回答所需的主张,即 answerability,而不是 topical relevance。
二、无答案有不同类型
完全无主题时可直接提示资料库不覆盖;主题相关但字段缺失需要说明缺什么;多份资料冲突则是不确定;权限过滤导致不可见时不能透露存在性,只能返回无权限/无法访问。不同状态需要不同产品动作。
| 类型 | 表现 | 建议输出 |
|---|---|---|
| 库外问题 | 无相关文档 | 不覆盖该主题 |
| 证据缺字段 | 有相关文档但不可回答 | 缺少具体信息 |
| 证据冲突 | 多版本无法判定 | 列冲突并升级 |
| 权限不足 | 可能有但不可见 | denied,不泄露细节 |
| 问题含糊 | 多种解释 | 请求澄清 |
记忆钩子:RAG 的拒答不是“我不会”,而是“在当前权限和证据中,无法证明这个结论”。
三、检索侧有哪些信号
可用最高/均值 rerank 分、Top1 与 Top2 margin、结果来源多样性、实体匹配和关键槽位覆盖。绝对阈值会随模型和领域变化,必须校准。多个近重复弱结果不应被数量误导,可先按文档簇去重。
features = [top_score, score_margin, entity_coverage,
required_slot_coverage, source_authority]
轻量分类器或规则将这些特征转为 answerability 候选,但最终还要看生成 claim 的支持性。
四、生成前如何验证证据充分
将问题拆成必须回答的槽位或子问题,例如“谁、在何时、允许什么条件”。对候选证据做 entailment/QA 验证,确认每个关键槽位有直接 span。表格和多跳问题可能需要组合多个片段,验证器应允许可解释的证据链。
若只找到退款期限,却没有适用品类,可以回答“期限是 14 天”但不能断言某商品一定适用。支持部分回答时输出 partial 和 missing_fields,调用方决定是否接受。
五、生成后 Claim 校验为何必要
即使生成前证据看似充分,模型仍可能添加未支持修饰词或数字。把答案拆成原子 claims,逐条与引用片段判断 entailed/contradicted/not_found。关键 claim 有一个 not_found,就重写、删除或整体拒答。
例如答案有 4 个事实,3 个直接支持,1 个是模型推断。若该推断不影响主答案,可标注“推测”;若它是金额或资格结论,则必须拒答。规则由风险等级定义,不用一个统一平均支持率。
六、阈值如何校准
准备有答案与无答案混合验证集,覆盖邻近边界。扫描阈值 τ,计算 coverage(系统愿意回答的比例)和 selective accuracy(已回答部分准确率)。提高 τ 通常降低 coverage、提高准确率,形成 risk-coverage 曲线。
假设 τ=0.5 时回答 90% 请求,已答准确 85%;τ=0.8 时回答 60%,准确 97%。医疗或财务可能选择后者,普通知识助手可选择中间并提供澄清。阈值需按语言、任务和版本分别校准。
七、怎样构造真正困难的负例
随机放完全无关文档太容易,模型学会看关键词。Hard negative 应与主题高度相关但缺关键关系,或把正确答案替换为不同时间/产品版本。还要加入问题前提错误、证据冲突和只有部分答案的样本。
对每个可回答题可生成反事实负例:删除唯一答案句,保留其他上下文;或把关键实体换成同类实体。这样测试模型是否真的依赖证据,而不是凭领域常识猜。
八、常见误区与追问
- 误区:Top1 相似度低于 0.7 就无答案。 分数跨模型/领域不可比,且相关性不等于可回答性。
- 误区:召回多篇相关资料就应该回答。 多条弱证据不会自动蕴含缺失事实。
- 误区:提高拒答率就更安全。 过度拒答会伤可用性,要看 risk-coverage。
- 追问:无答案时输出什么? 稳定状态码、已确认部分、缺失字段和下一步,不要编造空泛解释。
- 追问:如何区分无答案与检索失败? 用 oracle 真值证据实验;库中有真值但未召回属于检索失败。
- 追问:冲突资料算有答案吗? 若无法按权威/时间解决,应标不确定而非选择一个。
九、加强记忆
无答案检测可记成“相关不等于可答,分数不等于证据”。先验证问题所需槽位是否被候选覆盖,再校验生成 claims 与引用的蕴含关系;用困难负例和 risk-coverage 曲线按风险选阈值。让 insufficient_evidence、partial 和澄清成为正式输出,系统才有能力诚实停下。