可审计定义Grounded Answer = 可验证主张被当前授权且有效的证据范围直接支持;“检索到了相关文档”只是必要条件之一。

先定义什么叫“有依据”

先把答案拆成可核验 Claim。每个涉及事实、数字、时间、政策或因果的 Claim 都应关联一个或多个证据片段与精确定位;证据要蕴含该 Claim,而不只是主题相同。模型基于产品介绍推断“支持所有地区”即使附上链接,也属于超出证据。

Grounding 契约还包含权限、新鲜度和完备性:被撤权的文档不能因为内容正确而被引用;旧政策要标记版本;多条件结论需要所有必要证据。KILT Benchmark 同时评估下游任务和 Provenance,说明“答案”和“证据来源”是两个关联但不同的结果。

看起来有引用,但仍不 Grounded 的反例
答案行为失败应有控制
段尾放一个主题相关 URL引用未对齐具体 ClaimClaim 级 Evidence ID 与范围
把两份冲突政策综合成确定结论隐藏冲突和时间展示差异、版本并升级处理
引用用户无权访问的内部文档答案可能泄露存在性与内容检索前 ACL + 引用时再校验
没有证据却用模型常识补齐Grounded 范围被参数知识越界拒答或明确区分非证据推断

检索、上下文、答案分层定位

端到端正确率下降时,按三层保存中间产物并独立评分。RAGAS 与 ARES 等研究同样把 Context Relevance、Faithfulness 与答案质量分开;自动 Judge 可以加速迭代,但不能替代关键样本人工标注和稳定性检查。

检索层

判断 Gold 文档/Chunk 是否进入候选。Recall@K 关注是否召回,MRR 关注首个相关结果位置,NDCG 处理多级相关性和排序。指标只在相关性标注与检索单位明确时有意义;Chunk 边界变化后 Gold 范围也需更新。

上下文层

检查送入模型的证据是否充分、去重、排序合理、无权限问题和未解释冲突。Retriever 可能召回正确文档,但 Context Builder 截断关键表头或只保留重复 Chunk。使用 Context Recall/Precision 与冲突覆盖标签定位。

生成层

在给定正确 Context 的条件下,判断答案正确、完整、忠实并与引用对齐。Faithfulness 关注答案是否只使用证据支持的内容;Answer Correctness 还可能需要参考答案或业务验证器。两者不能互换。

分层定位:同一个错误答案的修复点可能完全不同
Gold Evidence任务真正需要的来源与证据范围。
RetrievedRetriever 是否找到,排名是否足够高。
Assembled权限、去重、冲突、预算后模型实际看到什么。
Claim + Citation答案是否忠实、完整并精确对齐。

RAG 评测集必须包含真实失败面

从搜索日志、客服问题、事故与内容 Owner 访谈构建任务分布,再补充边界样本。至少覆盖可回答、部分可回答、不可回答,多跳、时效、权限、冲突来源、专有名词、长尾改写和错误前提。只用“问题—标准答案”不足以定位检索,应同时标注 Gold Evidence、允许的替代证据和不可引用来源。

Gold Evidence 可能不是唯一集合。标注者记录最小充分证据,并允许等价来源;多标注者分歧需要仲裁规则。数据切分按文档/时间隔离,防止同一来源的近重复 Chunk 同时进入调参与测试。

type RagCase = {
  id: string; query: string
  answerability: 'full' | 'partial' | 'none'
  goldEvidence: Array<{ sourceId: string; version: string; ranges: string[] }>
  forbiddenEvidence?: string[]
  expectedClaims?: string[]
  slice: Array<'multi-hop' | 'freshness' | 'permission' | 'conflict' | 'long-tail'>
}

type RagTrace = {
  caseId: string; pipelineVersion: string
  retrieved: string[]; assembled: string[]
  claims: Array<{ text: string; evidenceIds: string[] }>
  abstained: boolean
}

引用是可验证关系,不是装饰 URL

检索阶段给每个证据分配稳定 ID,保留源版本、页码/段落或字符范围。生成时要求 Claim 关联 ID,生成后由确定性代码检查:ID 是否存在、是否在当前 Context、用户是否仍有权限、源版本是否有效。语义蕴含仍可能需要 Judge 或人工抽查。

引用范围要足够小以便验证,又不能小到丢失限定条件。表格应引用包含列头的范围,政策应包含适用范围和版本。如果来源更新,历史答案保留当时版本用于审计,新请求重新检索。

不能让模型编 URL模型只选择系统提供的 Evidence ID;展示层由服务端解析真实链接与定位。这样可以消除格式正确但不存在的引用。

拒答能力需要单独评测

无答案样本验证系统是否会在没有充分证据时明确停止;部分可回答样本验证能否缩小范围,而不是全答或全拒。错误前提样本要求指出前提不成立。拒答不是一句固定文案,而是由证据覆盖、冲突、权限与新鲜度共同触发的策略。

阈值取决于业务损失:内部知识搜索可以容忍更多澄清,医疗/金融建议对无依据断言的成本更高。绘制覆盖率—错误率曲线,选择可接受点,并对高风险切片设置独立底线。模型自报置信度不能直接当校准,需要与真实错误率对照。

线上信号补充离线评测

观察无结果率、低分率、回退率、引用点击、用户纠正、同义重问、人工升级和任务后续状态。引用点击低可能是 UI 问题,也可能是答案无需核验,不能直接等同于低质量;任何线上代理指标都要通过人工样本建立解释。

敏感文档越权召回、已删除内容命中和引用指向错误租户属于安全事件,不应只进入搜索质量看板。知识更新后监控答案漂移,按源、解析器、Embedding、Retriever、Prompt、模型版本切片定位。

把 Grounding 变成发布门禁

每次实验记录数据快照、Parser/Chunker/Embedding/Index、Retriever/Reranker、Context Builder、Prompt 和模型版本。总体指标之外,对权限、无答案、关键政策、长尾 ID 和多跳切片设置不可退化底线;平均提升不能抵消安全回归。

发布、观测与回滚的证据
门禁通过条件示例失败定位回滚单元
数据面解析/ACL/新鲜度切片无回归源、Parser、Chunk、索引索引 Alias/数据版本
检索面Recall/NDCG 与延迟达标Query、Retriever、Reranker策略配置
答案面Faithfulness、引用、拒答达标Context、Prompt、模型Prompt/模型版本
安全面越权样本零容忍作用域、ACL、缓存、Trace阻断流量并撤回索引

上线采用 Canary,保留旧索引和策略的快速切换。事故 Runbook 明确:冻结新索引、切回已知版本、清理缓存、重放失败 Trace、通知内容与安全 Owner。代码回滚不一定能回滚已重建的数据面。

主动提取:检索 Recall 很高,为什么答案仍可能不 Grounded?
Gold 证据可能在组装时被截断、被重复噪声挤出;模型可能忽略或误读证据,也可能添加证据之外的主张。必须分开检查 Retrieved、Assembled 和 Claim—Citation。
判断题:引用存在且用户可访问,就能证明 Claim 正确吗?
不能。还需验证引用范围直接支持 Claim、版本适用且证据充分。主题相关、部分支持或冲突未处理都不满足 Grounding。
阈值变化:业务从内部搜索变为高风险合规建议,拒答策略应如何变化?
降低无依据断言容忍度,对关键切片设置更严格的最小证据和冲突处理;接受更高澄清/人工升级率,并用覆盖率—错误率曲线和实际损失选择阈值,而非复用统一分数。
架构证据:如何证明一次 RAG 发布可定位、可回滚?
保存全链路版本和中间 Trace;设总体与关键切片门禁;索引/策略/Prompt/模型可独立切换;Canary 和事故 Runbook 已演练;回滚后重放同一 Eval Case 能恢复。

资料与事实边界

以下以官方文档、标准、论文和原始工程资料为主。厂商 API、价格、限额与模型能力会变化,落地时仍需按目标版本做能力探测和回归。

  1. Petroni et al.:KILT — 知识密集型任务同时评估下游结果与 Provenance 的基准
  2. Es et al.:RAGAS — Context、Faithfulness 与答案相关性的分层自动评测框架
  3. Saad-Falcon et al.:ARES — Context Relevance、Answer Faithfulness、Answer Relevance 及少量人工标注校准
  4. OpenAI:Evaluation best practices — 任务化数据集、指标、持续评测与 Judge 的当前工程建议
  5. NIST:Artificial Intelligence Risk Management Framework — 风险、治理、度量和持续管理的参考框架