跳到主要内容

会变的系统怎么测 — 评估、监控与持续改进

这一章讲三件事: 传统测试观念哪里要推翻、哪里要保留; 三个阶段(设计/预生产/生产)各自用什么手段把住关; 以及「测 agent」和「测函数」差在哪——为什么它要按三层粒度分别量。 读完你会拿到全书的收尾闭环:每一次上线产生的真实失败,都变成下一轮测试集的养料。

1. 先看现象:一个没法「全绿」的测试门

传统软件的测试哲学:功能需求定了,测试就该 100% 通过,否则不许上线。 LLM 应用直接掀了这张桌子——同一个问题两次运行输出就不同,模型供应商悄悄升级, 你的应用行为就漂移。作者给这个现象起了名字:模型漂移(model drift): 数据的样子变了、或模型被更新,导致的性能退化1

结论不是「别测了」,而是换判据: 不追求满分,追求每次改动不比上一个已验证版本差(回归测试的 LLM 版)2。 围绕这个新判据,书的测试体系分三个阶段,首尾相连成一个圈3:

设计 ──▶ 预生产 ──▶ 上线
▲ │
└────── 监控发现的问题 ┘

图说:设计期挡「会影响用户的错」,预生产期挡「改坏的回归」,
生产期抓「只有真人能踩出的坑」——最后一步的收获回流给前两步。

2. 顶层全景

阶段手段一句话职责
设计期运行时自纠错(自校正 RAG)错误在影响用户前自我修复
预生产期数据集 + 评估器整批跑分改动不劣于上一个已验证版本才放行
生产期tracing + 在线评估 + 灰度抓真问题、喂回数据集

3. 核心原理

3.1 设计期:把「测一下」编进应用内部

自校正 RAG(Self-corrective RAG)是本期的样板工程,流程五步4:

  1. 路由:问题先分流——走向量库还是网页搜索;
  2. 评分:检索回来的文档,再叫一个 LLM 当裁判,按结构化输出只给二元判决 (binary_score: 'yes' | 'no',字段说明里写清「含关键词或语义相关即算相关」)5;
  3. 相关 → 生成答案;
  4. 答案再做一次幻觉检查,准确且相关才展示;
  5. 不相关或答非所问 → 兜底改走网页搜索取上下文。

实测里裁判给出的就是干巴巴的 binary_score='yes'6—— 注意这里的深意:Pydantic 模式把「评价」变成了「程序分支的条件」, 模型的一句话结论直接驱动图走哪条边7。整套流程的执行轨迹在 LangSmith 里全程可见; 书中还演示了索引外的刁钻问题会真的触发网页搜索兜底,且兜底前先经一道 transform_query 节点把问题改写成搜索友好的形态8

3.2 预生产期:先攒题,再定裁判

攒题 = 建数据集:一组「输入 + 预期答案」的样例。三个来源,难度递增9:

来源说明关键数字/性质
人工精选按预期用户输入手写理想答案小数据集 10–50 条高质量样例即可起步
真实提问记录上线后把真实提问收进来保证覆盖最常见的真实问法
合成数据(人造样例)从已有输入中抽样子、再造出边角案例真数据不足时的代餐

LangSmith 的数据集有三种形状(kv 最通用默认、llm 单字符串进出、chat 消息列表)10, 本书的例题用的都是 kv 型。

定裁判 = 选评估器。三类,按「表达成本」排序11:

  1. 启发式(heuristic):写死的函数与断言。

    这套「写死」的做法,行话叫硬编码(hard-coded)。能查「输出是不是合法 JSON」(无参考答案), 也能对照标准答案算准确率;代码生成任务的 schema 校验、单元测试天然属于此类;

  2. 人类(human):需求没法写成代码时,人直接打定性分;annotation queue(把待人工看的样例排成队)能加速这活, 让人可以一次审一批;

  3. LLM 当裁判(LLM-as-a-judge):把人的评分规则写进提示词,让一个 LLM 对照参考答案 给应用输出打分。

作者的采用顺序明确:先启发式,再人类,最后才上 LLM 裁判12。 裁判自己的提示词也有规范:要简单到人类能复现,别让模型做 0–10 的模糊打分13 ——连续量表看似精细,实则把「不可复现」三个字请进了评估流程。

裁判会看走眼,于是有一套自改进机制:few-shot evaluator——人工对裁判结果的每一次纠偏 都存成样例,回灌进裁判未来的提示词;裁判随人的偏好逐步校准, 省掉反复手调提示词的苦工14。还有更适合「比拼」场景的 pairwise evaluation: 两两对比版本 A/B 哪个更好——排序比绝对打分对人和模型都省力15

跑分之后盯回归:设一个对照用的基准 run(基线(baseline)),新版对比它,退步的样例在对比视图里高亮, 可同时定位「哪个版本」和「哪些具体样例」出了问题16。这就是第 1 节那句新判据的执行形态。

走查①:给 SQL agent 立三层考卷

agent 为什么值得单开一节?书里的解释一针见血:agent 用 LLM 决定走哪条流程, 每次运行的工具选择、步数、路径都可以显著不同,甚至可能卡进死循环17。 只测最终答案,你根本不知道过程发生了什么。于是分三层量18:

书中的被测对象是一个基于 Chinook 数据库的 SQL agent。先看数据集,五条题带标准答案19:

「哪个国家的客户消费最多?花了多少?」→ USA,$523.06
「2013 年最热销的曲目?」→ Hot Girl
「Led Zeppelin 有几张专辑?」→ 14
「Big Ones 这张专辑总价?」→ 14.85
「2009 年销冠销售代表?」→ Steve Johnson

第一层,终答(response):黑盒测——输入问题,产出最终回复, LLM 裁判对照参考答案判分(裁判提示词直接从 LangChain Hub 拉 langchain-ai/rag-answer-vs-reference),同题重复跑 3 次(num_repetitions=3) 以摊平随机性20

第二层,单步(single step):专测某个关键决策。实现是一个自定义断言: 预设模型的第一笔工具调用应当是 sql_db_list_tables(先看库里有什么表)—— 是则 1 分,否则 0 分21。配套技巧:用一个工具写死的专用 agent 来测, 把不确定因素收干净22

第三层,轨迹(trajectory):量整条路径。预期路径五步: sql_db_list_tables → sql_db_schema → sql_db_query_checker → sql_db_query → check_result, 配三个由松到严的评估器23:

评估器判定逻辑
any_order预期工具都出现过即可(集合包含)
in_order按顺序出现(子序列匹配),中间允许穿插
exact_match列表完全相等,一步不多一步不少

三层合起来的读法:终答告诉你「对不对」,单步告诉你「哪步错的」,轨迹告诉你「为什么错」。 书里的收束也诚实:这些测试只是「缓解 agent 成本与不可靠性的坚实起点」24

3.3 生产期:没有参考答案的考场

上线之后,测试性质变了:没有标准答案可对照,裁判要实时、无参考地工作(在线评估)25

  • tracing 先行:环境变量一开,每次调用自动留下完整执行轨迹;聚合出来的统计口径有 调用量、成功率/失败率、延迟、token 数与成本26;
  • 两类反馈:用户反馈(点赞点踩、自由评语——可挂到任意 trace 或其中的 span 上) 与 LLM 裁判扫 trace 抓幻觉和毒性27;
  • 分类打标:没预设标签用 LLM 裁判做分类;有 ground truth 标签就用启发式对照28;
  • 错误回填:tracing 抓到的错例与边角案例,加回预生产数据集,防止复发29;
  • 灰度放量:先小批 beta 用户——同时完成三件事:暴露要命 bug、 攒出带参考答案的评估集、实测成本/延迟/质量30

4. 作者的判断与证据

  • 「10–50 条起步」「重复 3 次」「别用 0–10 打分」都是书里给出的具体工程参数, 属于经验推荐而非实验结论。
  • SQL agent 的数据集、断言与三个轨迹评估器都附了完整代码与判分语义, 是全章可复现性最高的部分192123
  • 全章的姿态值得一提:作者反复承认测量口径本身是开放问题(裁判要人审、 安全在发展中、回归没有满分),没有假装这门测试学已经成熟

5. 边界与局限

  • 自校正 RAG 的「文档评分器」每篇文档多一次模型调用——成本翻倍级,书中未提。
  • 数据集质量决定一切,但「怎么判断自己的参考答案错了」没有讨论; 灰度用户的样本偏差也无校正方案。
  • 轨迹评估的三个判据都是二值断言,没有部分得分;「步数太多但答对」算好算坏,书里悬置。
  • 在线评估只有「LLM 裁判扫 trace」一种自动化路径,离业界当前的完整形态有距离 (补充(不在书里,来自通用知识):生产系统常配抽样人工复核与反馈闭环的 双通道,以及按用户群体切分的分桶统计口径)。

6. 可带走的

  1. 换判据:放弃 100% 全绿,守「不劣于基线」;回归对比要能下钻到具体样例;
  2. 测试三阶段各挡一门:设计期自纠错、预生产期整批跑分、生产期真实反馈;
  3. 二元结构化输出是「评价驱动流程走向」的桥——裁判的一句话直接当分支条件用;
  4. 数据集三来源按序攒:10–50 条高质量人工样例起步,上线后用真实提问记录与人造样例养它;
  5. 评估器采用顺序:先启发式,再人审,最后才自动化成 LLM 裁判;
  6. 裁判提示词要人类可复现,禁用 0–10 模糊量表;纠偏样例回灌,裁判越用越像你;
  7. 测 agent 三层各答一问:终答答「对不对」、单步答「哪步错」、轨迹答「为什么错」;
  8. 轨迹三判据由松到严:集合包含 → 子序列 → 完全相等;先松后严定位问题;
  9. tracing 是生产期的免费黑匣子;错例回填数据集,让每一次事故只发生一次;
  10. 灰度一石三鸟:抓 bug、攒真参考答案、量真实成本。

7. 原文地图

主题原书章原文位置
动机(非确定性/幻觉/品牌风险)Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:7(搜「nondeterministic and prone to hallucination」)
三阶段定义Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:17(搜「Design」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:21(搜「Preproduction」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:27(搜「Production」)
持续改进循环Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:29(搜「design, test, deploy, monitor, fix」)
自校正 RAG 五步控制流Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:49(搜「routing step」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:57(搜「As a fallback」)
文档评分器 schema 与判分规则Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:172(搜「GradeDocuments」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:184(搜「assessing relevance」)
binary_score='yes' 实拍Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:250(搜「binary_score」)
二元判断驱动程序分支Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:252(搜「programmatically decide」)
LangSmith 轨迹与网页兜底Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:254(搜「trace of the logic flow」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:260(搜「transform_query」)
数据集三来源与 10–50 条Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:278(搜「Manually curated」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:280(搜「10 and 50」)
数据集三型Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:298(搜「kv (key-value) dataset」)
评估器三类Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:348(搜「Human evaluators」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:354(搜「hardcoded functions」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:358(搜「grading rules into an LLM prompt」)
采用顺序与 0–10 警告Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:360(搜「start simple with heuristic」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:364(搜「range of 0 to 10」)
few-shot evaluator 四步Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:374(搜「few-shot prompt solution」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:378(搜「follows these steps」)
pairwise 与 RANKED_PREFERENCEChapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:406(搜「less cognitively demanding」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:416(搜「Pairwise Experiments」)
模型漂移与新判据Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:422(搜「model drift」)
回归测试与基线对比Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:424(搜「Regression testing」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:428(搜「comparison view」)
agent 结果差异警告Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:448(搜「significantly different outcomes」)
三层粒度Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:450(搜「three different levels of granularity」)
数据集五题实拍Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:498(搜「spent the most」)
终答评估器与 hub 提示Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:580(搜「rag-answer-vs-reference」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:611(搜「num_repetitions」)
单步断言 sql_db_list_tablesChapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:688(搜「check_specific_tool_call」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:693(搜「expected_tool_call」)
工具写死的专用 agentChapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:765(搜「tools are hardcoded」)
轨迹五步与三评估器Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:807(搜「contains_all_tool_calls_any_order」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:785(搜「exact match」)
测试是起点的自评Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1012(搜「solid starting point」)
在线评估定义Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1041(搜「reference-free, real-time」)
tracing 零代码与指标Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1022(搜「A trace is a series of steps」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1033(搜「trace volume」)
两类反馈与 spanChapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1047(搜「explicitly or implicitly」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1047(搜「intermediate run」)
分类打标双路Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1059(搜「reference labels」)
错例回填与灰度Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1065(搜「prevent recurrences」) · text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1067(搜「phases to a small group of beta users」)
小结Chapter 10text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1071(搜「accurate, reliable, fast」)

Footnotes

  1. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 422 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:422,搜「degradation due to changes in data distribution」)。

  2. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 424 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:424,搜「do not regress (perform worse) relative to the baseline」)。

  3. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 15–35 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:29,搜「continuous improvement cycle」)。

  4. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 47–59 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:49,搜「routed to the relevant retrieval method」)。

  5. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 172–198 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:173,搜「binary score」)。

  6. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 250 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:250,搜「binary_score='yes'」)。

  7. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 252 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:252,搜「which node in the control flow to move toward」)。

  8. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 258–264 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:262,搜「web search tool was used as a fallback」)。

  9. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 274–288 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:274,搜「collection of examples」)。

  10. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 296–326 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:298,搜「kv」)。

  11. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 346–358 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:346,搜「three main evaluators」)。

  12. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 360 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:360,搜「start simple with heuristic evaluators」)。

  13. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 362–364 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:364,搜「straightforward prompts」)。

  14. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 372–388 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:388,搜「increasingly aligned with human preferences」)。

  15. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 404–418 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:406,搜「compares two outputs simultaneously」)。

  16. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 420–440 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:436,搜「Set a baseline run」)。

  17. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 446–448 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:448,搜「stuck in a loop」)。

  18. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 450–463 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:452,搜「Response」)。

  19. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 497–509 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:511,搜「SQL Agent Response」)。 2

  20. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 571–612 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:601,搜「student_answer」)。

  21. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 688–713 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:705,搜「single_tool_call」)。 2

  22. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 761–767 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:765,搜「hardcoded rather than passed」)。

  23. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 807–889 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:825,搜「set(expected)」)。 2

  24. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 1012 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1012,搜「solid starting point」)。

  25. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 1039–1041 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1041,搜「online evaluation」)。

  26. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 1020–1035 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1033,搜「token count and cost」)。

  27. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 1043–1051 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1051,搜「toxic responses」)。

  28. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 1059–1061 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1061,搜「ground truth classification labels」)。

  29. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 1063–1065 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1065,搜「recurrences of the same issues」)。

  30. 出处:「Chapter 10. Testing: Evaluation, Monitoring, and Continuous Improvement」第 1067 段(text/13-ch10-chapter-10-testing-evaluation-monitoring-and-con.txt:1067,搜「beta users」)。