AI 面试知识体系

011:RAG 评测数据生产速查卡

**📎 内容来源**:本小节为豆包对话整理(2026-09-11)。用户口述概念 "golden site / hard site / corner site"

📑 目录

1 生产日志 → 评测样本:清洗四步法

Step 1 基础清洗(规则) → Step 2 规范化(语义) → Step 3 三级去重 → Step 4 抽样标注
步骤 关键动作 常用技术
1 基础清洗 Unicode NFC、全角→半角、去 emoji/HTML/符号 标准库正则
隐私脱敏(手机号/身份证/邮箱/URL → [PHONE] 占位符) 正则替换
过滤乱码/超短/纯标点/机器人探针 乱码率阈值
2 规范化 空白折叠、拉丁小写、拼写纠错 规则+词典
别名/简称归一("企微"→"企业微信",带部门/时间范围) 别名表
意图模板化("怎么退货/如何退货"→ <return_how>) 正则/轻量 LLM
原文+规范双份保留(防改写变意图) —
3 三级去重 见下表 —
session/时间窗去重(同 user+session 5~10 分钟重复只留 1 条) —
4 抽样标注 按意图分层抽样 Top-N、频次加权、人工抽检防误杀 —

2 三级去重对比

层级 技术 解决 代价 备注
L1 精确 规范化后哈希 fingerprint 完全/归一后相同 极低 先做,命中最多
L2 近似 SimHash / MinHash+LSH / 编辑距离 一字之差变体 低 汉明距离阈值常用 ≤3
L3 语义 SBERT 句向量 + 余弦 + 聚类(FAISS/ANN) 同义不同表述 中 阈值常用 0.85~0.92

口诀:先清洗再去重(L1 命中率暴增);语义只并"同意图";阈值宁宽勿激进。

3 拒答测试:构造"看似相关但文档没答案"的问题

核心:检索能召回相关片段,但答案在文档中不存在。

3.1 六类不可答(UAEval4RAG)

Underspecified 信息不足 · False-premise 错误前提 · Nonsensical 无意义 · Modality 模态受限 · Safety 安全敏感 · Out-of-scope 领域外

3.2 五法构造

手法 一句话 例子
① 换实体(最常用) 换同领域实体/数字/时间 "埃菲尔铁塔在巴黎"→"里昂的铁塔怎么去"
② 删证据(最强) 答案句所在 chunk 屏蔽,留周边主题 运费条款删除,"退货运费谁出"
③ 跨文档拼接 A 主语 + B 谓词 "销售提成 5%"+"研发 15 天年假"→"销售有几天年假"
④ 错误前提 真实实体 + 假前提 "2024 新规后涨薪 50%,比例多少?"
⑤ 断链/时间错位 多跳去中间环 / 历史问当下 "2023 总部在朝阳"→"总部现在在哪"

3.3 保真过滤(防假难负例)

构造 → 检索召回 Top-10 chunk → LLM 判断"能/不能"回答 → 不能才入负例集

4 混淆矩阵与指标

真实\行为 模型答 模型拒
真实应答 ✓ 正常 ✗ 过度拒答率(<5%)
真实应拒 ✗ 拒答失败率/幻觉率(≤5%) ✓ 正常

5 清洗去重脚本速查

位置:interview/raw/sources/leetcode/query_dedup_tool.py(标准库即可跑通 L1/L2;L3 需 pip install sentence-transformers)

# 自测(内置 20 条样例)
python3 query_dedup_tool.py --demo

# 生产使用:JSONL 输入 → 去重清洗 → JSONL 输出
python3 query_dedup_tool.py raw_queries.jsonl -o clean_queries.jsonl --topk 100

# 常用参数
--sim-threshold 3       # L2 SimHash 汉明距离阈值
--sem-threshold 0.90    # L3 语义相似度阈值
--session-window 600    # session 时间窗(秒)
--no-semantic           # 禁用 L3(无 GPU/依赖时)

输入:每行 {"query": "...", "user_id": "...", "session_id": "...", "ts": 1234567890} 输出:原字段 + normalized(规范化)/ intent(意图标签)/ keep / dedup_round(L1_exact/L2_simhash/L3_semantic/session_window/stratified_sample)/ count / reason

已知局限:规则层无法识别"合法但无意义"的文本(如"的撒打算"),这类语义有效性过滤需接 LLM 判断。

6 拒答问题构造脚本速查(unanswerable_gen.py)

位置:interview/raw/sources/leetcode/unanswerable_gen.py(标准库即可跑通,LLM 调用走 urllib 零依赖)

# 自测(内置 3 个示例 chunk,mock 生成 + mock 判断,演示"生成→召回→判断→过滤"全流程)
python3 unanswerable_gen.py --demo

# 生产使用:chunk JSONL → 六类拒答问题(带保真过滤)→ JSONL
python3 unanswerable_gen.py chunks.jsonl -o negatives.jsonl \
    --api-key sk-xxx --base-url https://dashscope.aliyuncs.com/compatible-mode/v1 --model qwen-max

# 常用参数
--topk 10        # 保真过滤的召回条数
--demo           # 无 Key 演示模式

输入:每行 {"chunk": "...", "doc_id": "..."} 输出:question / type(六类之一)/ reason / doc_id / verified / keep / filter_detail

对应关系:本脚本即本文"三、拒答测试"的方法落地——六类不可答 + 五法构造(生成 Prompt 内嵌)+ 保真过滤(内置 n-gram 检索召回 Top-K + LLM judge,判"不能"才保留,防假难负例)。

7 案例速查(7 → 3)

原始 处理
"怎么退货?"(刷新×3) session 时间窗去重
"怎么退货!!!" / "如何退货" 规范化后 L1 命中
"退货流程是什么?" L3 语义归并 <return_how>
"帮我查 138xxxx" 脱敏 [PHONE],留作边界样本
"的撒打算" 乱码过滤
"退货多久到账?" 独立意图保留

8 评测样本分级速查:金标集 · 困难样本 · 边界样本(Golden / Hard / Corner)

📎 内容来源:本小节为豆包对话整理(2026-09-11)。用户口述概念 "golden site / hard site / corner site",经检索查证该组合并非大模型评测标准术语("site" 疑为 "set" 误记),按评测领域标准概念修正为 金标集(Golden Set)/ 困难样本(Hard Cases)/ 边界样本(Corner Cases),并与美团白皮书「黄金集 / 必过集 / 挑战集」及评测集难度分布惯例相互印证。

分级 标准术语 定义 作用 配比参考
金标集 Golden Set / Golden Dataset 人工验证的高质量测试用例集(输入 + 期望输出 + 判定标准,可含期望检索文档),冻结后作为评测基准与回归基线 定义"好的下限":每次改 Prompt / 模型 / 检索后跑一遍,证明没有变差 核心 40%~60%
困难样本 Hard Cases / Challenge Set 高难度问题:需多步推理、多工具编排、长上下文、深检索才能答对 标定能力上限、拉开模型差距(对应美团"挑战集") 20%~30%
边界样本 Corner Cases / Edge Cases 边界 / 异常 / 长尾输入:歧义提问、缺上下文、脏数据、对抗性提问、过度拒答测试 测试鲁棒性与"防御 vs 过度拒答"平衡 20%~30%

实践要点: - 金标集必须冻结:禁止用测试集调 Prompt;每次规则 / Prompt 变更记录版本,结果按版本存档,方便回溯(对应 012 美团白皮书"黄金集"与评测视频"金标集是尺子")。 - 三分法彼此独立:与"端到端 / 过程"评测集维度、以及"黄金集 / 必过集 / 挑战集"分类不冲突,可按需叠加。 - 配比参考:70% 真实业务 Query + 20% 边缘高难场景(Corner Cases)+ 10% 对抗诱导场景(通用评测集构建惯例)。 - 来源:金标集定义参考 QASkills · How to Build a Golden Dataset for LLM Evaluation 与 The Neural Base · Golden Test Set Construction;配比参考 评测数据集构建指南(70/20/10);对应关系参考 美团《Agent 评测白皮书》系列01(黄金集 / 必过集 / 挑战集)。


索引:000_面试知识体系索引.md · 009_RAG原理与评测.md(3.5/3.6 详细版)