Day 49 / 共 68 天 · 阶段 9 评测(最重要)

为什么评测最重要

昨天(Day 48)你把研究员+写手+审校三个 Agent 串起来产出了一篇报告——能跑了。但"能跑"和"跑得好"是两码事。今天进入全课最硬核、面试官最爱问的阶段:评测(Evaluation)。你会明白为什么"没有评测=蒙眼改代码",以及离线评测和在线监控各管什么;明天(Day 50)学最主流的打分手段 LLM-as-Judge。

📍 你在阶段 9(评测 D49-52)的位置
D49 为什么评测最重要 D50 LLM-as-Judge D51 指标体系 D52 测试集&回归&CI
💡 用一个类比兜住今天(今天全程沿用「减肥不称体重」的世界观) 做 Agent 好比减肥。你改了 prompt、换了模型、加了工具,就像换了套食谱和训练计划——但如果从不上秤,你永远不知道自己是瘦了还是胖了,全凭"感觉今天状态不错"。评测=那台体重秤:给它一个客观数字。离线评测=在家用固定的秤、固定时间、空腹称(可控、可复现);在线监控=健身教练每天在旁边看你实际吃了啥、动作标不标准(真实但杂)。今天的核心一句话:没有秤,一切改动都是玄学。
L01

没评测=盲改:一切改动都是玄学

🤔 痛点你把 prompt 改了三个字,感觉回答变好了,就上线了。第二天用户投诉更差了。你到底改好了还是改坏了?你说不清——因为你只看了自己随手试的两三个问题。
💡 本质没有评测,你就是蒙着眼睛减肥:靠"照镜子觉得瘦了"来决策。评测把主观感觉换成一个能对比的数字——改动前 72 分,改动后 78 分,你才敢说"这次是真变好了"。
📝 举个例子:同一个改动,两种结局 你想让客服 Agent"更礼貌",在 prompt 加了一句"回答要热情"。
· 没评测:你试了 2 个问题,感觉不错,上线。结果它对"我要退款"也开始热情尬聊,绕半天不给退款入口,投诉飙升。
· 有评测:你用 50 个历史问题跑一遍,发现"任务完成率"从 90% 掉到 74%——立刻发现"热情"把正事冲淡了,改都没改坏就拦住了。
👶 我随手多试几个问题不行吗?可以,但那叫"抽查",不叫评测。抽查的问题是:每次你试的题都不一样、样本太少、还容易挑自己有把握的题试(自我安慰)。评测=一套固定的题库,每次改动都跑同一套,这样分数之间才能公平比较——就像每天用同一台秤、同样早上空腹称,数字才有意义。
L02

评测到底在测什么

🤔 痛点"评测"听起来很虚。到底给 Agent 打什么分?打"聪明"的分吗?"聪明"怎么量化?
💡 本质评测不测"聪不聪明"这种玄乎的东西,而是测具体、可观察的结果:这道题它答对了没?完成任务了没?答案有没有编造?回一次要多久、花多少钱?就像体检不测"你健不健康"这种模糊词,而是量血压、血糖、体重这些能读出数字的指标
你想知道翻译成可测的指标减肥类比
它答得对吗正确率 / 任务完成率体重降了多少
它编造吗是否忠于给定资料(faithfulness)有没有偷吃
它快吗响应延迟(秒)跑步配速
它贵吗每次调用花的 token 成本健身房月费
它常怎么错失败模式归类为啥总反弹
这些指标 Day 51 会逐个拆开讲。今天你只要记住:评测 = 把"好不好"翻译成"一组能算出来的数字"。
L03

离线评测 vs 在线监控:两台不同的秤

🤔 痛点有人说评测要"上线前跑测试集",又有人说"上线后看真实数据"——到底哪个对?
💡 本质两个都要,管的事不一样。离线评测=上线前,用你攒的固定题库(可控、可复现)——像在家空腹上秤,条件干净。在线监控=上线后,盯真实用户的真实请求(嘈杂、但真实)——像教练全天跟拍你实际怎么吃怎么练。
离线评测 vs 在线监控 离线评测(上线前) 固定题库(golden set) 可控 · 可复现 · 可对比 改动前后跑同一套题 ✅ 拦住"改坏了" ≈ 在家空腹称体重 在线监控(上线后) 真实用户真实请求 嘈杂 · 多样 · 会漂移 盯成功率/延迟/成本曲线 ✅ 发现"线上变坏了" ≈ 教练全天跟拍
图注:离线是"发布前的关卡",在线是"发布后的警报"。缺一不可——只离线会被真实世界打脸,只在线则等出事才知道。
📝 举个例子:一次典型事故 某文档问答 Agent 离线跑 95 分上线。两周后在线监控发现"答不出"比例慢慢从 5% 涨到 20%——原因是用户开始问新上传的资料,而离线题库里没有这类题(这叫数据漂移)。离线没错,但世界变了,只有在线监控能抓到。
L04

面试官为什么最爱问评测

🤔 痛点你可能觉得评测"不酷"——不如手写 Agent、玩多智能体炫。为什么面试反而死盯它问?
💡 本质因为会不会评测,区分了"玩过 demo 的人"和"真上过线的人"。谁都能拼个能跑的 demo,但只有真在生产里踩过坑的人,才会本能地问"你怎么知道它好?改了怎么证明没变差?"。面试官用这一问,一秒筛掉只会跑通教程的人。

👶 小白:面试到底会怎么问评测?

👨‍🏫 老师:几乎必考这几句——"你怎么衡量你的 Agent 好不好?""你换了个模型,怎么证明没变差?""线上效果掉了你怎么第一时间知道?"。标准好答案的骨架是:① 我有一套 golden set 离线题库,每次改动跑一遍看核心指标(成功率/延迟/成本);② 关键指标接进 CI,不达标不给合并(Day 52);③ 线上有监控和告警看指标漂移(Day 55)。你只要能顺出这三句,就已经赢过一大半候选人——因为这说明你有"工程闭环"意识,不是玩票。

L05

评测闭环长啥样:改→测→比→再改

🤔 痛点知道要评测了,那评测在整个开发流程里到底怎么"转"起来?
💡 本质评测不是"做一次交差",而是一个循环:每次改动都跑一遍分数,拿新分和旧分比,好就留、坏就退。像减肥打卡:调食谱→称一次→和上周比→有效就继续、反弹就换。让改动有据可依,而不是拍脑袋。
评测闭环:让每次改动都有分数背书 ① 改动 ② 跑评测 (上秤) ③ 和基线比 新分vs旧分 ④ 留/退 好留坏退 循环往复,分数越滚越高
图注:这套循环里"基线(baseline)"是关键——它是上一个已知的分数,新改动必须至少不比它差,才允许留下。
👶 什么是"基线 baseline"?基线就是"上一次记录的成绩",是你比较的锚点。第一次评测跑出的分数就是最初的基线;之后每次改动跟当前基线比,若更好,就把它设为新基线。像减肥:上周 70kg 是基线,这周 68kg 就刷新基线。没有基线,"变好变坏"就无从谈起。
L06

写你人生第一个迷你评测(20 行)

🤔 痛点道理都懂,可"评测"代码到底长啥样?会不会很难?
💡 本质最简单的评测,就是一个题库 + 一个 for 循环 + 数对了几道。不需要任何高级框架。核心思想:准备好"标准答案",让 Agent 逐题作答,一题题核对,最后算个正确率——像老师用标准答案批一叠试卷。
# 一个最小评测:给"能力测试"打分。这里用一个假函数模拟你的 Agent
def my_agent(question: str) -> str:
    # 真实项目里这里会调 LLM / 你的 Agent,现在先写死几个答案做演示
    faq = {"退款要多久": "3-5 个工作日", "运费多少": "满 99 包邮"}
    return faq.get(question, "抱歉我不知道")   # 查不到就兜底

# ① 题库:每条 = (问题, 标准答案)。这就是最朴素的 golden set
dataset = [
    ("退款要多久", "3-5 个工作日"),
    ("运费多少",   "满 99 包邮"),
    ("能开发票吗", "可以开发票"),      # 故意放一道 Agent 答不出的,看它扣分
]

# ② 逐题作答 + 批改
correct = 0
for question, expected in dataset:
    answer = my_agent(question)               # 让 Agent 作答
    ok = (expected in answer)                 # 最朴素判分:标准答案是否出现在回答里
    print(f"[{'✅' if ok else '❌'}] 问:{question} | 答:{answer}")
    if ok:
        correct += 1

# ③ 算总分(正确率)——这就是你的"体重数字"
score = correct / len(dataset)
print(f"正确率:{score:.0%}  ({correct}/{len(dataset)})")   # 输出 → 正确率:67% (2/3)
📝 举个例子:它怎么帮你? 这段跑出 67%。明天你把 my_agent 换成真模型、改个 prompt 再跑,如果变成 80%,你就有铁证说"这次改动确实变好了"。就这么简单——评测的第一步,不需要任何炫技,一个 for 循环就起步了。(真实场景里"答案对不对"往往没法用 in 这么简单判断,那就是明天 LLM-as-Judge 要解决的。)
L07

今日小结 + 动手 10 分钟

🧠 今天你应该能回答

  • 为什么说"没有评测=盲改"?抽查和评测差在哪?
  • 评测把"好不好"翻译成哪几类可测的数字?
  • 离线评测和在线监控各管什么、各像什么?举一个"离线没错但线上变坏"的例子。
  • 面试问"你怎么衡量 Agent 好坏",标准答案的三句骨架是什么?
  • 评测闭环的四步是什么?"基线"是干嘛的?

✋ 动手 10 分钟:跑出你的第一个分数

把 L06 的代码复制到 eval01.py 跑一遍,然后做两个小实验,体会"评测能对比改动":

python eval01.py     # 先看基线:67% (2/3)

实验一:给 faq 字典补上 "能开发票吗": "可以开发票",再跑——应看到 100%。你刚完成了一次"改动→评测→分数变好"的完整闭环。
实验二:往 dataset 再加两道新题(Agent 答不出的),再跑——分数会掉。体会"题库变难,分数就变化",这正是数据漂移的迷你版。

明日预告 · Day 50:今天判分用的是"标准答案是否出现在回答里"这种硬匹配,但现实里答案千变万化——"3 到 5 天"和"3-5 个工作日"意思一样却匹配不上。明天学业界主流解法 LLM-as-Judge:请另一个大模型当"评委老师",按评分表(rubric)给回答打分,还要学会防住评委的偏见。
← Day 48 · 多智能体实战 Day 50 · LLM-as-Judge →