📄 一句话概括
回放=同样的输入重放;复现=得到同样的输出——采样有随机、服务端有重试、模型在更新,重放十次可能有十种输出。
📝 本节和前面几节的关系
6.8.1 拼回了当时的世界,这一节给一个冷静的提醒:世界拼回去了,答案也未必一样。
一、两个词分开
- 回放:把同样的输入重放给模型——能做到(6.8.1 的材料)。
- 复现:得到同样的输出——不承诺。
两者不等,是三个事实决定的:
- 采样有随机性——同一输入,输出可能有多种。
- 服务端有重试——实测配置里就有
llm-retry包。 - 模型本身在更新——上周和这周的未必相同。
二、算一笔账:重放十次
同一个请求重放 10 次:
- 输出可能有 10 种——每一种都合理但不相同。
- 关键决策点(调不调工具、调哪个)可能分叉。
分叉不是 bug,是采样的本性——指望逐字复现,等于指望掷十次硬币同面。
三、那回放还有什么用
- 理解当时:输入是什么、上下文什么样、该轮到谁说话。
- 检验结构:装配对不对、材料齐不齐——这些是确定性的。
- 对照分析:十次输出里,合理的共性是什么——比单次更有说服力。
回放用于【理解当时】,不是【保证重来】——调试时比的是证据链,不是逐字对答案。
四、工程上的正确姿势
- 别把【复现】写进验收标准——要写就写【结构一致】:同样的材料、同样的装配、同样的管线。
- 要稳定输出就走确定性路径:温度调零、固定种子——那是另一档服务,不是回放的义务。
- 把模型版本记进流水——6.8.1 没列它,这里补上:至少要知道当时用的是谁。
五、动手 Demo:能回放,不等于结果一定能复现
两个词、三个原因、一笔重放的账:
words = [("回放", "同样的输入重放 - 能做到"),
("复现", "得到同样的输出 - 不承诺")]
for a, b in words:
print(" %-4s : %s" % (a, b))
print()
print(" 原因: 采样随机 / 服务端重试(llm-retry) / 模型在更新")
print(" 重放 10 次 => 10 种合理但不相同的输出")
实跑输出:
--------------------------------------------------------------------
能回放,不等于结果一定能复现
--------------------------------------------------------------------
两个词先分开:
词 意思
--------------------------------
回放 把同样的输入重放给模型
复现 得到同样的输出
--------------------------------
回放做不到复现,因为:
采样有随机性 同一输入,输出可能有多种
服务端有重试 llm-retry 包实测存在
模型本身在更新 上周的模型和这周的未必相同
算一笔账:重放 10 次同一个请求——
输出可能有 10 种,**每一种都【合理】但不相同**。
结论:**回放用于【理解当时】,不是【保证重来】**——
调试时比的是证据链,不是逐字对答案。
分叉不是 bug——采样本性,别跟它较劲。 验收要写【结构一致】不是【输出一致】。 补一条:把模型版本记进流水——至少知道当时用的是谁。
30 秒实验
- 向外行解释【回放能做、复现不承诺】。
- 把 6.8.1 的材料清单补上【模型版本】,说说它该记在哪。
- 写一条【结构一致】的验收标准,替代【输出一致】。
常见误区
- 错误:材料齐了就能复现输出。——纠正:采样随机、重试、模型更新——三个变量都不在你手里。
- 错误:输出对不上,说明回放做错了。——纠正:先查结构(材料与装配),输出本就允许不同。
- 错误:那就把温度调到零,回放就必须复现。——纠正:那是确定性服务的另一档选择,不是回放的义务;且模型更新依然会影响。
自测三问(点开对答案)
1. 回放与复现的区别是什么? —— 回放=**重放同样的输入**(能做到);复现=**得到同样的输出**(不承诺)。 2. 为什么复现不承诺? —— **采样随机、服务端重试(llm-retry)、模型在更新**。 3. 验收标准该写什么? —— **结构一致**(材料、装配、管线一致),不写【输出一致】。- ☐ 下一节(6.8.3 用 Session 调试 Agent:先找证据,再判断是不是模型问题)
相关笔记
- 重建一次模型请求,至少需要哪些材料 —— 回放的前提
- 注册也有生命周期 —— 结构一致的验收思路
- 日志是调查事故原因的重要线索 —— 比证据不比猜测
- 🐳 DeepSeek Harness · 索引