第 20 讲:聊天机器人、LLM 智能体与人工评估

Large Language Models: Methods and Applications · Lecture 20。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应原课:CMU 11-667 Fall 2025 · Lecture 20 · Thu 13-Nov-2025 · Chatbots and LLM Agents 原课 slides:Chatbots, agents, human evaluation 阅读材料:Chiang et al. (2024), Chatbot Arena: An Open Platform for Evaluating LLMs by Human Preference;Clark et al. (2021), All That’s ‘Human’ Is Not Gold: Evaluating Human Evaluation of Generated Text 配套代码:code/lecture20/(1 个模块 + 4 个演示脚本) 本讲的写法:沿着”续写模型 → 聊天助手 → 会行动的智能体”走一遍,每一步看多了什么、会在哪里出错;然后讨论怎样评价它们——众包的成对比较(Chatbot Arena),以及人工评估本身的陷阱。所有数字都来自配套代码的实际输出。


目录


0. 本讲导读

0.1 这一讲要回答的问题

用户接触到的 LLM,几乎都不是”给一段文字、续写下去”的形式,而是一个聊天助手:有系统提示、有多轮对话、有角色。越来越多的,它还是一个智能体:能调用工具、浏览网页、修改代码,在一个循环里一步步完成任务。这一讲回答:

  • 聊天助手在内部是什么?对话模板、损失掩码、多轮对话有哪些容易出错的地方?
  • 智能体比一问一答多了什么?为什么任务越长越难?
  • 开放式的聊天质量没有标准答案,怎样评价和排名?Chatbot Arena 的统计方法是什么?
  • 人工评估为什么也不可靠?怎样让它更可靠?

0.2 学完这一讲你应该能

  • 写出一段对话的模板化表示,解释为什么训练时只在助手的回答上算损失,以及模板不一致、对话过长会怎样;
  • 描述智能体循环(观察 → 思考 → 行动)、记忆的作用,用 pHp^H 讨论多步任务中错误的累积;
  • 用 Bradley–Terry 模型从成对选票算出排名和置信区间,解释它为什么优于在线 Elo,以及”风格控制”在做什么;
  • 解释”分辨机器文本”的准确率上限,说出人工评估的常见陷阱和改进方法。

0.3 实验平台

chat_world.py:

  • 一个多轮对话格式;
  • 一个花园文字冒险(5 个地点、5 件东西、可能锁着的棚子,以及一个最优的专家策略);
  • Elo 与 Bradley–Terry 的实现。

04 号脚本复用第 19 讲的三个不同质量的模型。


1. 从续写模型到聊天助手

1.1 对话模板

聊天模型在内部仍然是”续写下一个 token”:一段对话被写成一串带特殊标记的 token,模型续写的是”助手该说的话”。不同的模型家族用不同的模板:

ChatML(OpenAI、Qwen 等):
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
你好<|im_end|>
<|im_start|>assistant
你好!有什么可以帮你?<|im_end|>

Llama 2 用 [INST] … [/INST] 和 <<SYS>>,Llama 3 用 <|start_header_id|>user<|end_header_id|>……模板里的几样东西:

  • 角色:系统、用户、助手(以及工具,第 10 讲);
  • 系统提示:开发者设定的身份、风格、规则,优先级高于用户(第 16 讲的指令层级);
  • 轮次的分隔:模型靠它知道”现在轮到谁说话”、“什么时候该停”。

代码 01 的对话格式:

<sys> brief <user> do who : she picks her pear from her own garden . <asst> she <end> <user> do noun : my friend waters the rose . <asst> rose <end>
  • 系统提示规定回答风格:brief = 只说答案;twice = 说两遍;well = 先说 well。
  • 每一轮:用户给一句花园句子,问它的主语、动词或宾语名词。

1.2 实验:只在助手的回答上算损失

训练聊天模型时,用户的话和系统提示是”条件”,只有助手的话是”要学的”。代码 01 §2(“内容”= 回答里有正确的词;“风格”= 格式完全正确):

训练对话数损失第 1 轮第 2 轮第 4 轮
3000只算助手的回答0.99 / 0.971.00 / 0.970.95 / 0.79
3000每个 token 都算0.70 / 0.690.66 / 0.570.48 / 0.35
12000只算助手的回答1.00 / 1.001.00 / 1.001.00 / 0.99
12000每个 token 都算1.00 / 1.001.00 / 1.001.00 / 0.99
  • 数据少时,只在助手的回答上算损失好得多。每个 token 都算的话,大部分梯度花在了预测用户随手写的句子上,这些句子本来就很难预测、对回答也没有用。
  • 数据足够多时两者都能学会。
  • 实践中几乎都只在助手的回答上算损失(第 6 讲的指令微调也是如此)。Shi et al. (2024) 发现,在少量数据上同时对指令算损失有时反而有帮助——取决于数据和任务。

1.3 实验:模板不一致

代码 01 §3(12000 段对话训练的模型):

推理时的模板第 1 轮 内容 / 风格第 3 轮 内容 / 风格
和训练时相同1.00 / 1.001.00 / 1.00
把 <asst> 换成 :0.00 / 0.000.00 / 0.00
去掉系统提示1.00 / 0.341.00 / 0.64
系统提示挪到最后0.98 / 0.940.91 / 0.91
把 <asst> 换成 <user>0.52 / 0.430.65 / 0.58
  • 把”轮到助手了”的标记换掉,模型就完全不知道该回答——它从没见过别的写法。
  • 去掉系统提示:内容仍然正确,风格在第 1 轮只能瞎猜(三选一,约 33%)。到第 3 轮,模型从前面几轮的回答里推断出了风格,风格正确率回升到 64%。这是上下文学习(第 9 讲):之前的对话本身就是”示例”。
  • 真实世界里,用错模板是部署聊天模型最常见的 bug 之一:漏掉 <|im_start|>assistant、多一个换行、用了别的模型家族的模板。分词器里存着官方的模板(Hugging Face 的 chat_template),推理代码应当直接用它。

1.4 实验:比训练时更长的对话

代码 01 §4(内容 / 风格):

训练对话的轮数第 1 轮第 4 轮第 6 轮第 8 轮第 10 轮第 12 轮
1~4 轮1.00/1.001.00/0.990.05/0.030.03/0.020.03/0.020.05/0.03
1~8 轮1.00/1.001.00/1.001.00/1.001.00/0.950.05/0.040.06/0.03
1~4 轮,每轮重复系统提示1.00/1.000.96/0.860.04/0.02
  • 一旦对话比训练时见过的更长,小模型就完全崩溃,不只是忘了风格,连内容也答不对。
  • 训练到 8 轮,崩溃点后移到第 10 轮,但没有消失。
  • 每轮重复系统提示也没用:问题不在”离系统提示太远”,而在模型没见过这么靠后的位置(第 7 讲”长度是一个领域”;第 21 讲的位置编码外推)。

真实的 LLM 在长得多的文本上预训练过,不会这样突然崩溃,但多轮对话的质量同样会下降。

  • Laban et al. (2025, LLMs Get Lost in Multi-Turn Conversation) 把同一个任务拆成多轮逐步说明,各种模型的表现平均下降约 39%:早期的错误假设会一直延续下去,模型很少”回头”修正。
  • 系统提示的遵循度也会随对话变长而下降(persona drift,Li et al. 2024)。

2. LLM 智能体

2.1 什么是智能体

智能体(agent)= 在一个循环里调用语言模型的程序。

  • 循环:给模型一个目标和当前的观察,模型输出一个动作(调用工具、点击网页、运行代码……),环境执行动作、返回新的观察,如此反复,直到任务完成。
  • ReAct(Yao et al. 2023)在每个动作之前让模型先写一段”思考”:
    • 思考:分析现状、规划下一步;
    • 行动:调用一个工具;
    • 观察:工具返回的结果。

和一问一答相比,智能体多了几样东西:

  1. 记忆:
    • 短期记忆就是上下文里的历史;
    • 长期记忆是外部存储(向量数据库、笔记文件),需要时检索(第 11 讲)。
  2. 规划:把目标拆成子目标;遇到意外时重新规划。
  3. 工具:第 10 讲的工具调用,现在一次任务要调用几十次。
  4. 交互:智能体的动作改变了它之后看到的东西。犯错之后,它会进入训练时从没见过的状态。

常见的基准:

  • 网页:WebArena(真实网站上的任务);
  • 代码:SWE-bench(修复 GitHub issue);
  • 电脑操作:OSWorld;
  • 客服:τ-bench(和模拟用户、业务规则交互)。

2.2 实验:花园文字冒险

代码 02:

  • 环境:5 个地点排成一条路(相邻才能走过去),5 件东西随机放在各处;一半的局里棚子是锁着的,钥匙在别处。
  • 任务:“carry 物品 to 地点”。智能体一开始不知道东西在哪。
  • 专家:按记忆搜索 + 最短路径。例如(4 步):
<goal> carry basket to pen
<obs> here shed nothing go pond locked carry nothing  <act> go pond
<obs> here pond key basket go pen shed carry nothing   <act> take basket
<obs> here pond key go pen shed carry basket           <act> go pen
<obs> here pen bucket go orchard pond carry basket     <act> drop basket done

专家平均 7.3 步完成一局,最多 23 步,成功率 100%。

用 10000 局专家示范做模仿学习(behavior cloning,只在动作上算损失),模型 d = 64、2 层。三种上下文(每种玩 300 局):

智能体成功率每局非法动作成功时的步数 / 专家
没有记忆(只看目标和当前观察)0.0%27.61—
记住最近两步93.7%0.051.06
全部历史88.0%1.851.05
  • 没有记忆:它不知道目的地在哪个方向、哪些地方已经看过,在两个地点之间来回走:

    here orchard feed basket go house pond carry bucket → go house
    here house nothing go orchard carry bucket          → go orchard
    here orchard feed basket go house pond carry bucket → go house

    一旦它做了一个非法动作(状态不变),下一步看到的还是同一个观察、做的还是同一个动作——它被”卡”住了。

  • 只要记住最近两步(知道自己从哪来),就几乎都能完成。

  • 全部历史反而略差:上下文更长、更难学,一旦早先走错一步,这个错误会一直留在上下文里。README 记录了另一个结果:记住最近 6 步的智能体只有 57%——在这个数据量下,“上下文越长越好”并不成立。

2.3 实验:错误的累积

如果每一步独立地以概率 p 做对、做错就失败,长 H 步的任务成功率是 pHp^H。代码 02 §3:

  • 每步准确率:在专家走过的状态上逐步检查(teacher forcing),全部历史的智能体每一步和专家相同的比例 p = 0.942。
  • 按任务长度分组:
专家步数局数实际成功率pHp^H
3~599100.0%77.8%
6~913596.3%64.8%
10~226653.0%45.3%
  • 任务越长,成功率越低:100% → 96% → 53%。
  • 实际成功率都高于 pHp^H:“做错一步就失败”是过于悲观的假设。有些”和专家不同”的动作其实也行(换一条路走),非法动作不改变状态、下一步还能改正。
  • 长任务的下降依然很快:
    • 一旦走进专家从没去过的状态,智能体看到的是训练里没见过的历史,后面的决策更容易出错。这是模仿学习的协变量偏移(Ross et al. 2011)。
    • DAgger 的做法是让专家在智能体自己走到的状态上给出示范,再加入训练数据。强化学习(第 18 讲)则直接在智能体自己的轨迹上优化。

真实的 LLM 智能体同样如此:任务越长成功率越低(例如 METR 的研究用”能以 50% 成功率完成的任务长度”来衡量智能体的进步)。把每一步做得更可靠,让智能体能发现并纠正自己的错误(反思、验证、回溯),是智能体研究的核心问题之一。

2.4 智能体的安全

智能体能行动,所以第 16 讲的风险被放大了:

  • 间接提示注入可以让它执行攻击者的指令;
  • 工具调用有真实的副作用(发邮件、付款、删除文件)。

防护原则:

  • 最小权限;
  • 有副作用的操作要人工确认;
  • 把控制流和不可信的数据分开(CaMeL);
  • 详细的日志和可审计性。

3. Chatbot Arena:用成对比较给模型排名

3.1 为什么用成对比较

开放式的聊天质量没有标准答案,静态基准又会饱和、会泄漏(第 5、7、16 讲)。Chatbot Arena(Chiang et al. 2024)的做法:

  • 用户输入任意的问题,同时看到两个匿名模型的回答,投票选更好的那个(或者平局);投票之后才揭示模型的名字。
  • 问题来自真实用户,分布广、不断更新;匿名防止了品牌偏见;成对比较比打绝对分数容易、一致性更高(第 17、18 讲)。
  • 截至 2024 年收集了超过一百万张选票。

怎样从选票算出排名?这又是第 18 讲的 Bradley–Terry 模型:

P(a 胜 b)=σ(θa−θb)P(a \text{ 胜 } b) = \sigma(\theta_a - \theta_b)

对全部选票做最大似然(逻辑回归),θ 换算成 Elo 的刻度:分数差 400 对应胜率 10:1,分数差 100 对应胜率 64%(练习 5)。

3.2 实验:在线 Elo vs Bradley–Terry

代码 03 模拟一个真实实力已知的竞技场:

  • 模型:20 个,真实实力在 900~1250 之间,相邻的平均只差约 18 分。
  • 选票:按 Bradley–Terry 产生;平局的概率 0.2,平局算半胜。
  • 在线 Elo:按顺序处理每一场,Ra+=k(结果−预期)R_a \mathrel{+}= k(\text{结果} - \text{预期})。

和真实排名的 Spearman 相关 / 平均误差(分):

选票数Elo(k = 4)Elo(k = 32)Bradley–Terry
5000.922 / 79.20.931 / 38.20.926 / 36.3
20000.946 / 48.10.875 / 32.40.946 / 27.1
100000.971 / 30.10.883 / 50.00.994 / 28.7
500000.962 / 20.10.898 / 37.00.995 / 24.0

同样的 10000 张选票,打乱处理顺序 20 次,Elo(k = 32)每个模型的分数平均变动 41.1 分;Bradley–Terry 和顺序无关。

  • k 小的 Elo 收敛慢;k 大的 Elo 一直在抖,对最近的几场比赛很敏感。
  • Bradley–Terry 用全部选票一次性求最大似然,和顺序无关,名次最准。
  • Elo 是为”实力会随时间变化”的棋手设计的。模型的实力不变,所以 Chatbot Arena 从在线 Elo 改成了 Bradley–Terry。
  • Bradley–Terry 的平均误差到 1 万张之后不再下降:平局按”半胜”算,把分数差都压缩了一点,这是系统偏差;名次不受影响。更严谨的做法是用带平局的模型(Davidson 1970)。

3.3 实验:排名有多确定

代码 03 §2:自助法(重抽选票、重新估计 100 次)给出 95% 置信区间:

选票数置信区间的平均宽度相邻名次能分开的比例每个模型可能的名次范围
200084.4 分0.0%5.7
2000025.4 分15.8%1.8

真实实力相邻的模型平均只差约 18 分。2000 张选票时,置信区间宽达约 80 分,相邻的名次一个都分不开:排行榜上”第 5 名”和”第 8 名”可能没有显著差别。Chatbot Arena 因此公布置信区间,并允许名次并列。

代码 03 §3:一个刚上线的新模型(真实实力 1200):

新模型的比赛数Elo(k = 4)Elo(k = 32)Bradley–Terry 及 95% 置信区间
1031114.01196.11146.5 [1100, 1203]
9871176.01127.21174.2 [1155, 1194]

只比了一百来场时,三种估计都离真实值有几十分。Bradley–Terry 的好处不是”一下子就准”,而是它给出了诚实的不确定性:一百场时置信区间宽一百多分,一千场时缩小到几十分。新模型需要足够多的比赛才能可靠地上榜;Chatbot Arena 会给新模型多分配比赛。

3.4 实验:风格控制

投票者的偏好不等于”质量”。代码 03 §4:

  • 设定:每个模型有一个”回答长度”;投票时更长的那个额外占便宜:z=θa−θb+0.6(长度a−长度b)z = \theta_a - \theta_b + 0.6(\text{长度}_a - \text{长度}_b)。最弱的模型(真实第 20 名)回答特别长。
  • 数据:30000 张选票。
和真实实力的 Spearman最弱模型的名次
不控制风格0.4814
控制风格(把长度差作为协变量)0.91915
  • 不控制风格,一个又长又弱的模型排到了第 4。排行榜奖励的是”投票者喜欢的样子”,而不只是”回答得好”。
  • 风格控制把长度差作为协变量放进 Bradley–Terry 回归,系数 γ 吸收掉风格带来的胜率,θ 只剩”去掉风格之后的实力”。估计出的 γ = 0.33(真实 0.6,平局把它压小了)。
  • Chatbot Arena 在 2024 年加入了风格控制(长度、markdown 标题、列表、粗体的数量),一些模型的排名因此有明显变化。第 18 讲的奖励模型有同样的长度偏差——它们学的是同一种人类偏好。

3.5 对 Chatbot Arena 的批评

  • 用户和问题的分布:投票者主要是对 LLM 感兴趣的技术用户,问题偏向编程、闲聊、“考倒模型”的难题,不一定代表你的应用。Arena 也推出了按类别(编程、数学、长问题)分开的排行榜。
  • 可以被”刷”:Singh et al. (2025, The Leaderboard Illusion) 指出:
    • 一些机构在公开前私下测试大量变体,只公布最好的那个(选择性报告让分数虚高);
    • 开放模型被分配的比赛更少;
    • 大量 Arena 数据流向少数机构,可能被用来过拟合 Arena 的问题分布。
  • 偏好不等于正确:用户很难核实事实是否正确、代码是否真的能跑——Arena 衡量的是”看起来更好”。

4. 人工评估也不是金标准

4.1 Clark et al. (2021)

人工评估常被当作”金标准”。Clark et al. (2021) 让众包评估者分辨一段故事 / 新闻 / 菜谱是人写的还是 GPT-3 写的:

  • 准确率约 50%,和瞎猜一样(GPT-2 的文本还能分辨出约 58%)。
  • 评估者给出的理由大多是表面的:语法、格式、重复、“太流畅了”。
  • 用示例培训评估者,只把准确率提高到约 55%。

他们的结论是:随着模型变强,“人能不能分辨出来”不再是衡量文本质量的好方法;人工评估的设计(问什么、给什么说明、怎样培训)对结果影响极大。

4.2 实验:分辨的上限

给评估者一篇文档,它一半的概率来自真实分布、一半来自某个模型。最好的评估者看到文档 x,比较 ptrue(x)p_{\text{true}}(x) 和 pmodel(x)p_{\text{model}}(x),选更大的那个,它的准确率恰好是 (1+TV)/2(1 + \mathrm{TV})/2。

  • TV=∑xmax⁡(0,ptrue(x)−pmodel(x))\mathrm{TV} = \sum_x \max(0, p_{\text{true}}(x) - p_{\text{model}}(x)) 是两个分布的总变差距离。
  • 任何评估者(人或机器)都不可能超过这个上限(练习 7)。
  • 花园世界里 ptruep_{\text{true}} 能精确算出,TV 可以用真实文档上的平均 E[max⁡(0,1−pmodel/ptrue)]\mathbb{E}[\max(0, 1 - p_{\text{model}}/p_{\text{true}})] 无偏地估计。

代码 04 §1:

模型TV最好的评估者只看语法的评估者模型文档不合语法的比例
草稿模型(训练 1 遍,NLL 1.80)0.92296.1%95.9%91.8%
草稿模型(训练 6 遍,NLL 1.36)0.38969.5%57.7%15.3%
目标模型(d128、4 层,NLL 1.35)0.34167.1%52.1%4.2%

(“只看语法的评估者”:不合语法就判”模型”,否则判”人”。)

  • 差的模型很容易分辨:九成以上的文档有语法错误,只看语法就够了。
  • 好的模型(每个 token 的 NLL 只比真实分布高约 0.02):
    • 最好的评估者也只能做到七成左右,只看语法的评估者接近瞎猜(52%)。
    • 剩下的差别藏在”哪些句子更常见”这样的统计细节里,要拿 ptruep_{\text{true}} 和 pmodelp_{\text{model}} 逐句比较才看得出来,读一两篇文档的人根本做不到。

“人分辨不出来”不等于”两者一样好”,只说明这种评估没有区分力。反过来,自动的检测器(机器生成文本检测)也受同样的上限约束:模型越接近人类文本的分布,任何检测器都越不可靠(Sadasivan et al. 2023)。

4.3 实验:评价标准不清楚时

代码 04 §2:

  • 任务:比较两个回答哪个”更好”。“更好”可能指内容(是不是关于花,第 18 讲的偏好)、详细程度(有没有形容词、尾巴),或简洁(越短越好)。
  • 评估者:5 个,每人心里对三者有自己的权重。
    • 标准不清楚:权重 = 设计者的权重 + 很大的个人差异;
    • 写清楚标准:个人差异小得多。
评估者两两一致率Fleiss κ和设计者的标准一致
标准不清楚57.0%0.1461.7%
写清楚标准67.0%0.3475.1%
  • 标准不清楚时,每个评估者都在认真地按自己的理解判断,彼此却只有约六成一致(κ = 0.14,通常认为是”轻微一致”)。这不只是噪声,而是他们在评价不同的东西。
  • 写清楚标准能明显提高一致率和”评到了想评的东西”的比例;剩下的不一致来自判断本身的随机性(两个回答很接近时,谁都说不准)。

4.4 怎样让人工评估更可靠

  • 问清楚问什么:

    • 流畅?有用?事实正确?安全?分开问,不要只问”哪个更好”;
    • 给出评分细则(rubric)和示例。
  • 选对评估者:领域专家(医学、法律、编程)和众包评估者的判断差别很大;Arena 的投票者也是一个特定的人群。

  • 报告一致率(κ 或 Krippendorff’s α)和置信区间;一致率低时,结论要谨慎。

  • 控制偏差:

    • 随机化两个回答的位置(位置偏差);
    • 控制长度和格式(§3.4);
    • 隐藏模型身份。
  • LLM 当评估者(LLM-as-a-judge,第 5 讲;Zheng et al. 2023, MT-Bench):便宜、快、一致,和人的一致率可以达到人与人之间的水平。但它有:

    • 位置偏差;
    • 冗长偏差(AlpacaEval 因此推出了长度控制版本);
    • 偏爱自己的回答(self-preference)。

    需要用人工评估定期校准。


5. 小结、常见误区、练习

5.1 小结

  1. 聊天助手:
    • 在对话模板上续写。只在助手的回答上算损失,在数据少时明显更好(3000 段对话:0.99 vs 0.70)。
    • 推理时模板必须和训练时一致:换掉角色标记,准确率为 0。没有系统提示时,模型会从前面几轮推断。
    • 比训练时更长的对话会让小模型崩溃;真实模型的多轮表现也会下降。
  2. 智能体:
    • “在循环里调用模型”,上下文里的历史就是记忆:没有记忆的智能体成功率为 0,记住两步就有 94%。
    • 每一步的小错误随任务长度累积(100% → 96% → 53%)。
    • 走进没见过的状态后决策更容易出错(协变量偏移)。
  3. Chatbot Arena:
    • 匿名的成对比较 + Bradley–Terry 最大似然。它比在线 Elo 更准、和顺序无关,并给出置信区间:2000 张选票时相邻名次一个都分不开。
    • 新模型需要足够多的比赛。
    • 风格(长度)会推高排名:不控制时一个又长又弱的模型排第 4,控制后排第 15。
  4. 人工评估:
    • 分辨模型文本的准确率有一个由总变差距离决定的上限(好模型约 67%),人依赖的表面线索更少(52%)。
    • 标准不清楚时评估者在评不同的东西(一致率 57%、κ 0.14)。
    • 明确的问题、细则、示例、一致率报告、偏差控制是可靠的前提。

5.2 常见误区

  • “聊天模型和续写模型是两种东西”:聊天模型就是在对话模板上续写(§1.1)。
  • “模板只是格式,换一种写法没关系”:换掉一个角色标记,模型就不知道该说话了(§1.3)。
  • “上下文越长,智能体越聪明”:长历史更难学,早先的错误也会留在上下文里(§2.2)。
  • “每一步 95% 正确的智能体就足够可靠了”:20 步的任务只有约 36% 能完成(练习 3)。
  • “Arena 第 5 名比第 8 名好”:先看置信区间,它们可能分不开(§3.3)。
  • “Arena 排名高 = 模型好”:投票者的偏好包括风格;问题分布也不一定是你的应用(§3.4、§3.5)。
  • “人分辨不出机器文本,说明机器文本和人写的一样好”:只说明这种评估没有区分力(§4.2)。
  • “人工评估就是金标准”:标准不清楚、评估者不同、偏差未控制时,它同样不可靠(§4.3)。

5.3 练习

练习 1(损失掩码的比例):一段对话:系统提示 20 个 token,3 轮,每轮用户 50 个 token、助手 100 个 token。

(a) 只在助手的回答上算损失时,有多少比例的 token 计入损失? (b) 如果每轮的用户消息是一篇 2000 个 token 的文档(“请总结这篇文章”)呢? (c) 这说明了什么?

参考答案

(a) 总长 20 + 3 × 150 = 470,助手的部分 300,占 64%。

(b) 总长 20 + 3 × 2100 = 6320,助手的部分仍是 300,只占 4.7%。

(c) 每个 token 都算损失时,95% 的梯度会花在”学会写用户贴进来的文章”上。这和第 3 讲的预训练没有区别,却挤占了”学会怎样回答”的训练信号。另一方面,只算助手的回答时,计算量(前向和反向都要处理全部 6320 个 token)没有减少,有效的训练信号却很少。所以长上下文任务的 SFT 数据往往需要更多样例。§1.2 的实验里,用户消息是一句花园句子,助手的回答只有 1~2 个词,差别已经很明显。

练习 2(从上下文推断风格):§1.3 里去掉系统提示后,第 1 轮的风格正确率是 34%,第 3 轮回升到 64%。

(a) 为什么第 1 轮约等于 1/3? (b) 第 3 轮时,前面两轮的回答已经暴露了风格,一个”理想的”推断者能做到多少? (c) 为什么模型只做到 64%?

参考答案

(a) 三种风格均匀分布,没有任何线索时只能猜一个(模型会倾向于某一种),期望约 1/3。

(b) 三种风格的回答形式完全不同(brief 一个词、twice 两个相同的词、well 以 well 开头),看过一轮就能确定,理想的推断者能接近 100%。

(c) 模型从没在”没有系统提示”的对话上训练过:

  • 它学到的是”看系统提示决定风格”,而不是”看前面的回答决定风格”;
  • 去掉系统提示后,输入落在训练分布之外,它只能部分地利用上下文里的线索。

64% 说明它确实在用上下文(远高于 33%),但不完全可靠。如果训练数据里也包含没有系统提示的对话,这种”从上下文推断”的能力会更强。

练习 3(错误的累积):

(a) 一个智能体每一步有 95% 的概率做对,做错就失败,20 步的任务成功率是多少? (b) 要让 20 步的任务成功率达到 90%,每一步至少要多准? (c) §2.3 里实际成功率都高于 pHp^H,说出两个原因。

参考答案

(a) 0.95²⁰ ≈ 35.8%。

(b) p=0.91/20≈p = 0.9^{1/20} \approx 99.47%,即每 200 步才允许错一步。

(c) 两个原因:

  • “和专家不同”不等于”错”:换一条路也能到达,比较时却被算作错误;
  • 错误可以恢复:非法动作不改变状态,下一步还能改正;走错一步可以走回来。

真实的智能体还会主动恢复(检查结果、发现错误、回退重试),这也是为什么”验证”和”反思”对智能体如此重要。但如果错误不可逆(删了文件、付了款),pHp^H 就是准确的、甚至是乐观的估计。

练习 4(Elo 更新):

(a) 模型 A 1000 分、B 1100 分,A 赢了,k = 32。A 的预期得分是多少?更新后两者各多少分? (b) 如果 A 和 B 交手 100 次,A 赢了 36 次,Bradley–Terry 的估计会是多少分差?

参考答案

(a) EA=1/(1+10(1100−1000)/400)=1/(1+100.25)=E_A = 1/(1 + 10^{(1100-1000)/400}) = 1/(1 + 10^{0.25}) = 0.360。

  • A:1000 + 32 × (1 − 0.360) = 1020.5;
  • B:1100 − 20.5 = 1079.5。

爆冷的胜利带来更大的变动。

(b) 只有这一对的比赛时,Bradley–Terry 的最大似然让 σ(θ_A − θ_B) = 0.36,即 θ_A − θ_B = ln(0.36/0.64) = −0.575,换算成 Elo 刻度 −0.575 × 400 / ln 10 = −100 分。数据正好和 100 分的差距一致;但 100 场的统计误差约 ±0.048 的胜率,对应约 ±35 分。

练习 5(Bradley–Terry 和 Elo 的刻度):证明 Elo 分差 100 对应的胜率和 Bradley–Terry 里 θ 差 0.576 对应的胜率相同,并解释 “×400/ln 10” 这个换算。

参考答案

Elo:P=1/(1+10−Δ/400)P = 1/(1 + 10^{-\Delta/400}),Δ = 100 时 10−0.25=0.56210^{-0.25} = 0.562,P = 0.640。

Bradley–Terry:P = σ(Δθ) = 1/(1 + e^{−Δθ})。令 e^{−Δθ} = 10^{−Δ/400},得 Δθ = Δ ln 10 / 400 = 100 × 2.303 / 400 = 0.576,σ(0.576) = 0.640。

所以 Elo 就是把 Bradley–Terry 的 θ 乘以 400/ln 10 ≈ 173.7,再加上一个基准(通常 1000 或 1500)。两者是同一个模型,区别只在估计方法:在线更新还是一次性最大似然。

练习 6(需要多少张选票):两个模型真实实力差 18 分(§3.3 里相邻模型的平均差距)。

(a) 较强的那个的胜率是多少? (b) 只看它们之间的直接比较,大约要多少场,才能在 95% 的置信水平上确定谁更强?

参考答案

(a) 1/(1+10−18/400)=1/(1 + 10^{-18/400}) = 0.526。

(b) 胜率的标准误差约 0.5/√n。要求 1.96 × 0.5/√n < 0.026,n > (1.96 × 0.5 / 0.026)² ≈ 1430 场(只算两者之间的直接比较;Bradley–Terry 能借用它们和其他模型的比较,需要的总选票会分摊)。

这就是为什么 2000 张选票时(平均每一对只有约 10 场)相邻名次一个都分不开,而且 Arena 需要几百万张选票。

练习 7(分辨的上限):真实分布在 4 个结果上是 (0.4, 0.3, 0.2, 0.1),模型是 (0.3, 0.3, 0.3, 0.1)。

(a) 算 TV 和最好的评估者的准确率。 (b) 证明没有评估者能超过 (1 + TV)/2。

参考答案

(a) TV = ½ × (|0.4 − 0.3| + 0 + |0.2 − 0.3| + 0) = 0.1,最好的评估者的准确率 = (1 + 0.1)/2 = 55%。它的策略:看到第 1 个结果就判”真实”,看到第 3 个就判”模型”,其余随便猜。

(b) 设评估者在看到 x 时判”真实”的概率是 f(x) ∈ [0, 1]。准确率是

12∑xptrue(x)f(x)+12∑xpmodel(x)(1−f(x))=12+12∑x(ptrue(x)−pmodel(x))f(x)\tfrac12\sum_x p_{\text{true}}(x) f(x) + \tfrac12\sum_x p_{\text{model}}(x)(1 - f(x)) = \tfrac12 + \tfrac12\sum_x (p_{\text{true}}(x) - p_{\text{model}}(x)) f(x)

f(x) = 1 当且仅当 ptrue(x)>pmodel(x)p_{\text{true}}(x) > p_{\text{model}}(x) 时取到最大值 ½ + ½ Σ max(0, p_true − p_model) = (1 + TV)/2。这是假设检验里的经典结论(Neyman–Pearson / 似然比检验)。

练习 8(一致率与 κ):两个评估者各自有一半的时候选 A,彼此一致的比例是 57%。

(a) 算 Cohen’s κ。 (b) 为什么不直接报告”57% 一致”?

参考答案

(a) 随机一致的期望 pe=0.52+0.52=0.5p_e = 0.5^2 + 0.5^2 = 0.5;κ=(0.57−0.5)/(1−0.5)=\kappa = (0.57 - 0.5)/(1 - 0.5) = 0.14(和 §4.3 的 Fleiss κ 一致)。

(b) 两个人都随便选,也有 50% 的一致率。57% 听起来不算太低,扣掉”碰巧一致”之后只剩 0.14,属于”轻微一致”(Landis & Koch 的常用解释:0.0~0.2 轻微,0.2~0.4 一般,0.4~0.6 中等)。如果评估者有强烈的偏好(例如 90% 的时候都选 A),随机一致率会更高,原始一致率就更有误导性。

练习 9(思考:设计一次人工评估):你的团队开发了一个面向医生的临床问答助手,想和一个通用的聊天模型比较。只讨论原理,设计一次人工评估。

参考答案(开放)
  • 评估者:有执照的医生(众包评估者分辨不出医学上的错误);至少 3 人,报告一致率。
  • 问题:
    • 来自真实的临床场景,覆盖不同专科和难度;
    • 事先确认没有出现在两个模型的训练数据里(第 16 讲的污染检查)。
  • 评价维度(分开打分,给出细则和示例):
    • 事实正确性:是否有错误或遗漏的关键信息,是否会导致伤害;
    • 有用性:是否回答了问题、是否可操作;
    • 安全性:是否在不确定时说明不确定、是否建议转诊;
    • 简洁性。
    • 事实正确性要能核实(附参考资料或专家共识)。
  • 流程:
    • 匿名、随机顺序(控制位置偏差);
    • 控制长度(或者把长度作为协变量,§3.4);
    • 先做小规模试评,修改细则直到一致率可以接受。
  • 统计:
    • 成对比较用 Bradley–Terry 并报告置信区间;
    • 绝对打分报告每个维度的均值和区间;
    • 事先计算需要的样本量(练习 6)。
  • 补充:
    • 对”严重错误”单独统计(一次严重错误可能比平均分更重要);
    • 用 LLM 当评估者做大规模的初筛,用医生的评估校准它;
    • 部署后持续收集真实使用中的反馈。

5.4 延伸阅读

  • 原课阅读:
    • Chiang et al. (2024), Chatbot Arena
    • Clark et al. (2021), All That’s ‘Human’ Is Not Gold
  • 聊天模型与多轮对话:
    • Ouyang et al. (2022), InstructGPT(第 18 讲)
    • Shi et al. (2024), Instruction Tuning With Loss Over Instructions
    • Laban et al. (2025), LLMs Get Lost in Multi-Turn Conversation
    • Li et al. (2024), Measuring and Controlling Instruction (In)Stability in Language Model Dialogs
  • 智能体:
    • Yao et al. (2023), ReAct
    • Shinn et al. (2023), Reflexion
    • Zhou et al. (2024), WebArena
    • Jimenez et al. (2024), SWE-bench
    • Xie et al. (2024), OSWorld
    • Yao et al. (2024), τ-bench
    • Ross et al. (2011), A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning(DAgger)
    • Kwa et al. (2025), Measuring AI Ability to Complete Long Tasks(METR)
  • 排名与评测:
    • Bradley & Terry (1952)
    • Elo (1978), The Rating of Chessplayers
    • Davidson (1970)(带平局的成对比较模型)
    • Zheng et al. (2023), Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena
    • Dubois et al. (2024), Length-Controlled AlpacaEval
    • Singh et al. (2025), The Leaderboard Illusion
  • 人工评估:
    • van der Lee et al. (2019), Best practices for the human evaluation of automatically generated text
    • Karpinska et al. (2021), The Perils of Using Mechanical Turk to Evaluate Open-Ended Text Generation
    • Sadasivan et al. (2023), Can AI-Generated Text be Reliably Detected?
  • 本仓库的相关内容:
    • 第 5 讲(自动评估、LLM 当评估者)
    • 第 6 讲(指令微调)
    • 第 8 讲(人与智能体的交互、模拟用户)
    • 第 10 讲(工具调用)
    • 第 16 讲(提示注入)
    • 第 18 讲(Bradley–Terry 与奖励模型)

5.5 下一讲预告

§1.4 里,小模型一遇到比训练时更长的对话就崩溃了;§2.2 里,更长的历史反而让智能体变差。上下文的长度是 LLM 的一个核心限制。第 21 讲:长上下文模型。我们会看:

  • 注意力的平方代价和 KV 缓存的线性增长(第 19 讲)意味着什么;
  • 位置编码怎样外推到更长的序列(位置插值、NTK、YaRN);
  • 模型真的”用上”了长上下文吗——“中间丢失”现象和大海捞针测试的局限;
  • 怎样用合适的数据配方把一个模型继续训练成长上下文模型。
← 返回课程目录