跳到主要内容

评测 — 17 道题、三把尺子,以及它们合力给出的诊断

这一章讲三件事: RAG 流水线上有哪四个可以单独评测的位置; 一份好的考卷怎么设计(尤其是「用 Cypher 写标准答案」这个巧思); RAGAS 三把尺子各自量什么、合起来怎么读出「病根在哪」。 这是全书的收束:前面所有机制,最后都要能被它量出来。

1. 顶层全景:流水线上有四个可测的位置

「系统变好了吗?」这个问题在 RAG 上必须拆开问,因为一条流水线上 有四个各司其职的环节,坏的方式完全不同1:

用户提问 → ① 工具选择 → ② 检索相关上下文 → ③ 生成答案 → ④ 端到端
│ │ │
选对了吗? 检回的切题吗? 给对材料答对了吗?

图说:①②③各测各的,④是总账。书里的走法是用一套考卷把这些位置都覆盖到。

第 ③ 个位置特别值得单独说:给对了材料,模型能不能答对—— 这把「模型的理解与综合能力」从「检索的表现」里剥离出来单独看2。 不拆开,你就永远在猜「答错是没检到,还是检到了没读懂」。

本章评的对象就是第 06 章搭的那套 agentic RAG(带工具路由)。

2. 主走查:一份 17 题的考卷,从设计到跑分

设计考卷:五类题,各有用意

书里的考卷共 17 题,每题 = 问题 + 标准答案,按考察点分五类3:

类别考什么书里的例题
工具选择该走模板还是 text2cypher「谁演了 Top Gun?」(走模板)
实体/值映射用户的词对得上库里的值吗「Top Gun」「top gun」大小写各来一遍
聚合过滤必须走 text2cypher 的题「谁演的电影最多?」「列出 1940 年前出生的人」
缺数据数据库里没有时会不会编「哪部电影拿的奥斯卡最多?」→ 标准答案就是「此信息缺失」
对话可用性问候、超范围问题「Hello」「西班牙天气怎么样?」

注意「缺数据」这类题的设计哲学:标准答案就是「没有」—— 系统如实说「库里没有」得满分,硬编一个答案得零分。 这把「承认无知」从美德变成了可量化的分数。

最巧的一步:ground truth 用 Cypher 写

传统考卷的标准答案是静态字符串——数据库一改,答案过期,考卷作废。 书里的做法:标准答案写成一条 Cypher 查询,评测时现跑现得4。 例:「Tom Hanks 演了几部电影?」的 ground truth 不是「12」, 而是一条 count 查询5。数据的任何变动都会同步反映到答案里, 考卷永不过期。

问候和超范围题则用「假 RETURN」:所谓标准答案就是一条 RETURN "greeting and reminder…" 之类的伪查询,直接返回预定的应对文本6

跑分:三把尺子(RAGAS)

考卷跑完,拿 RAGAS 框架(专门给 RAG 做评测的 Python 库)打分, 三把尺子各量各的7:

尺子量什么怎么量
context recall(上下文召回)该检到的检到了吗把答案逐句问「这句能归因到检回的上下文吗」,能 1 不能 0,取比例8
faithfulness(忠实度)说的都有据吗先把答案拆成原子陈述(不许带代词),再逐句判「能从上下文直接推出吗」1/0,取比例9
answer correctness(答案正确性)答得全对吗拆陈述后跟标准答案对齐(逐条比着归类)分三类:TP(答案有、标准答案也有)/ FP(答案有、标准没有)/ FN(标准有、答案漏)10

三把尺子的分工要背下来:recall 管检索侧漏没漏, faithfulness 管生成侧编没编,correctness 管两头合起来的总账

书里跑分前还有个补丁:agent 答不出的题填「I don't know」再送评 (RAGAS 不接受空值)11

读分:0.7774 / 0.7941 / 0.9657

书里对 17 题考卷的实测结果12:

faithfulness 0.9657 ← 几乎不编造:说出来的都有据
context recall 0.7941 ← 约两成的必要信息没检回来
answer correctness 0.7774 ← 总账:约四分之一没答全对

三合一的诊断:生成端很可靠,检索端在漏——
正确率的短板来自 recall,该修的是检索,不是 prompt。

这个读法是全章的方法论示范:三把尺子不是三个并列的 KPI, 是一组差分方程——correctness 低、faithfulness 高时, 病根几乎必然在 recall 侧。书里也正是这么读的:检索覆盖不足拖住了总账, 改进方向是检索覆盖与查询改写13

单题复盘:两个真实的发现

跑完总分还要看单题,书里给了两个:

  1. 延迟差在工具上:不走 text2cypher 的题响应明显更快 ——因为省掉了一次额外的 LLM 调用(第 06 章说的「每一环都是一次调用」 在这里变成了量化的延迟差)14;
  2. 失败例的归因:「哪位演员的名字最长?」答不出——模型写不出对应的 Cypher(名字最长要按字符串长度排序,属于没见过的模式); 修法明确两条:给 text2cypher 加 few-shot 示例,或造一个专用工具15 ——这正是第 06 章「错误驱动沉淀专用检索器」的实操版;
  3. 另有裁判噪声:LLM 打分有不一致(「Hello」题的分数就飘了)16

3. 作者的判断与证据

  • **「用 Cypher 写 ground truth」**是书里给出的方法论创新点, 理由(数据变考卷不变)明说4;
  • 三个指标(量什么的尺子)的解读(忠实度高、正确率低 → 修检索)是书里原样给出的分析13;
  • 考卷要长跑:书里明说 benchmark 应随系统演进而持续增长, 不是一次性的验收17;
  • LLM 当裁判的不可靠性,书里如实承认16——三把尺子全部是 LLM 判定, 分数本身带噪声。

判断(我们的,不是书里的): 这一章隐含着一个更普遍的测试学原则: 考卷的维护成本决定它活多久。静态答案的考卷(答案写死)维护成本随 数据演进一路涨价,很快就没人更新、形同虚设;Cypher 版 ground truth 把 维护成本转嫁给数据库本身,考卷才能长期跑下去。任何「评测集」设计 (不止 RAG)都值得问一句:答案会不会过期? 如果错,会错在: 如果数据模型本身不稳定(节点标签天天改), Cypher 版考卷的维护成本同样爆炸——这个巧思的前提是 schema 比数据稳定。

4. 边界与局限

  • 17 题太少:书里的示例考卷只有 17 题,分到五个类别每类三四题, 分数的置信区间很宽;书里没有讨论样本量(题目够不够多才有代表性);

  • LLM 裁判的噪声没有处理:三把尺子全是 LLM 判定,书里承认不一致16 但没有给降噪手段(多裁判投票、温度归零等,补充(不在书里,来自通用知识)): 这些都是业界常见做法;

  • 没有评「图本身的质量」:本章评的是答案,不评抽取对不对、社区划分好不好—— 图的误差(上游的错传到下游)沿管道流进答案,但书里没有回溯定位的手段;

  • 没有对照组(同样的问题、换掉图谱检索再跑一遍)对比:0.7774 是好是坏?「GraphRAG 值不值」在本书里始终没有数字答案;

  • 工具选择是否正确,书里是靠人工归类考题来设计的,没有自动判定工具选错的机制。

5. 可带走的

  1. 流水线四个评测位:选工具 / 检回 / 生成 / 从头到尾总账,分开测才能定位故障;
  2. 「给对材料答不答得对」必须单独测——它把模型能力从检索表现里剥离出来;
  3. 考卷五类题:工具选择、值映射、聚合过滤、缺数据(标准答案就是「没有」)、对话可用性;
  4. ground truth 用查询写而不是写死,数据变考卷不变——考卷才能活过数据演进;
  5. RAGAS 三尺子:recall 管检索漏没漏,faithfulness 管生成编没编,correctness 是总账;
  6. 读分靠差分:correctness 低 + faithfulness 高 → 修检索;faithfulness 低 → 修 prompt/换模型;
  7. 单题复盘看延迟(工具环节数)与失败归因(写不出的查询 → few-shot 或专用工具);
  8. LLM 裁判有噪声,分数要当「带误差的测量」而不是「精确值」用;
  9. 考卷随系统演进持续加题,评测是长跑不是验收。

6. 原文地图

主题原书章原文位置
四个评测位(图 8.1)8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:29(搜「tool selection」) · text/20-ch08-8-rag-application-evaluation.txt:42(搜「end-to-end」)
给对材料答对(剥离检索)8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:63(搜「correct answer when given」)
三种检索器分工回顾8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:49(搜「semantically relevant documents」)
考卷五类8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:88(搜「Tool selection evaluation」)
问候/超范围例8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:159(搜「greeting and reminder」) · text/20-ch08-8-rag-application-evaluation.txt:165(搜「like in Spain」)
Cypher 写 ground truth8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:127(搜「static string」) · text/20-ch08-8-rag-application-evaluation.txt:130(搜「benchmark remains valid」)
Tom Hanks 考题8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:135(搜「Tom Hanks」)
值映射考题(大小写)8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:182(搜「top gun」)
聚合过滤考题8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:209(搜「most」)
缺数据考题8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:230(搜「missing」)
私有数据需要值映射系统8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:198(搜「dedicated mapping system」)
17 题8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:238(搜「17 examples」)
context recall 定义与提示8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:247(搜「how many relevant」) · text/20-ch08-8-rag-application-evaluation.txt:253(搜「attributed to」)
faithfulness 两步、拆原子、禁代词8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:263(搜「factually consistent」) · text/20-ch08-8-rag-application-evaluation.txt:267(搜「atomic statements」) · text/20-ch08-8-rag-application-evaluation.txt:274(搜「pronouns」)
TP/FP/FN8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:306(搜「true positive」)
填「I don't know」8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:369(搜「I don't know」)
结果与解读(主走查)8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:395(搜「0.7774」) · text/20-ch08-8-rag-application-evaluation.txt:402(搜「rarely makes things up」)
延迟差在 text2cypher8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:418(搜「significantly lower」)
裁判噪声8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:419(搜「LLM as a judge」)
失败例与修法8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:421(搜「longest name」) · text/20-ch08-8-rag-application-evaluation.txt:422(搜「few-shot」)
考卷要长跑8 RAG application evaluationtext/20-ch08-8-rag-application-evaluation.txt:426(搜「continue to grow」)

Footnotes

  1. 出处:「8 RAG application evaluation」第 29 段(text/20-ch08-8-rag-application-evaluation.txt:29,搜「tool selection」)与第 42 段(text/20-ch08-8-rag-application-evaluation.txt:42,搜「end-to-end」)。图 8.1 标出:评测工具选择、评测检回上下文的相关性、评测答案生成、评测端到端。

  2. 出处:「8 RAG application evaluation」第 63 段(text/20-ch08-8-rag-application-evaluation.txt:63,搜「correct answer when given」)。原文:特别重要的评测标准是「给对了上下文,模型能否产出正确答案」——把推理与综合能力和检索表现分开量。

  3. 出处:「8 RAG application evaluation」第 88 段(text/20-ch08-8-rag-application-evaluation.txt:88,搜「Tool selection evaluation」)。五类见第 88-106 段:工具选择、实体与值映射、多步检索、边界与功能覆盖(含歧义问题)、对话可用性。

  4. 出处:「8 RAG application evaluation」第 127 段(text/20-ch08-8-rag-application-evaluation.txt:127,搜「static string」)与第 130 段(text/20-ch08-8-rag-application-evaluation.txt:130,搜「benchmark remains valid」)。原文:不用静态字符串,用 Cypher 查询动态定义 ground truth;底层数据变化时考卷依然有效。 2

  5. 出处:「8 RAG application evaluation」第 135 段(text/20-ch08-8-rag-application-evaluation.txt:135,搜「Tom Hanks」)。图 8.3:「Tom Hanks 演过哪些电影」对应 MATCH (p:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie) RETURN count(m)

  6. 出处:「8 RAG application evaluation」第 159 段(text/20-ch08-8-rag-application-evaluation.txt:159,搜「greeting and reminder」)。原文:「Hello」的 ground truth 是 RETURN "问候并提醒只能回答电影相关问题"

  7. 出处:「8 RAG application evaluation」第 242 段(text/20-ch08-8-rag-application-evaluation.txt:242,搜「RAGAS」)。原文:用 RAGAS 框架评测,聚焦三个指标。补充(不在书里):RAGAS 的机制细节(LLM 当裁判、拆原子陈述再判定)在我们前沿书架的拆解里有逐层拆解。依据: shelf=ai-frontier-reference/ragas#01-metrics-engine.md 事实=该拆解写明 faithfulness 的通用套路是「拆成原子判断→逐条让 LLM 判定→聚合成 0~1 分」。

  8. 出处:「8 RAG application evaluation」第 247 段(text/20-ch08-8-rag-application-evaluation.txt:247,搜「how many relevant」)与第 253 段(text/20-ch08-8-rag-application-evaluation.txt:253,搜「attributed to」)。

  9. 出处:「8 RAG application evaluation」第 263 段(text/20-ch08-8-rag-application-evaluation.txt:263,搜「factually consistent」)、第 267 段(text/20-ch08-8-rag-application-evaluation.txt:267,搜「atomic statements」)与第 274 段(text/20-ch08-8-rag-application-evaluation.txt:274,搜「pronouns」)。原文:两步流程,先拆成自足的原子陈述(任何陈述里不许用代词),再逐句判 1/0。

  10. 出处:「8 RAG application evaluation」第 306 段(text/20-ch08-8-rag-application-evaluation.txt:306,搜「true positive」)。原文:TP=答案里有且标准答案也直接支持;FP=答案里有但标准答案没有;FN=标准答案里有但答案漏了;每条陈述只能归一类,并给出理由。

  11. 出处:「8 RAG application evaluation」第 369 段(text/20-ch08-8-rag-application-evaluation.txt:369,搜「I don't know」)。原文:RAGAS 要求非空值,缺失回答统一填「I don't know」。

  12. 出处:「8 RAG application evaluation」第 395 段(text/20-ch08-8-rag-application-evaluation.txt:395,搜「0.7774」)。表 8.5:answer_correctness 0.7774、context_recall 0.7941、faithfulness 0.9657。

  13. 出处:「8 RAG application evaluation」第 402 段(text/20-ch08-8-rag-application-evaluation.txt:402,搜「rarely makes things up」)。原文:忠实度优秀说明模型不编造;正确率与召回偏低说明检索漏信息拖累总账;改进方向是检索覆盖与查询改写。 2

  14. 出处:「8 RAG application evaluation」第 418 段(text/20-ch08-8-rag-application-evaluation.txt:418,搜「significantly lower」)。

  15. 出处:「8 RAG application evaluation」第 421 段(text/20-ch08-8-rag-application-evaluation.txt:421,搜「longest name」)与第 422 段(text/20-ch08-8-rag-application-evaluation.txt:422,搜「few-shot」)。原文:系统答不出「哪位演员名字最长」,因为模型写不出对应 Cypher;修法是给 text2cypher 加 few-shot 示例或造专用工具。

  16. 出处:「8 RAG application evaluation」第 419 段(text/20-ch08-8-rag-application-evaluation.txt:419,搜「LLM as a judge」)。 2 3

  17. 出处:「8 RAG application evaluation」第 426 段(text/20-ch08-8-rag-application-evaluation.txt:426,搜「continue to grow」)。原文:随系统演进,benchmark 数据集应持续增长,保证持续改进。