返回 AI 测试工程师强化支线
Phase 02 / AI Application Quality 01

RAG 知识库测试实战教程

从“回答像不像”走向可量化、可复现的检索与生成评估:让每条答案都能追到正确、当前且有权限的证据。

10 个章节Recall@K + Precision@K污染、权限与版本门禁
01

先把 RAG 拆成可观测的质量链路

贯穿案例

案例:企业售后知识助手

助手只允许根据已发布的产品手册、退款规则和维修公告回答员工问题。问题“耳机在签收 8 天后出现质量问题,能否退款?”需要先检索到退款时限与质量问题例外条款,再给出带文档版本和段落引用的答复。

RAG 测试闭环

问题集真实问法与权限
检索候选 Chunk 与分数
重排Top K 证据
生成回答与引用
裁决指标、人工复核、发布

分层测试对象

层级验证内容典型失败
数据层来源、解析、切分、元数据旧文档混入、表格解析丢行
检索层候选召回、排序与过滤正确证据未进 Top K
生成层答案是否被证据支持答案合理但引用不支持
治理层权限、版本、审计与回退跨租户召回、版本漂移不可追踪
回答“看起来正确”不能证明 RAG 正确。必须同时保留 query、候选文档、排序分数、最终上下文、引用和知识版本,才能区分检索失败与生成失败。
02

建立能算指标的检索评估集

先定义相关证据

评估集分层

样本类型例子测试目的
事实定位退款期限是多少验证单段精确检索
多跳组合过保但在召回批次内如何处理验证跨文档组合
同义改写八天了能退耳机吗验证口语与术语差异
不可回答竞争对手保修政策是什么验证拒答而非补全
冲突版本旧规则 7 天、新规则 15 天验证版本优先级
权限隔离普通员工询问内部风控手册验证检索前授权

可执行构建步骤

  1. 从搜索日志、客服工单、规则文档和历史缺陷抽取问题,先脱敏。
  2. 为每题标注 relevant_doc_ids、relevant_chunk_ids、不可接受答案和权限角色。
  3. 由业务专家与测试人员双人标注;分歧进入裁决记录。
  4. 划分调优集、锁定回归集和挑战集,禁止用锁定集调 Chunk 或 Prompt。
  5. 保存 dataset_version、knowledge_version、标注人和生效日期。
一条 RAG 金标样本
{
  "case_id": "REFUND-028",
  "query": "签收8天的耳机质量故障能退款吗?",
  "actor_role": "support_agent",
  "relevant_chunk_ids": ["refund-v3#quality-exception"],
  "must_cover": ["质量问题例外", "检测流程"],
  "must_not_claim": ["无条件立即退款"],
  "answerable": true,
  "knowledge_version": "2026-08-01"
}
03

用 Recall@K 与 Precision@K 诊断检索

召回和噪声分开看
单个问题的定义
Recall@K = Top K 中相关 Chunk 数 / 该问题全部相关 Chunk 数
Precision@K = Top K 中相关 Chunk 数 / K

# 例:金标有 2 个相关 Chunk,Top 5 找到其中 2 个
Recall@5 = 2 / 2 = 1.00
Precision@5 = 2 / 5 = 0.40

指标解释

现象可能原因下一步
Recall@K 低同义词、切分或过滤遗漏检查漏召证据与查询改写
Recall 高、Precision 低Chunk 太碎、K 过大或语义相近噪声调重排、元数据过滤与 K
离线指标高、回答仍错生成未使用证据或引用映射错误做忠实度与引用校验
总体高、关键场景低平均数掩盖权限/版本/表格子类按风险标签分桶

统计口径

  • 同时报告 Macro 平均与各风险分层,不只给一个总体均值。
  • 无相关证据的不可回答题不参与普通 Recall 分母,应单算正确拒答率和误召率。
  • 相关性判断以金标证据为准;若相关证据不完备,先修评估集而不是追求虚高指标。
  • K 必须随报告展示,Recall@5 和 Recall@20 不可直接混为同一基线。
04

把 Chunk 策略当成可实验的配置

切分影响证据完整性

Chunk 实验矩阵

策略优点主要风险适用内容
固定长度 + overlap简单稳定、易批处理标题与条款可能被切断连续说明文本
按标题/段落切分语义边界清楚超长章节或短碎片Markdown、制度手册
表格整块或行组保留表头关系块过大、字段噪声多价格表、参数表
父子 Chunk小块召回、父块补上下文索引和引用映射更复杂长文档与多层章节
语义切分主题转折更自然稳定性和成本需验证混合叙述文档

可重复的 A/B 步骤

  1. 固定同一评估集、Embedding、重排器和 K,只改变 Chunk 配置。
  2. 记录 size、overlap、separator、父子关系和解析器版本。
  3. 比较 Recall@K、Precision@K、引用完整率、延迟与索引成本。
  4. 抽查漏召题:证据是否被切断、标题是否丢失、表格是否失去表头。
  5. 只在关键风险不退化且成本可接受时升级索引版本。
Overlap 不是越大越好。重复片段可能占满 Top K,让表面 Recall 不变却挤掉另一条必要证据;因此要同时看去重后的证据覆盖。
05

分别检测幻觉、忠实度与引用正确性

答案和证据逐句对齐

生成质量矩阵

指标判定问题失败例子
答案正确性结论是否符合金标业务规则把质量问题例外说成无条件退款
Faithfulness/忠实度每个可验证主张是否由上下文支持上下文没有到账时限却声称 24 小时
引用正确率引用段落是否真的支撑对应主张引用售后地址来证明退款期限
引用完整率关键主张是否都有证据结论正确但质量例外无引用
正确拒答率证据不足时是否停止并说明缺口查不到仍凭常识回答
逐句证据裁决 JSON
{
  "claim": "质量问题可在检测通过后进入退款流程",
  "citation": "refund-v3#quality-exception",
  "verdict": "SUPPORTED",
  "reason": "引用同时包含质量例外与检测前置条件",
  "review_required": false
}

测试动作

  • 把回答拆成原子主张,逐条判定 SUPPORTED、CONTRADICTED 或 NOT_IN_CONTEXT。
  • 引用 ID 必须能回到原文、页码或段落,不能只显示一个看似权威的文件名。
  • 对 P0 规则使用确定性规则或人工金标复核,不把另一个模型的评分当最终真相。
  • 证据冲突、缺失或低置信时,合格行为是明确不确定并转人工。
06

用数据污染测试保护知识入口

错误知识会稳定地产生错答

污染类型与检测

污染类型安全测试样本应观察
重复与近重复同一公告多个副本Top K 是否被单一来源占满
过期文档保留已废止退款规则是否按生效时间过滤
解析污染表格错列、页眉混入正文字段关系和引用定位是否失真
标签错误内部文档标成公开权限过滤是否在检索前生效
内容投毒沙箱文档含 [UNTRUSTED_INSTRUCTION] 占位符系统是否把文档仅视为数据
评估污染锁定题答案进入提示词或索引离线高分是否来自泄漏

安全处理流程

  1. 所有导入源建立 allowlist、来源签名或审批记录,未知来源进入隔离区。
  2. 解析后做 Schema、重复、时间、权限标签与敏感信息扫描。
  3. 使用隔离索引运行回归,禁止直接覆盖线上索引。
  4. 对异常召回查看 source_id 与 ingestion_run_id,定位污染批次。
  5. 验证通过后原子切换索引别名;失败时回退到上一只读版本。
本文只用无害占位符验证“文档中的指令不会控制系统”。不要把真实攻击载荷、客户数据或生产凭据放入测试集。
07

权限过滤与知识版本必须成为硬门禁

先授权再检索

治理测试矩阵

维度用例发布要求
横向隔离租户 A 用户询问租户 B 已知术语候选列表中也不得出现 B 的 Chunk
纵向权限普通员工询问管理层制度检索前过滤,拒答不泄露标题
文档生效期新旧规则同时存在只引用当前生效版本或明确冲突
删除传播撤回文档后查询其独特短语索引、缓存和引用页均不可命中
版本可复现重放历史 run_id能定位模型、Prompt、索引和数据集版本
回退新索引关键指标退化一键恢复上一已批准别名
最小检索审计字段
request_id, actor_id_hash, tenant_id, role
query_hash, filter_expression, retrieved_chunk_ids
document_versions, index_version, embedding_version
prompt_version, model_version, decision, reviewer
权限控制不能依赖“模型会拒答”。未经授权的内容不应进入候选集合和生成上下文;日志也应脱敏并按最小权限开放。
08

把评估做成可重放的流水线

先测检索再测回答
评估伪代码
for sample in locked_dataset:
    result = rag.query(sample.query, role=sample.actor_role)
    recall = relevant(result.top_k, sample.gold) / len(sample.gold)
    precision = relevant(result.top_k, sample.gold) / result.k
    claims = split_into_atomic_claims(result.answer)
    faithfulness = judge_against_context(claims, result.context)
    assert_no_unauthorized_chunks(result.top_k, sample.actor_role)
    save(sample.id, recall, precision, faithfulness,
         result.latency_ms, result.versions)

自动化测试矩阵

阶段自动检查人工抽查
入库Schema、重复、版本、权限标签复杂表格与废止关系
检索Recall@K、Precision@K、越权命中相关性争议和多跳完整性
生成引用存在、格式、禁答规则主张忠实度与业务正确性
运行P95、错误率、成本、缓存隔离退化样本和用户影响
变更候选与基线差量P0 变化和阈值例外
09

按根因分类失败并回流

不要只改 Prompt

失败分类

代码含义主要负责人/动作
DATA_PARSE原文解析或元数据错误数据工程:修解析器并重建索引
CHUNK_BOUNDARY关键证据被切断RAG 工程:调整切分实验
RETRIEVAL_MISS相关证据未进入 Top K检索:改查询、Embedding 或过滤
RANKING_NOISE噪声挤占排序重排:调模型、K 或去重
UNFAITHFUL回答超出上下文生成:收紧证据约束与拒答
CITATION_MISMATCH引用与主张不对应应用:修引用映射和逐句校验
ACCESS_BREACH未授权内容进入候选安全:立即阻断、审计与处置
VERSION_DRIFT变更不可复现或指标退化平台:锁版本并回退

人工审核与回流

  • P0 权限、隐私、资金规则和证据冲突必须人工裁决。
  • 审核记录接受、修改、拒绝、待确认及 reason_code,不只保存最终答案。
  • 稳定复现的失败加入挑战集;新业务规则先更新金标,再改系统。
  • 若标注者长期分歧,修订相关性/忠实度口径,而不是平均掉争议。
10

设置分层发布门并完成实战

可发布、可回退、可审计

发布门示例

门禁示例阈值阻断条件
关键检索P0 Recall@5 = 100%任何 P0 漏召
检索噪声总体 Precision@5 不低于已批准基线显著退化且无收益
证据忠实度P0 主张全部有支持引用出现矛盾或无证据断言
拒答与权限未授权召回为 0;不可回答题符合基线候选泄露或伪造答案
性能P95 延迟和单问成本在预算内超预算且无安全降级
可回退索引、Prompt、模型版本可定位无法恢复上一版本
表中阈值是售后案例的示例,不是通用行业标准。团队应结合风险、样本量、人工兜底能力和线上损失设定自己的基线。

练习:完成一次 Chunk 与检索版本发布

  1. 建立至少 30 条分层样本,包含多跳、不可回答、冲突版本与权限用例。
  2. 为每题标注相关 Chunk、关键主张、禁答项和角色。
  3. 对两种 Chunk 策略运行 Recall@5、Precision@5 和去重证据覆盖。
  4. 逐句评估引用忠实度,复核所有 P0 与差异样本。
  5. 注入无害的过期、重复、错标签与占位符污染,验证隔离和审计。
  6. 形成候选/基线差量报告,执行灰度、监控和回退演练。

评估资产

  • 金标可追溯
  • 回归集锁定
  • 指标分层
  • 失败可回流

安全治理

  • 检索前授权
  • 污染先隔离
  • 日志已脱敏
  • P0 必须人审

发布交付

  • 版本可复现
  • 门禁已审批
  • 灰度可观测
  • 回退已演练