这是 RAG 学习笔记的第 5 篇,也是最后一篇。前几篇都在讲"怎么搭",这一篇讲**“怎么证明它好用、坏了怎么查、还能怎么升级”**。
本系列导航
- 00 开篇:用「开卷考试」理解 RAG 与我的学习方法
- 01 Chunking 切块与 Embedding 选型
- 02 在线链路七步走与混合检索 RRF
- 03 Rerank 与查询改写
- 04 工程化:延迟、缓存、成本与权限
- 05 评测调优与三个进阶架构(本篇)
一、评测集怎么建:来源按价值排序
| 优先级 | 来源 | 为什么 |
|---|---|---|
| 1 | 真实生产查询(近 30–90 天分层采样) | 最贴近真实分布 |
| 2 | 客服升级工单 | 人工介入的问题正是难题 |
| 3 | 事故报告边界案例 | 已知会翻车的地方 |
| 4 | 合成问题 | 仅作兜底,且要标记区分 |
必须覆盖的问法:事实查找、总结、多文档推理、否定式提问、时效性问题、无答案样本。
举例:200 条评测集的构成——
- 120 条真实查询
- 50 条客服工单
- 20 条边界案例
- 10 条合成问题
关键:无答案样本占 10–15%,用来测拒答能力。
为什么必须有无答案样本?因为如果评测集里全是有答案的问题,系统就会"学会"编答案——它永远不需要说"我不知道"。这一条我印象极深。
二、Faithfulness vs Answer Relevance:两个指标别混
| 指标 | 在问什么 | 公式 / 含义 |
|---|---|---|
| Faithfulness(忠实度) | 答案是否完全由检索上下文支持 | 受支持声明数 / 总声明数 |
| Answer Relevance(答案相关性) | 答案是否真正回应用户问题 | 答案与问题的相关程度 |
举例:法律合同 RAG,用户问"合同解除后违约金怎么算"
- 模型答"违约金按合同总额的20%计算",上下文里有这个条款 →Faithfulness = 1.0
- 模型答"违约金按合同总额的30%计算",上下文里没有 →Faithfulness = 0
关键组合判断:
Faithfulness 高但 Relevance 低 → 说明检索内容偏题。
举例:用户问"退款要几天",模型回答"会员年卡权益包括……"——它说的都对(忠于上下文),但没回答问题,所以问题出在检索(召回的内容偏了)。
门槛:受监管行业(法律 / 医疗 / 金融)设0.98,低于则替换为拒答。
这两条我最后是这么记的:**Faithfulness 管"有没有编",Relevance 管"有没有答到点上"。**一个查生成、一个查检索。
三、效果差怎么排查:七问链路
按链路从上到下逐段排查:
- 资料库里有没有答案?(源头问题,最容易被忽略)
- Chunk 切分有没有切断关键信息?
- 召回 Top-K 里有没有正确文档?
- Rerank 后正确文档还在不在前面?
- 上下文有没有超长被截断?
- Prompt 是否约束了"只根据上下文回答"?
- LLM 是否忽略了上下文?
举例:技术文档 RAG,正确文档在召回 Top-50 里排第 35,Rerank 后仍未进 Top-10 → 定位为Rerank 模型不敏感→ 换领域微调 Reranker 后提升到第 2 名。
核心逻辑:
先查上游,再查下游。上游问题会传导到下游。
这七问是我觉得整份文档里"最像工程手册"的一部分。它把"效果不好"这种模糊抱怨,变成了七个可验证的假设——这是可以背下来直接用在面试里的东西。
四、三个进阶架构(加分项)
4.1 GraphRAG:解决多跳推理
问题:传统 RAG 是扁平检索,难以回答需要多跳推理的问题。
举例:用户问"张三的上级的上级是谁"
- 传统 RAG:检索"张三的上级"→ 李四,再检索"李四的上级"→ 王五,需要两次;
- GraphRAG:沿"汇报关系"边遍历两跳,直接返回王五。
代价:构图成本高、维护复杂。
4.2 Agentic RAG:让模型自己决定怎么检索
| 固定流水线 | Agentic RAG | |
|---|---|---|
| 行为 | 检索一次 → 生成一次 | 模型动态决定何时检索、检索什么、检索几次 |
| 举例(技术客服) | 正确率 0.78,延迟 1.2 秒 | 先判断需要检索 → 发现质量低 → 自动改写查询 → 重新检索 → 正确率 0.89,延迟 2.5 秒 |
权衡:正确率+11 个百分点,但延迟翻倍。所以:
简单问题用固定流水线,复杂问题用 Agentic RAG。
4.3 多模态 RAG:CLIP 管图片,BGE 管文字
实现:
- 索引:图片用CLIP做 Embedding,文本用BGE做 Embedding;
- 检索:同时检索文本和图片;
- 生成:多模态 LLM(GPT-4V、Qwen-VL)同时接收文本和图片。
CLIP 和 BGE 分别是什么?
- CLIP:OpenAI 出的多模态模型,能把图片和文字映射到同一个向量空间。一张"按钮"的截图和文字"按钮"在向量空间里很接近,所以能用文字搜图片;
- BGE:文本Embedding 模型,把文字变成向量。
举例:产品手册 RAG,用户问"这个按钮在哪"
- 纯文本 RAG:正确率0.62
- 多模态 RAG:检索到包含该按钮的截图 → 正确率0.85
五、实习面试速成路径(文档给的四周计划)
| 周 | 目标 | 内容 |
|---|---|---|
| 第 1 周 | 建立框架 | 背熟完整链路(离线 + 在线)、RAG vs 微调、Chunking / Embedding / 混合检索 / Rerank 基本概念 |
| 第 2 周 | 深入核心 | RRF 公式与原因、双塔 vs 交叉、HNSW 的 M 与 ef_construction、查询改写的风险与兜底 |
| 第 3 周 | 工程能力 | 延迟优化、成本控制、多轮对话、权限控制、评测集建设 |
| 第 4 周 | 模拟面试 | 每个问题用"口述版"回答、准备 2–3 个项目举例、练习追问链应对 |
面试模拟(我练过的四问)
Q1:什么是 RAG?
“RAG 全称 Retrieval-Augmented Generation,核心是让大模型回答前先从外部知识库检索相关证据,再基于证据生成答案。链路分两阶段:离线做文档解析、切块、向量化、建索引;在线做查询改写、混合检索、Rerank、上下文组装、LLM 生成。我在上一家公司做企业客服 RAG,知识库 3 万篇产品文档,上线后客服人工介入率从 35% 降到 12%。”
Q2:Chunk_size 怎么定?
“没有固定最优值,必须在真实评测集上比较。常见起点 300/500/800 token,overlap 设 10–20%。我们做技术文档 RAG 时对比了固定 512、递归切分、语义切分三种策略,最终选递归切分,因为技术文档结构规整、标题边界比语义边界更可靠,Recall@10 达到 0.85。”
Q3:Rerank 为什么必要?
“召回阶段是双塔粗排,Query 和 Doc 独立编码,交互不充分;Rerank 用 Cross-Encoder 拼接后联合编码,精度更高但慢,所以只对少量候选精排。我们做法律合同 RAG 时,正确文档在召回 Top-50 里排第 35,Rerank 后提升到第 2,答案正确率从 0.62 提升到 0.89。”
Q4:检索为空怎么处理?
“三层处理:第一层放宽条件重试——降阈值、去过滤、启用 BM25 兜底;第二层明确拒答——Prompt 约束’上下文无相关信息时直接说未找到’;第三层追问用户澄清。高 stakes 领域应配置受控拒答,核心原则是宁可拒答,不可幻觉。”
最难的知识点总结(文档原表)
| 难点 | 核心理解 | 举例 |
|---|---|---|
| RRF | 只看排名不看分数,避免量纲不一致 | BM25 和向量分数不可直接比较 |
| Rerank | 双塔粗排 vs 交叉精排 | 正确文档从第 35 名提升到第 2 名 |
| HNSW | ef_construction >= 2*M | 否则图质量永久受损 |
| Faithfulness | 受支持声明 / 总声明 | 上下文有"20%",模型说"30%"则 = 0 |
| 查询改写 | 把"它"还原成实体 | “它退款怎么算"→"会员年卡的退款条件” |
| 多轮对话 | 每轮 Query 必须自包含 | 不能依赖上一轮文档 |
| GraphRAG | 多跳推理 | “张三的上级的上级” |
【此处有图:RAG 完整链路图(离线索引 + 在线检索生成 + 评测与兜底)】
六、我的下一步
文档最后给了四条动手建议,我打算照着做:
- 动手跑一遍:用 LangChain 或 LlamaIndex 搭一个最小 RAG,体验完整链路;
- 建一个小评测集:20 条问题,测 Recall@10 和 Faithfulness;
- 调一次 HNSW 参数:感受 M 和 ef_construction 对召回和延迟的影响;
- 模拟面试:找朋友问上面的问题,用"口述版"回答。
七、系列总结:RAG 到底在解决什么
回头把六篇串起来,我的整体理解是:
RAG 就是把"开卷考试"工程化:离线把书整理好(切块、索引),在线把问题问清楚(清洗、改写)、把书翻准(混合检索、Rerank)、把答案抄对(组装、生成、引用)。
而每一块的核心矛盾也很清楚:
| 环节 | 核心矛盾 | 平衡手段 |
|---|---|---|
| 切块 | 块大→信息全但不精准;块小→精准但易断 | overlap、按结构切 |
| 检索 | 字面匹配 vs 语义匹配 | 混合检索 + RRF |
| 排序 | 快(双塔)vs 准(交叉) | 粗排 Top-50 → 精排 Top-5 |
| 生成 | 上下文长→准但慢/贵 | 只放 3–5 个 chunk、流式输出 |
| 安全 | 答得多 vs 答得对 | 拒答优先、检索期权限过滤 |
如果只让我记一句话,我会记这条:
上限在离线决定,效果在在线争取,可信度靠"会拒答"。
(本系列完)