先定义什么叫“有依据”
先把答案拆成可核验 Claim。每个涉及事实、数字、时间、政策或因果的 Claim 都应关联一个或多个证据片段与精确定位;证据要蕴含该 Claim,而不只是主题相同。模型基于产品介绍推断“支持所有地区”即使附上链接,也属于超出证据。
Grounding 契约还包含权限、新鲜度和完备性:被撤权的文档不能因为内容正确而被引用;旧政策要标记版本;多条件结论需要所有必要证据。KILT Benchmark 同时评估下游任务和 Provenance,说明“答案”和“证据来源”是两个关联但不同的结果。
| 答案行为 | 失败 | 应有控制 |
|---|---|---|
| 段尾放一个主题相关 URL | 引用未对齐具体 Claim | Claim 级 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 还可能需要参考答案或业务验证器。两者不能互换。
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 或人工抽查。
引用范围要足够小以便验证,又不能小到丢失限定条件。表格应引用包含列头的范围,政策应包含适用范围和版本。如果来源更新,历史答案保留当时版本用于审计,新请求重新检索。
拒答能力需要单独评测
无答案样本验证系统是否会在没有充分证据时明确停止;部分可回答样本验证能否缩小范围,而不是全答或全拒。错误前提样本要求指出前提不成立。拒答不是一句固定文案,而是由证据覆盖、冲突、权限与新鲜度共同触发的策略。
阈值取决于业务损失:内部知识搜索可以容忍更多澄清,医疗/金融建议对无依据断言的成本更高。绘制覆盖率—错误率曲线,选择可接受点,并对高风险切片设置独立底线。模型自报置信度不能直接当校准,需要与真实错误率对照。
线上信号补充离线评测
观察无结果率、低分率、回退率、引用点击、用户纠正、同义重问、人工升级和任务后续状态。引用点击低可能是 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?
判断题:引用存在且用户可访问,就能证明 Claim 正确吗?
阈值变化:业务从内部搜索变为高风险合规建议,拒答策略应如何变化?
架构证据:如何证明一次 RAG 发布可定位、可回滚?
资料与事实边界
以下以官方文档、标准、论文和原始工程资料为主。厂商 API、价格、限额与模型能力会变化,落地时仍需按目标版本做能力探测和回归。
- Petroni et al.:KILT — 知识密集型任务同时评估下游结果与 Provenance 的基准
- Es et al.:RAGAS — Context、Faithfulness 与答案相关性的分层自动评测框架
- Saad-Falcon et al.:ARES — Context Relevance、Answer Faithfulness、Answer Relevance 及少量人工标注校准
- OpenAI:Evaluation best practices — 任务化数据集、指标、持续评测与 Judge 的当前工程建议
- NIST:Artificial Intelligence Risk Management Framework — 风险、治理、度量和持续管理的参考框架