Files
my-vault/01_Projects/Personal-Tech/LLM_Evaluation/01-Why/01-Why-Guide.md
T

438 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
aliases:
- 从零开始做 LLM 评测
type: guide
tags:
- LLM评测
- 学习专区
- 入门
status: active
created: 2026-08-21
---
# 从零开始做 LLM 评测:每一步背后的道理
**写给谁:** 有多年编程经验,但还没有做过大模型数据标注、模型评测、RAG 或 Agent 的人。
**这篇文章只解决一个问题:** 当你开始做第一个 LLM 评测项目时,为什么要先写 case、写 rubric、手工比较、保存运行记录和分类失败?这些动作表面很琐碎,背后分别在训练什么能力?
> **阅读位置:** 这是一份入门的“Why Guide”,建议先读它以建立判断框架;随后再阅读配套的《LLM 评测工程实战路线图》,将这里的原则落实为目录结构、JSON schema、trial、校准、CI 与作品集。两份材料不应合并:前者解释为什么,后者说明怎么做;其中重复出现的操作表格(case 分布、rubric 模板、失败分类)以《实战路线图》为准。
## 先把“入门”说清楚
入门并不是“会调用一个大模型 API”,也不是“知道 RLHF、RAG、Agent 这些名词”。对一个程序员而言,真正的入门标志是:面对一个 AI 功能,你能把模糊的要求变成一套别人也能执行的判断方法,并在它表现不好时说清楚**坏在哪里、下一步该改哪里、改完如何证明没有退步**。
这就是为什么我们把数据标注理解为**规格工程**。传统程序常常有明确的输入输出和断言:传入两个整数,返回它们的和。AI 功能则经常只有一句产品愿望,例如“回答用户问题要准确、专业、别瞎编”。这不是可测试的规格,只是一个愿望。你的工作就是把愿望逐步变成 test case、rubric、run 和回归检查。
> **你并不是在学习“如何评价模型好不好”。你是在学习:如何把人的期待转译成一套可重复执行的测试。**
OpenAI 将 eval 描述为对模型输出进行结构化测试,并强调先定义任务、准备数据、使用评分器,再分析结果与持续迭代。[1] 对 Agent,评测对象还会延伸到工具调用、完整轨迹与环境最终状态,而不只是最后一句回答。[2]
## 一个总的认知模型:先建立“判断能力”,再追求自动化
初学者最容易掉进一个误区:以为项目的顺序是“选模型 → 调 API → 得分 → 优化”。实际更可靠的顺序恰好相反:
```text
我希望用户得到什么
什么情况算成功、什么情况算失败
如何构造能暴露这些情况的案例
如何让人或程序按照同一规则判断
最后才是:系统、模型或提示词到底表现如何
```
为什么?因为如果“什么算好”没有定义清楚,后面所有的平均分、排行榜和 A/B 对比都没有意义。你只是在给一个没有尺子的对象报数字。
| 初学动作 | 表面上在做什么 | 真正训练的能力 | 如果跳过会怎样 |
|---|---|---|---|
| 选一个很小的任务 | 缩小项目 | 让成功条件可观察、可验证 | 任务范围无边界,最后只能说“感觉不太好”。 |
| 写 10—20 个 case | 准备数据 | 发现真实路径、边界和负例 | 只会测试自己最容易想到的正常问题。 |
| 写 rubric | 写评分标准 | 把个人直觉变成操作定义 | 不同人或同一个人隔天可能给出不同结论。 |
| 手工盲评 | 比较两个答案 | 识别规则歧义和个人偏好 | 会把“我喜欢某模型”误当成“模型更好”。 |
| 保存 run | 存模型输出 | 分离测试定义与一次执行 | 无法解释版本差异,也无法重现结论。 |
| 写最小脚本 | 做统计 | 把个案感受升级为可重复观察 | 每次比较都要手工翻记录,结论不可审计。 |
| 分类失败 | 记录坏答案 | 将“错误”变为可修复的 bug | 所有问题都被粗暴归因成“模型不行”。 |
| 重跑旧 case | 做回归 | 验证修复不是以牺牲别处为代价 | 修好一个问题后,旧能力会悄悄退化。 |
下面用一个**公开文档问答**的小项目,把这些动作逐步讲透。它不是因为 RAG 最热门,而是因为它对初学者的“对错边界”较清楚:答案应该受给定文档约束。等你理解这一套,再换成工具调用 Agent,结构仍然一样。
---
## 第 0 步:为什么第一个项目要“小、可验证、可失败”
假设你选择的任务是:
> 用户给出问题和一段公开文档,系统应只依据这段文档作答;文档没有答案时,系统应明确说“无法从资料确认”。
这个任务看起来很普通,却比“做一个聪明客服”更适合入门。原因不是技术难度,而是它把问题的三个关键部分固定住了:**输入是什么、证据从哪里来、什么行为不允许。**
如果你第一天选择“做一个全能 Agent”或“评价回答是否专业”,你会立刻遇到一个根本问题:谁来定义“全能”或“专业”?没有业务边界时,任何失败都可以被解释成“模型也许本来就做不到”,你学不到如何设计判断。
初学项目应遵守下面的选择标准:
| 标准 | 为什么重要 | 合格例子 | 不适合作为第一个项目的例子 |
|---|---|---|---|
| 你能判断主要对错 | 没有判断能力就无法写 rubric | API 参数是否满足 schema;答案是否有文档证据 | “这个回答有没有洞见?” |
| 可用公开或合成数据 | 避免隐私、授权和脱敏阻塞学习 | 公开技术文档、开源 README、玩具数据库 | 客户工单、内部代码库、真实生产日志 |
| 失败有清晰形态 | 失败分类才有意义 | 无依据编造、漏约束、引用错误 | “用户好像不满意” |
| 可以在本地安全地重复跑 | 评测的价值来自比较和回归 | 只读问答、假工具、模拟状态 | 真正删库、发邮件、改日历 |
> **小,不是降低标准;小是降低干扰。**
>
> 你暂时不学习大规模数据生产、模型微调或复杂平台,是为了先看清“需求—判断—失败—修复”这条主线。
### 你此时真正学到什么
你开始理解:评测不是找一个很强的模型来“答题”,而是设计一个环境,让系统的好坏能够被看见。
---
## 第 1 步:为什么要先写“成功条件”,而不是先跑模型
初学者常会直接把问题丢给几个模型,再挑一个看起来更好的答案。这很自然,但它只能帮助你体验模型,不能帮助你建立评测能力。
先把任务写成一句可操作的成功条件,例如:
> 对于给定上下文,回答中的每一个关键事实必须能在上下文中找到支持;上下文没有支持时,必须明确说明不确定,而不是补全猜测。
这句话做了两件重要的事。
第一,它把“回答准确”变成了**证据关系**。我们不需要争论模型是否拥有世界知识,只问这个回答是否由当前任务允许的证据支持。
第二,它明确了“资料不足时怎么办”。很多 LLM 失败不是因为完全胡说,而是因为它在知道一点点信息时,自信地把空白补满。若你不事先规定“可以拒答”,模型越流畅反而越危险。
| 模糊愿望 | 为什么无法评估 | 可操作的改写 |
|---|---|---|
| 回答要专业 | 专业对不同人含义不同 | 回答应给出文档中定义的配置字段和限制条件。 |
| 不要幻觉 | “幻觉”过于抽象 | 不得陈述任何上下文未支持的参数、默认值或时间点。 |
| 尽量帮助用户 | 容易鼓励猜测 | 缺少证据时说明无法确认,并指出需要哪类补充资料。 |
| Agent 要完成任务 | 不知道只看文本还是看真实动作 | 工具调用必须授权、参数合法,且环境状态满足预期。 |
### 隐藏的道理:这是在做“可判定性设计”
软件测试不会直接断言“这个服务很好”;它断言“调用返回 200”“数据库出现预期记录”“权限检查拒绝未授权用户”。AI 评测也一样。你正在把人的期望转化为可观察、可验收的信号。这里说的不是生产系统中 logs、metrics、traces 意义上的可观测性,而是让成功条件本身变得可判定。
如果没有这一步,后续的评分器只能评价语言是否顺口,无法评价系统是否真的可靠。
### 最小行动
花 15 分钟写四行,不要超过半页:
```text
任务:给定文档片段回答技术问题。
成功:关键事实都能由文档支持;资料不足时明确说明。
失败:无依据事实、遗漏关键限制、把不确定说成确定。
非目标:不评模型是否知道文档以外的世界知识。
```
### 你此时真正学到什么
你开始从“模型给什么答案”转向“产品到底要求什么行为”。这就是规格工程的起点。
---
## 第 2 步:为什么起步只写 10—20 个 case,而不是 100 个
“样本越多越好”是传统数据思维的惯性,但在入门阶段,样本数量不是瓶颈,**你对失败空间的理解**才是。
先写 10—20 个 case,是为了迫使你回答一个更难的问题:用户会以哪些不同方式使用系统?哪些情况最容易诱发错误?你写不出来,恰恰说明你还没有足够理解任务,而不是说明你需要更多数据。
建议先用如下小分布,而不是随机列 20 个问题:
| 样本类型 | 初始数量 | 为什么要有 |
|---|---:|---|
| 文档可完整回答 | 8 | 验证核心功能是否成立。 |
| 文档完全没有答案 | 4 | 观察系统是否乱猜。 |
| 文档只支持部分答案 | 2 | 观察系统能否承认边界,而非二元化地答或不答。 |
| 多片段才能回答 | 2 | 暴露遗漏证据、拼接错误或片面回答。 |
| 容易诱发常识补全 | 2 | 检测看似合理但无证据的内容。 |
| 格式或引用约束 | 1 | 检查输出结构与引用格式是否被遵守。 |
| 边界或对抗输入 | 1 | 检查系统是否错误执行不可信指令。 |
这 20 个 case 不是“训练数据”,而是**你写给系统的 20 个问题**。每个问题都在问:“当我换一种真实但容易出错的条件时,你还能遵守同一个行为标准吗?”
如果时间只够做 **10 个 case**,不要把所有类别机械地等比例砍半。优先保留:3 个正常路径、2 个资料不足、1 个部分支持、1 个多证据、1 个幻觉诱发、1 个格式约束、1 个边界条件(与《首周工作表》第 2 节的结构一致)。第一版必须先学会测试“能答”与“不能答时不乱猜”这两个核心行为。
### 为什么负例和资料不足特别重要
人类测试软件时,不只测试“正确密码能不能登录”,还测试“错误密码是否被拒绝”“没有权限是否被阻断”。对于 LLM,资料不足的问答就相当于负向权限测试:系统是否知道自己不能确认?
如果你的 20 条 case 全是“文档里有明确答案的问题”,任何流畅模型都可能表现不错,你得到的是一种虚假的安全感。真正有信息量的,是它被要求**不要猜**时会怎样。
### 最小行动
先只选三页公开文档。每页写:两个能回答的问题、一个不能回答的问题、一个“看起来能回答但其实需要文档外知识”的问题。你马上就会有 12 个有结构的 case。
### 你此时真正学到什么
你会发现数据集不是“从网上找来的材料”,而是你对风险、边界和用户行为的编码。
---
## 第 3 步:为什么 rubric 比参考答案更重要
许多初学者会为每个问题写一份“标准答案”,然后拿模型输出逐字比对。这样做在计算题中有效,在自然语言任务里却常常失败。
同一个正确答案可以有不同措辞;同一个看起来像参考答案的输出,也可能漏掉了最关键的安全限制。参考答案只是一个例子,rubric 才是**判定逻辑**。
以“根据文档回答问题”为例,第一版 rubric 可以只有三项:
| 维度 | 通过意味着什么 | 失败意味着什么 | 为什么这样设计 |
|---|---|---|---|
| 有据性 | 每个关键事实能在上下文找到支持 | 出现至少一条无依据事实 | 直接约束幻觉风险。 |
| 资料不足处理 | 资料不足时明确说明 | 把未知内容说成确定结论 | 让“拒答”成为正确行为。 |
| 核心任务完成度 | 覆盖问题中的必要部分 | 漏掉核心限制或答偏 | 防止系统只写安全套话却不解决问题。 |
第一版优先使用 `pass/fail``0/1/2`,不要上来就给“专业度、清晰度、帮助性”各打 1—5 分。原因不是细粒度评分不好,而是你还没有建立足够的锚点:3 分与 4 分差在哪里?如果人自己答不清,模型评分器更不可能稳定答清。
### 隐藏的道理:rubric 是“把主观判断拆成可讨论的部件”
当你说“这个回答不行”,另一个人无法知道你是在意事实错误、遗漏限制、语气不好还是格式不对。rubric 迫使你把这些混在一起的感受拆开。
一旦拆开,分歧才有价值:如果两个人都同意答案不完整,但对是否无依据有分歧,就说明你应该补“什么叫关键事实”或补文档证据,而不是泛泛地争论谁判断对。
### 最小行动
为每一项 rubric 写一个正例和一个反例。例如:
```text
有据性通过:文档写“默认保留 7 天”,回答“默认保留 7 天”。
有据性失败:文档未说明默认值,回答“默认保留 30 天”。
```
不要试图写完整手册。你要的是第一版可执行规则;规则本来就应该在使用中改进。
### 你此时真正学到什么
你开始区分“答案内容”与“判定答案的规则”。前者会变化,后者才是质量体系的核心资产。
---
## 第 4 步:为什么要让两个候选答案进行盲评
你可以让两个模型回答,也可以让同一个模型使用两个不同提示词回答。这里的关键不在于选出“冠军模型”,而在于制造一个更容易判断的比较场景。**A/B 成对比较是很好的教学起点,不是评测的必要条件。** 评测也可以只判断单个输出是否满足 rubric,这叫 pointwise evaluation;当你尚未有两个候选或只需验收一个系统版本时,单输出判定完全足够。
人类通常不擅长凭空给一个复杂答案打绝对分数,却更擅长比较两个候选:哪一个事实更有依据?哪一个遗漏更少?哪一个在资料不足时更克制?这也是偏好数据常见采用成对比较的原因。
但必须**盲评**:把模型名隐藏,把输出随机标为 A 和 B,再先按 rubric 逐条评分,最后才揭示来源。否则你会不自觉地偏袒自己熟悉或期待更强的模型,把品牌印象混入判断。
### 盲评不是为了假装客观,而是为了暴露偏差
盲评不能消除所有主观性,却能消除一种很具体的干扰:你知道答案来自谁。它还会暴露另一个重要问题:如果你连 A 与 B 谁更好都说不清,通常不是模型问题,而是 rubric 太模糊、case 缺证据,或者任务根本不适合当前的自动化标准。
最小盲评记录无需复杂,包含下面五件事即可:
```text
case_id:正在评哪个问题
A / B:随机位置的两个输出
每个维度的判定:pass/fail 或 0/1/2
reason:一句可复核理由
confidencehigh / lowlow 表示需要回头改规则的难例
```
### 你此时真正学到什么
你不只是在“给模型评分”,而是在测试你的评分规则:它是否足够清楚,能否支持比较,是否能解释理由。
---
## 第 5 步:为什么必须保存 run,而不是只截图或记结论
第一次做项目时,把结果复制到一个文档里似乎就够了。但只要你改了提示词、换了模型、更新了文档或重新跑了一次,就会遇到一个问题:**你现在看到的差异到底来自哪里?**
因此需要区分两类东西:
```text
Case 定义:我想测试什么、成功条件是什么。
Run 记录:这个版本的系统在某个时间、某个配置下实际输出了什么。
```
这个区分就是 `Test Definition ≠ Test Execution`。它的意义与传统测试完全一样:测试用例不应随一次执行结果被改写;否则你无法比较不同版本,更无法追溯错误。
| 应该稳定保存的定义 | 每次运行才生成的记录 |
|---|---|
| 问题、上下文、预期行为、类别、rubric 版本 | 模型名、提示词/系统版本、温度、trial、输出、延迟、评分结果 |
| 为什么测这个 case | 这次系统到底做了什么 |
| `datasets/` | `runs/` |
保存 run 不是“为了看起来工程化”,而是为了保留实验条件。没有条件记录的结论无法重现;无法重现的结论,就不能指导后续修改。
### 最小行动
不必先建数据库。一个 JSONL 文件够用。每次运行至少记录:`case_id`、模型或系统版本、日期、`trial`、输出与评分。大输入不要重复复制,记录 `case_id` 和版本号即可。
### 你此时真正学到什么
你会开始把模型输出看作一次**实验观测**,而不是一次聊天记录。
---
## 第 6 步:为什么第一版要亲手评分,而不是直接让 LLM Judge 打分
“让一个模型评价另一个模型”看起来很省事,但对刚入门的人,它容易掩盖真正的问题:你还不知道自己的标准是否成立。
如果 Judge 给出 `fail`,你需要能判断:这是 Judge 理解错了、rubric 有歧义、参考证据不完整,还是被评输出真的不合格?如果你自己从未评过一批样本,无法回答这个问题,就没有资格信任自动 Judge。
所以顺序应是:
```text
先手工评一小批
发现哪些地方难判
修改 rubric / case / reference
再让 Judge 按同一规则评分
比较 Judge 与人工不一致的 case
```
这不是反对自动化,而是在建立自动化的基准。自动 Judge 的真正用途是把已被校准的判断放大,而不是代替你决定什么叫好。
### 你此时真正学到什么
你会理解“人工”不是低级替代品,而是定义和校准质量标准的来源。自动化是在这之后提高规模与速度。
---
## 第 7 步:为什么要分类失败,而不是只看总分
假设模型 A 的通过率是 80%,模型 B 是 82%。如果不看失败内容,你很容易得出“B 更好”。但这 2% 的差异可能来自格式小问题,也可能掩盖 B 在资料不足时更容易编造事实。
因此,每个失败至少标一个原因。对于文档问答项目,第一版可以只用下面五类:
| 失败类型 | 它在问什么 | 下一步通常改哪里 |
|---|---|---|
| 无依据事实 | 回答是否补充了证据外内容 | prompt、上下文约束、检索质量。 |
| 漏掉关键限制 | 是否只答了容易部分 | rubric、上下文覆盖、提示词。 |
| 不当确定 | 资料不足时是否还在下结论 | 拒答规则、示例、评分器。 |
| 引用 / 格式错误 | 是否能让用户核对来源 | 后处理、输出 schema。 |
| 评分不确定 | 人也难稳定判定 | 修改 rubric、补证据或保留人工仲裁。 |
这五类是**没有独立检索层和工具调用层的小型文档问答项目的简化子集**,不是通用终点。当你引入实际检索、路由、工具参数、授权和执行环境后,应将失败进一步拆分为检索错误、路由错误、工具选择错误、参数错误、权限错误、执行错误、后处理错误和 grader 错误;这些扩展分类见配套实战路线图。
### 隐藏的道理:failure taxonomy 是 AI 系统的缺陷分类表
传统 bug 不会只写“程序不对”;会区分空指针、竞态、权限、数据库约束或超时。AI 系统也一样。输出错误可能来自检索没有拿到证据、提示词没有强调约束、模型没理解、工具参数错误,甚至是评分器误判。
分类的目的不是写出漂亮报告,而是让**不同的错误得到不同的修复**。如果所有失败都叫“幻觉”,你无法判断要改数据、改检索、改提示词、改工具还是改 grader。
### 你此时真正学到什么
你从“评价结果”进入“诊断系统”。这是程序员进入评测工作的真正分水岭。
---
## 第 8 步:为什么要改一个地方,再重跑旧 case
评测不是为了给模型发成绩单,而是为了帮助你做改变。例如发现资料不足时经常乱猜,你可能在提示词里加入“缺证据时说明无法确认”的规则。然后重跑原来的 case。
这看起来简单,却包含一个重要实验原则:**尽可能控制变量,并完整记录所有变化,再看结果是否变化。** 初学时优先一次改一个可解释因素,这样最容易学习因果关系;真实系统修复有时必须同时改检索与提示词,或同时改工具 schema 与策略,这并不违反原则,但必须把每一项改动写入 run 与报告。否则结果提高了也不知道是哪一个改变起作用。
更重要的是,不只重跑失败 case,也要重跑一小组原本通过的 case。因为 AI 系统常有“修 A 坏 B”的现象:为了更谨慎,它可能变得过度拒答;为了更详细,它可能引入更多无依据内容。
这就是回归测试的意义:
```text
发现失败
→ 形成 case
→ 修改系统
→ 重跑旧 case
→ 既看修复是否成功,也看是否引入新问题
```
### 你此时真正学到什么
你学会用证据而不是印象判断“改进”。这比掌握任何特定评测框架更基础。
---
## 初学阶段刻意不做什么,以及为什么
一份好的入门路线不仅告诉你做什么,也要告诉你现在可以**不做什么**。这些内容并不无用,只是过早引入会掩盖核心学习。
| 暂时不做 | 为什么现在不做 | 什么时候再学 |
|---|---|---|
| 训练 / 微调模型 | 你还没有稳定的质量标准,不知道该用什么数据改进 | 能稳定设计 case、rubric 与回归集之后。 |
| LLM-as-a-Judge | 自动评分会掩盖 rubric 是否清楚 | 手工盲评至少 20—50 条并复盘分歧之后。 |
| CI 门禁、平台和仪表盘 | 它们放大已有流程,不会创造流程 | 手工重跑开始重复、容易漏步骤之后。 |
| 大规模红队 | 范围广、风险分类复杂 | 有一个具体系统边界,如 RAG 注入或工具越权之后。 |
| 1000 条数据 | 数量会掩盖设计问题 | 你能明确说出每个类别为何存在之后。 |
| 很多框架 | 框架会让你“会点按钮”,却不一定理解判断 | 你已经被重复的手工工作真实卡住之后。 |
> **初学阶段最稀缺的不是模型、框架或算力,而是清楚的判断。**
---
## 一个更现实的首周计划:允许卡住,也允许缩范围
不要把“72 小时”理解为必须连续投入三整天。它表示大约 6—10 小时的最小闭环。首次执行时超时完全正常,因为你会第一次碰到“什么算对”这类真正困难的问题。
| 时间块 | 只做一件事 | 完成标志 | 卡住时如何缩小 |
|---|---|---|---|
| 第 1 次 60—90 分钟 | 写任务边界与 rubric v0.1 | 三个维度、各一个正反例 | 从 RAG 改为“回答必须引用文档句子”。 |
| 第 2 次 90 分钟 | 写 10 个结构化 case | 至少 2 个资料不足、1 个部分支持 case | 只使用一篇公开文档。 |
| 第 3 次 60 分钟 | 生成两组候选回答 | 每个 case 有 A/B 输出 | API 不可用时手写一好一坏两个候选。 |
| 第 4 次 90 分钟 | 盲评并标理由 | 至少 5 条低置信度或难例 | 只评 5 个 case,并修改一条规则。 |
| 第 5 次 60 分钟 | 写最小统计脚本 | 输出通过数和失败类型分布 | 先用 CSV / 表格,脚本只统计计数。 |
| 第 6 次 60 分钟 | 修改一个因素并重跑 | 有一个“修改前/后”对比 | 不改模型,只改一条提示词或一个 case 分类。 |
**停止条件:** 如果你已经能发现并解释 3—5 类失败,就不要继续扩充 case;先修改一次 rubric 或系统,再跑一次回归。否则很容易一直造数据,却没有进入分析与迭代。
如果某周没完成,不要从头开始,也不要把目标改成“下周做双倍”。保留现有 case、run 和笔记,将下一步范围砍半:20 个 case 改为 10 个,双人评审改为先做自我复评,CI 改为一个本地命令。**优先保留三件事:rubric、失败理由和版本记录。** 这些才是学习的骨架。
---
## 从 RAG 入门如何迁移到 Agent:结构没变,只是“成功”更复杂
当你理解文档问答后,Agent 评测并不是一套完全不同的学科。你只是在把“有据回答”扩展成“正确行动”。
| RAG 问答中的对象 | Agent 中的对应对象 | 共同的底层问题 |
|---|---|---|
| 文档上下文 | 工具描述、权限、当前状态 | 系统能否在正确约束下行动? |
| 回答是否有依据 | 工具是否被正确选择 | 系统是否使用了正确的可用信息? |
| 无法回答时说明不足 | 意图模糊时请求澄清 | 系统是否知道什么时候不应擅自行动? |
| 引用是否正确 | 参数、权限和状态是否正确 | 输出或动作能否被核对? |
| 最终回答 | 环境 outcome | 文字承诺是否与真实结果一致? |
所以,等你准备做 Agent 项目时,不要先追求复杂的多工具流程。先实现三个无副作用的模拟工具,例如 `search_issue()``get_issue()``update_issue_draft()`,再构造“参数缺失、同名实体、权限不足、用户改意”这些 case。你会发现仍然是在重复同一条主线:**定义成功 → 构造边界 → 执行 → 评分 → 归因 → 回归。**
---
## 你什么时候算“真的入门了”
不是当你背会术语时,而是你能独立完成下面这段解释:
> “我正在评测一个有文档约束的问答系统。我的数据集刻意包含正常、资料不足和幻觉诱发 case。我的 rubric 将有据性与完成度分开。第一次盲评发现资料不足 case 的规则不够清楚,所以我更新了 rubric。系统失败的主要原因是无依据补全;我改了一条提示词后,重跑回归集,幻觉减少,但有两条正常 case 变成过度拒答,因此还不能宣布它更好。”
一个仍停留在旧思维的说法则是:“我跑了几个模型,整体表现不错,准确率大概 80%,所以这个系统可以用。” 它没有说明 80% 是如何定义的、漏掉的 20% 是什么、是否包含高风险失败,也无法告诉别人接下来应改哪里。
如果你能说清前面的合格叙述,哪怕只用了 10 个 case、没有使用任何框架,你已经在做评测工程的核心工作了。
## 最后:现在第一步到底做什么
不要再打开新的课程或框架文档。任选一个动作,十分钟内完成:
- [ ] 从一份公开技术文档中复制一段 200—500 字的内容,并写出一个“文档能回答的问题”和一个“文档不能回答的问题”。
- [ ] 在空白文档写下:“我的系统什么时候应该说‘我无法确认’?”
- [ ] 写一条 rubric`若答案包含上下文未支持的事实,则 groundedness = fail`
这个动作很小,但它会迫使你从“学习 AI 概念”切换到“定义 AI 的可验证行为”。后面的 case、盲评、脚本和回归,都是从这一步自然长出来的。
完成这份 Why Guide 的心智建立后,再进入配套的《LLM 评测工程实战路线图》:在那里你会把这些原则落实为项目目录、JSONL、运行记录、校准、风险门禁与 12 周节奏。
## 参考资料
[1] [OpenAI, *Working with evals*](https://developers.openai.com/api/docs/guides/evals)。
[2] [Anthropic, *Demystifying evals for AI agents*](https://www.anthropic.com/engineering/demystifying-evals-for-ai-agents)。
> ⏳ **时效提示:** OpenAI 官方页面显示 Evals 平台将于 2026-10-31 起转为只读、2026-11-30 关停。本文引用其“任务—测试数据—评分器”的方法论框架,不依赖该平台本身。
---
返回 [[01_Projects/Personal-Tech/LLM_Evaluation/README|学习专区首页]]。