算法工程师转大模型:对照做对了,结论还是假的
版权与内容来源声明
本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容,均在附表 A 中标注来源;引用官方原文保持原样,不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准,标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何不合规的软件获取方式,也不对任何收益结果作承诺。转载请注明出处。
算法工程师转到大模型,最想带过去的东西不是某个模型结构,而是对照实验的手感:改一个变量、看指标、判断有没有用。这套手感在推荐、CV、风控里救过很多人,到了生成任务上却经常给出假结论。不是实验没做,是对照的形式做对了,量到的东西还是假的。
读完你能判断三件事:手上那份消融结论值不值得信;模型给你的对照脚本具体错在哪几行;下一次跑对照要补哪几个数字才算数。
一、三条假设:算法岗的默认世界观,在生成任务上一条条塌
1.1 你信的不是某个框架,是三条假设
先说清两个词。消融实验:把系统里的一个部件拿掉或者换掉,其余不动,看指标掉多少,掉得多就说明这个部件有用。验证集切分:把数据分成两份,一份用来调参、一份只在最后验收时看一次,防止你把答案背下来。这两个动作撑起了算法岗大部分的判断力。
它们能成立,靠的是三条隐含假设:
| 假设 | 在监督学习里为什么成立 | 在生成任务里为什么塌 | 塌了之后你看到的现象 |
|---|---|---|---|
| 变量可枚举 | 超参是配置项,写在一个 yaml 里,能列全 | prompt 是自然语言,改一个标点就是新变量 | 复现时「同一个 prompt」其实不是同一个 |
| 指标单调 | 标签固定,accuracy 随能力单调变化 | 输出是自由文本,要先映射回标签才能算分 | 换个问法指标就掉,模型却没变 |
| 测试集固定 | 样本不变,模型确定性输出 | 解码带采样,同一个输入两次两个输出 | 同一配置两次跑出两个准确率 |
三条假设平时不写进文档,因为太基础;一旦不成立,每个对照都在「看起来严谨」和「其实没测到」之间摇摆。
补一条外部证据:Sclar 等人在 ICLR 2024 那篇里,只改提示词的格式(大小写、空格、换行、分隔符),在 LLaMA-2-13B 上测出最高 76 个准确率点的差异,而且加大模型、加示例数、做指令微调都没有消掉这个敏感度。他们给出的建议不是「把 prompt 写好」,而是报告一组合理格式下的性能区间,而不是单一格式下的一个数。
1.2 本机这次跑的是什么,以及它不是什么
先把边界摆正,免得后文的数字被误读。
- 不是真实模型输出。 本机装不上第三方包(pip 不可用),也没有厂商 API 额度。我用的是一个多项分布采样器:给定每个类别的 logit(模型给该类别的原始打分,还没归一化),除以温度,做 softmax(把打分压成概率),按 top_p 截断,再按概率抽一个类别(温度与 top_p 的定义详见 4.1 节)。它模拟的只有「解码这一步会带来多大波动」。
- 样本是合成的。 160 条、4 个类别(投诉 / 咨询 / 办理 / 其他),每类 40 条,随机种子 20261103,Python 3.13.14,纯标准库。每条样本有一个「信号强度」,在 0.55 到 2.35 之间均匀取值,正确类别的 logit 等于信号强度,其余为 0,再叠一层建库时抽一次就不再变的样本级噪声。
- 它测不了模型能力。 一个真模型跑五次,你只能看到「这个模型的波动」;采样器能把「波动」和「能力」拆开看,这是它唯一的价值。
这么设计还有个副作用:模拟器里天然有一批样本落在决策边界上,所以后文会出现「准确率七成、但两次运行有近一半样本判定不同」这种看起来矛盾的数字。这不是脚本写坏了,是四分类采样的数学后果,4.1 节会验算。
1.3 一条判据:效应量要大于噪声带
后面所有对比都只用两个量:
- 效应量 = 两组五次准确率的均值之差;
- 噪声带 = 两组重测极差里更大的那个(极差 = 五次里最高减最低)。
判据一句话:效应量小于噪声带,这个消融结论不成立。理由是噪声带量的就是「你什么都不改时,指标自己能摆多大」,比它还小的差,等同于没测到。
这不是置信区间,也不是显著性检验,是一个现场能算、能贴进周报的保守门槛。它不需要假设分布,代价是只会偏严:样本越少、温度越高,门槛越宽,越容易把真效应判成噪声。
二、第一条塌了:变量根本列不全
2.1 你以为在消融 A,实际动了 A+B+C
最典型的一份对照长这样:基线不加示例,实验组加三条 few-shot 示例(放进提示词里的几条示范样本),其他不变,准确率涨了,结论是「示例有用」。
问题在于「其他不变」这句话没法兑现。加示例这个动作,同时改了四样东西:模板字符串(示例插在指令前面还是后面)、示例的排列顺序、上下文总长度(可能触发截断)、以及示例里出现的标签词(会影响模型输出的措辞)。你声明只改了一样,实际动了四样。
Lu 等人在 ACL 2022 那篇里把顺序这一项单独拎出来测:同样四条示例,只换排列,性能就在「接近当时最好水平」和「接近随机猜」之间摆动;他们还发现,对某个模型好用的顺序,换一个模型就不灵了。所以「示例有用」这句话,如果不带顺序,本身就是不完整的结论。
Sclar 那篇的 76 个点同理:格式是语义等价的,人看着一样,模型看着不一样。两篇合起来说明一件事——在这条流水线上,「语义等价」不等于「配置等价」。
2.2 模型给的那份脚本,错在这六处
这是本文最想指名道姓的部分。你把「写个对照实验脚本」丢给模型,它给你的代码通常能跑、能出数、看起来专业,然后在这六个地方默认了不该默认的东西。
| 模型给的写法 | 为什么错 | 一行改法 |
|---|---|---|
random.seed(42) 或 torch.manual_seed(42) | 固定的是采样种子,模板和参数一个都没锁 | 模板存成独立文件,算 hash 打进日志首行 |
不写 temperature / top_p,用 SDK 默认值 | 默认值随版本与厂商变,等于你没记录实验条件 | 显式传参,并把实际值打进日志 |
| 用「测试集准确率」当可比指标 | 生成任务要先解析输出,解析规则一变指标就变 | 先锁解析器,再比模型 |
| 只跑一次,报一个点估计 | 没有极差,两个点估计的差无法判断真伪 | 每个配置至少 5 次,报均值与极差 |
| 两组在不同样本上算准确率 | 分母不同,两个比例不可配对 | 同一批样本逐条对齐,做配对表 |
| few-shot 示例从测试集里抽 | 数据泄漏——测试信息进了提示,指标虚高 | 示例只从训练段抽,按 id 去重 |
第六条要单独说一句。数据泄漏指的是:模型在「答题」时看到了本该保密的答案信息,于是分数很高,上线就崩。scikit-learn 的交叉验证文档把这件事写得很直白:调参时反复看测试集,「关于测试集的知识会泄漏进模型,评测指标不再反映泛化性能」。翻译成 prompt 场景就是:你从测试集里挑了三条「典型样本」放进提示词,那不是示例,那是把答案抄进了考场。
模型还有第七个毛病,不在代码里:它会把「我优化了 prompt」写成结论,而 prompt 在脚本里是内联的 f-string,你 diff 不出来改了哪几个字。改没改、改了几处,全靠回忆。
2.3 一份能跑的对照骨架
下面这段是本机跑通的骨架,toy_predict 是占位模型(八成按标签出、两成乱出),只用来验证框架,不代表任何真实模型。
import random
from statistics import mean
def run_repeats(predict, items, prompt, params, repeats=5, seed=0):
accs = []
for r in range(repeats):
rng = random.Random(seed + r)
hit = sum(1 for x in items if predict(prompt, params, x, rng) == x["gold"])
accs.append(hit / len(items))
print("第 {} 次 {:.4f}".format(r + 1, accs[-1]))
print("均值 {:.4f} 极差 {:.4f}".format(mean(accs), max(accs) - min(accs)))
return accs
def toy_predict(prompt, params, item, rng):
if rng.random() < params["skill"]:
return item["gold"]
return rng.choice(["A", "B", "C", "D"])
items = [{"gold": "ABCD"[i % 4]} for i in range(40)]
run_repeats(toy_predict, items, "判断下面这条属于哪类", {"skill": 0.8}, repeats=5, seed=7)
输出五行准确率加一行汇总,均值 0.9100、极差 0.0250。骨架值钱的地方不在 predict,在于它把「重复几次、种子怎么派生、汇总报哪两个数」写死在函数签名里,换模型、换数据集都不用重写。
三、第二条塌了:指标不单调,换个问法就变
3.1 改写一句话,掉了 41.6 个点,其中 40.1 个点是一个「类」字
我在同一批 160 条样本、同一组 logits、同样的温度和 top_p 下,只把提示词从 T1「判断下面这条属于哪类」改成 T2「下面这条应该归到哪一类」。两者语义等价,区别只在措辞。
结果是这样:
| 口径 | T1 五次均值 | T2 五次均值 | 差(T2 − T1) |
|---|---|---|---|
| 原始 exact match(逐字比对) | 0.6713 | 0.2550 | −0.4163 |
| 标签归一化后(去掉「类」后缀) | 0.7025 | 0.6875 | −0.0150 |
41.6 个点的差距,归一化之后只剩 1.5 个点,缩掉 40.1 个点。
原因不复杂:T2 的问法里带了「哪一类」,输出更常带「类」后缀(模拟器里 T2 的后缀率是 0.62,T1 是 0.04)。原来的评分器逐字比对,「投诉类」和「投诉」算两个东西,于是判错。归一化把后缀 strip 掉,误差基本消失——顺带 T1 也涨了 3.1 个点,因为它自己也有 4% 的后缀。
必须说清楚:这个机制是我在模拟器里设定的,不是真模型实测。 但它对应一个真实现象——很多「换 prompt 效果掉了」的案例,掉的不是模型能力,是解析器没跟上输出形态。你比的不是两个 prompt,你比的是两个正则。
3.2 指标口径:三个数各自在回答什么问题
指标口径指的是:这个数怎么算、分子分母各是谁、哪些样本被算进去了。同一个模型,口径不同可以得出相反结论。
| 指标 | 回答什么问题 | 什么时候会骗你 | 本文用在哪 |
|---|---|---|---|
| accuracy | 判对的比例 | 类别不平衡时被多数类吃掉 | 主指标,4 个类别各 40 条,均衡 |
| 宏平均的F1分数 | 每一类各算一个再取平均 | 小类样本极少时抖动极大 | 本文不用,因为没有不平衡 |
| Cohen’s kappa | 扣掉「碰巧一致」后还剩多少一致性 | 类别分布偏斜时会失真 | 4.1 节量自一致 |
Hugging Face 的评测文档开头就写:选指标没有一种放之四海而皆准的办法,通用指标、任务特定指标、数据集特定指标要分开看。落到工程上是一句硬要求:报指标时必须同时报口径,否则这个数不可比。
kappa 值得多说一句。它是 Cohen 在 1960 年提出的,定义是 K =(实际一致率 − 碰巧一致率)/(1 − 碰巧一致率),原文的意思是「扣掉碰巧一致之后,联合判断里真正一致的比例」。四分类下,就算模型完全随机,两次运行也会有约 25% 的样本碰巧同标签——所以看两次运行像不像,不能看一致率,要看 kappa。
3.3 把口径写进脚本
def normalize(label):
s = label.strip().replace(" ", "")
return s[:-1] if s.endswith("类") else s
def kappa(a, b):
n = len(a)
labels = sorted(set(a) | set(b))
po = sum(1 for x, y in zip(a, b) if x == y) / n
pe = sum((a.count(k) / n) * (b.count(k) / n) for k in labels)
return (po - pe) / (1 - pe) if pe < 1 else 1.0
print(normalize("投诉类"), normalize(" 咨询 "))
x = ["投诉", "咨询", "办理", "其他"] * 5
y = ["投诉", "办理", "办理", "其他"] * 5
print("一致率 {:.2%} kappa {:.4f}".format(
sum(1 for i, j in zip(x, y) if i == j) / len(x), kappa(x, y)))
本机输出「投诉 咨询」和「一致率 75.00% kappa 0.6667」。一致率 75% 看着不错,kappa 只有 0.67——因为有 25% 是碰巧撞上的。这两个数一起看,才知道这份一致性到底值多少。
四、第三条塌了:测试集固定,答案不固定
4.1 同一配置跑五次,极差 12.5 个点
配置 A:模板 T1、温度 0.7、top_p 1.0,其他全部不变,只换采样种子跑五次。这里的两个解码参数是控制采样随机程度的两颗旋钮:温度(temperature)把 logits 除以它再做 softmax,越小分布越尖、输出越稳;top_p 只保留累计概率刚过 p 的那一小撮候选,再在其中抽样。日志原样摘录(列间距压缩过,数字逐位未改):
A 基线 T1 temp=0.7 top_p=1.0 0.7000 0.6000 0.6625 0.7250 0.6687
极差 0.1250 均值 0.6713 标准差 0.0421
| 配置 | 五次准确率 | 极差 | 均值 |
|---|---|---|---|
| A 基线(温度 0.7 / top_p 1.0) | 0.7000 / 0.6000 / 0.6625 / 0.7250 / 0.6687 | 0.1250 | 0.6713 |
| C 降温度(0.2 / 1.0) | 0.9500 / 0.8812 / 0.9125 / 0.9000 / 0.8938 | 0.0687 | 0.9075 |
| D 只改 top_p(0.7 / 0.5) | 0.9125 / 0.9000 / 0.8812 / 0.8812 / 0.9187 | 0.0375 | 0.8987 |
| E 升温度(1.2 / 1.0) | 0.4813 / 0.4938 / 0.5000 / 0.5312 / 0.6188 | 0.1375 | 0.5250 |
160 条样本,1 条 = 0.625 个百分点,12.5 个点就是 20 条样本。也就是说,你什么都没改,只是重跑,结果就能差 20 条题。任何小于 20 条的「提升」,在这套配置下都是噪声。
为什么用极差而不是标准差:五次的标准差是 0.0421,看着温和,但它默认了一个分布形状;极差是 0.1250,直接回答「最坏能差多少」。报给业务方时,后者更难被误读。
再看一个更刺眼的数:配置 A 的第 1 次和第 2 次,160 条里有 73 条判定不同(45.62%),两次的自一致 kappa 只有 0.3897。
这个数很多人第一反应是「脚本坏了」。验算一下:四分类、单条样本判对概率约 0.7(近似取 0.75 便于心算)时,两次独立采样给出同一标签的概率约 0.583(0.75² + 3 × 0.0833²),翻转率约 41.7%。实测 45.6%,同量级。所以这不是 bug,是多分类采样的数学必然——准确率七成和「近一半样本会翻」可以同时成立。
4.2 二十五组单次对照,七组会得出反号结论
3.1 节那两组(T1 与 T2)各有五次运行,两两配对就是 25 组「单次对照」。每组都能得出一个方向:谁更高。
| 口径 | T2 更好 | T1 更好 | 持平 |
|---|---|---|---|
| 原始 exact match | 0 组 | 25 组 | 0 组 |
| 归一化后 | 7 组 | 17 组 | 1 组 |
看第二行:25 组单次对照里,有 7 组会得出「改写措辞更好」,占 28%。归一化后的单次差最小 −0.0812、最大 +0.0687——同一个对比,单次实验能给你 −8.1 到 +6.9 之间的任何答案。
这才是「对照做对了、结论还是假的」的准确含义:流程一步没错,跑一次、比两个数、看谁大,但你比的是这一次的采样噪声。
第一行给了对照组:原始口径下 25 组全部同向。系统性偏差会稳定复现,随机波动不会。 所以你判断一个结论可不可信,先问它是「每次都这样」还是「这次这样」——前者查口径,后者加重复。
4.3 配对显著性:两个准确率不能直接相减
配对显著性指的是:因为两组结果跑在同一批样本上,每条样本之间是有关联的,所以不能把它们当两组独立数据来比。
McNemar 在 1947 年给出的做法是只看「不一致对」:A 对 B 错的条数、A 错 B 对的条数,一致的那些样本不提供方向信息。实务上还有一条经验:不一致对少于 25 对时,渐近近似不可靠,通常改用精确检验。
def paired(hit_a, hit_b):
b = sum(1 for x, y in zip(hit_a, hit_b) if y and not x) # A 错 B 对
c = sum(1 for x, y in zip(hit_a, hit_b) if x and not y) # A 对 B 错
return {"只在B对": b, "只在A对": c, "不一致对": b + c}
hit_a = [1, 1, 0, 1, 0, 0, 1, 1, 0, 0]
hit_b = [1, 0, 0, 1, 1, 0, 0, 1, 0, 1]
print(paired(hit_a, hit_b))
输出 {'只在B对': 2, '只在A对': 2, '不一致对': 4}。四条不一致对,两个方向各两条——这就是「没有差别」的样子。反过来,如果你的「提升 2.5 个点」在 160 条上只对应 4 条样本翻转,那它连一次像样的检验都撑不住。
五、反直觉:消融不是「一次只改一个变量」,是「变量列不全」
5.1 大家以为「一次只改一个」,实际是「清单列不全」
大家以为:消融的方法论核心是「控制变量」,只要我一次只改一个,其他都不动,测出来的差就是这个变量的贡献。
实际是:在 prompt 流水线上,「其他」你根本列不全,所以「只改一个」这个动作做不到——你能控制的只是「你意识到的那几个」。你以为在消融 A,实际改了 A+B+C,而 B 和 C 没进你的记录。
三个数字放在一起看:
- Sclar 等人:只改格式,最高 76 个准确率点;
- Lu 等人:只换示例顺序,从接近最好水平摆到接近随机猜;
- 本文 3.1 节:只改一个后缀的解析规则,40.1 个点(本文为模拟器设定值,非真实模型实测)。
三个量级都远大于多数团队汇报的「模块提升 2 到 3 个点」。也就是说,你以为在测一个 2 点的效应,而没被记录的变量随手就能造出 40 到 76 点的位移。这不是「实验不够严谨」,是变量的清单本身不完整。
招聘侧的原话更直接:长亭科技 2026-09-13 发布的岗位职责第 2 条写着「通过对照与消融实验持续改进效果」,镁伽科技 2026-09-01 的任职要求里写着「精通算法实验设计、变量消融、指标评估」。写进 JD 的东西,不会有人替你补方法论。
所以正确的动作不是「更努力地只改一个」,而是两步:先把所有会动的落成可 diff 的版本(模板文件、示例列表、参数、模型版本),再测一次「什么都不改」的噪声带,用它当尺子。
5.2 四个最常被漏掉的变量
| 变量 | 为什么会动 | 怎么锁 |
|---|---|---|
| prompt 模板 | 内联 f-string,改字不留痕 | 独立文件 + 内容 hash 打进日志 |
| few-shot 顺序 | 从集合里抽、或用 set 去重后顺序不稳 | 固定列表写死,不用集合 |
| 解码参数 | 吃 SDK 默认值,默认值随版本变 | 显式传 temperature 与 top_p |
| tokenizer 版本 | 换模型或升版本,同一句话切出的 token 不同 | 记录模型与版本号,不跨版本比 |
前两个属于「代码里看不见」,后两个属于「配置里没写」。四样有一个没锁,你的消融就退化成了一次性的对比实验——能出数,但不能复用,也不能被别人复核。
5.3 锁变量的顺序
顺序不能反,反了会白跑:先锁解析器(口径),再锁模板与示例,再锁解码参数,最后才动你要测的那个变量。理由是从上往下,每一层对指标的影响量级都比下一层大;先锁大的,小的才有意义。
这份对照实验检查清单:把本文的六处脚本错法、四个漏掉的变量、以及「极差 + 配对表」的报告模板整理成了一页纸,可以直接贴进实验记录。放在资料包里,扫码即可获取:
六、边界:贪心解码且 prompt 完全固定时,这套判据不成立
6.1 什么时候重测极差接近零
必须把不适用的场景写清楚,否则前面五章就成了万能药。
如果解码是贪心的(每一步直接取概率最高的 token,不做采样)、temperature 为 0、prompt 与解析器完全固定,那么同一个输入重复跑,输出逐字相同,重测极差接近 0。这时候传统消融完全成立,你不需要本文这套判据,老老实实一次改一个变量就行。
本文的判据只在「有采样随机性」时需要。判断方法是跑三次同一配置:三次结果一模一样,说明你处在确定性解码下;三次有差,就按第四章的流程走。
还有三种情况会让判据失真:
- 样本量太小。 160 条时 1 条就是 0.625 个点,极差很容易被单条样本放大;样本越少,噪声带越宽。
- 类别极不平衡。 accuracy 会被多数类吃掉,kappa 会因分布偏斜失真,两个指标会背离。这时候要换成每类单独报。
- 模拟器与真模型的差距。 本文的 logits 是构造的,边界样本偏多,所以翻转率高达 45.6%;真实模型的输出分布通常更尖,翻转会少,极差会跟着变小。门槛必须按你自己的实测重算,不能抄本文的数字。
6.2 解码参数本身也在变:截至 2026-11-03 的两次核对
「把参数锁死」的前提是参数存在且含义稳定。截至 2026-11-03,两个厂商的状态不同:
| 厂商 | temperature | top_p | 对本文的影响 |
|---|---|---|---|
| OpenAI Chat Completions | 取值 0 到 2,仍在参数表里 | 取值 0 到 1,仍在参数表里 | 可以锁,但必须显式传 |
| Anthropic Messages API | 2026-10-21 版移除 | 2026-10-21 版移除 | 锁不了,只能记录「未生效」 |
OpenAI 的接口参考里对这两个参数的原话是:温度越高输出越随机,越低越聚焦;并明确建议「改这个或 top_p,但不要两个一起改」。Anthropic 那边,2026-10-21 这个 API 版本把 temperature、top_p、top_k 一起移除,请求里带上就返回 400,即使传的是旧默认值(这一条属于待验证:官方版本页在本机被地区拦截,引文经两处独立转述交叉核对,未能直连原文)。
含义很实际:解码参数不是常量,是一个会随版本消失的开关。 你的对照脚本里如果不记录「这个参数到底有没有生效」,半年后你自己都解释不了这份结果。
6.3 六个术语,落到明天要改的地方
| 术语 | 模型常错在哪 |
|---|---|
| 验证集切分 | 把测试集当调参集,反复看、反复改 |
| 消融实验 | 只固定 seed,模板与解码参数没锁 |
| 指标口径 | 拿 exact match 去比两种不同措辞 |
| 数据泄漏 | few-shot 示例直接从测试集里抽 |
| 解码参数 | 不显式传,吃 SDK 默认值还不记录 |
| 配对显著性 | 两组不同样本的准确率直接相减 |
这张表可以直接当 review 清单用:一份对照实验的报告递上来,六行里有两行答不上来,这个结论就先别进周会。
七、把结论压成一张决策表
7.1 if-则-what
| 如果 | 就先做 | 判据 / 停手条件 |
|---|---|---|
| 效应量小于噪声带 | 别下结论 | 先加重复次数或降温度,把噪声带压下来 |
| 效应量是噪声带的 1 到 2 倍 | 只写「疑似」 | 重复到 10 次再判,报告里带极差 |
| 效应量大于噪声带 2 倍 | 可以下结论 | 但先做口径检查:这个差是不是解析器造成的 |
| 换措辞后指标方向反了 | 结论只在那套措辞上成立 | 写进限制,不外推到「模型变强/变弱」 |
| 两组跑在不同样本上 | 重跑成同一批 | 做配对表,数不一致对,少于 25 对别谈显著性 |
| 同一配置三次结果完全一样 | 传统消融可用 | 先确认是贪心 + 参数固定,不是碰巧没波动 |
这张表里最容易被跳过的是第三行。本文 3.1 节那个 3.33 倍的「大效应」,其实就是口径造成的——倍数够大,结论照样是假的。倍数只解决「是不是噪声」,不解决「是不是你要测的那个变量」。
7.2 明天就能改的三件事
def verdict(effect, band):
ratio = abs(effect) / band
if ratio < 1:
return "{:.2f} 倍:效应量小于噪声带,先别下结论".format(ratio)
if ratio < 2:
return "{:.2f} 倍:只够写疑似,重复次数加到 10 次再判".format(ratio)
return "{:.2f} 倍:可下结论,但必须同时把极差写进报告".format(ratio)
for name, eff, band in [("改措辞(归一化后)", 0.0150, 0.1125),
("升温度", 0.1462, 0.1375),
("降温度", 0.2362, 0.1250),
("改措辞(原始口径)", 0.4163, 0.1250)]:
print(name, verdict(eff, band))
跑出来四行,前三行是「别下结论」「只够写疑似」「只够写疑似」,最后一行是「可下结论」——而它恰恰是口径造出来的假效应。这四行本身就是提醒:判据能挡住噪声,挡不住你自己选错指标。
落到明天的动作只有三条:把 prompt 存成文件、日志首行打 hash;显式传 temperature 与 top_p 并打印实际值;每个配置跑 5 次,报告里写「均值 ± 极差」,不写单点。
这份评测复盘模板:本文的极差表、25 组单次对照表、配对表格式,以及六个术语的 review 清单,整理成了一份可直接填的模板。放在资料包里,扫码即可获取:
附表 A:本文引用事实与出处对照表
| 序号 | 本文用到的事实 | 文件全名与作者/机构 | 编号或文号 + 日期 | 链接 | 本文位置 |
|---|---|---|---|---|---|
| 1 | 只改格式最高 76 个准确率点;建议报区间 | Quantifying Language Models’ Sensitivity to Spurious Features in Prompt Design or: How I Learned to Start Worrying About Prompt Formatting,Melanie Sclar、Yejin Choi、Yulia Tsvetkov、Alane Suhr,ICLR 2024 | arXiv:2310.11324;2024-03 | https://arxiv.org/abs/2310.11324 | 1.1、2.1、5.1 |
| 2 | 只换示例顺序即可从近最好摆到近随机猜 | Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity,Yao Lu、Max Bartolo、Alastair Moore、Sebastian Riedel、Pontus Stenetorp,ACL 2022 | arXiv:2104.08786;2022 | https://arxiv.org/abs/2104.08786 | 2.1、5.1 |
| 3 | 反复看测试集会让其知识泄漏;结果依赖切分 | 3.1. Cross-validation: evaluating estimator performance,scikit-learn 文档 1.9.1 | 无文号;截至 2026-11-03 | https://scikit-learn.org/stable/modules/cross_validation.html | 2.2 |
| 4 | 选指标无通用解,三类指标要分开 | Choosing a metric for your task,Hugging Face Evaluate 文档 | 无文号;截至 2026-11-03 | https://huggingface.co/docs/evaluate/choosing_a_metric | 3.2 |
| 5 | kappa 定义与扣碰巧一致的思路 | A Coefficient of Agreement for Nominal Scales,Jacob Cohen,Educational and Psychological Measurement 20(1) | DOI:10.1177/001316446002000104;1960-04 | https://doi.org/10.1177/001316446002000104 | 3.2 |
| 6 | 配对二分数据只看不一致对 | Note on the Sampling Error of the Difference Between Correlated Proportions or Percentages,Quinn McNemar,Psychometrika 12(2) | DOI:10.1007/BF02295996;1947-06 | https://doi.org/10.1007/BF02295996 | 4.3 |
| 7 | 温度取值 0–2、top_p 取值 0–1;建议两者只改一个 | Create chat completion,OpenAI API Reference | 无文号;截至 2026-11-03 | https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create | 6.2 |
| 8 | 2026-10-21 版移除三个采样参数,带上即 400(待验证:官方页在本机被拦截,经两处独立转述交叉核对) | API versions,Anthropic Claude Platform Docs | API 版本 2026-10-21 | https://platform.claude.com/docs/en/api/versioning | 6.2 |
| 9 | JD 原文「通过对照与消融实验持续改进效果」 | AI大模型算法工程师-北京/杭州,北京长亭未来科技有限公司,中北大学就业创业网转载 | 页面 id 3243999;2026-09-13 | https://zbjy.nuc.edu.cn/detail/job?id=3243999&online_id=3614319 | 5.1 |
| 10 | JD 原文「变量消融、指标评估」 | 算法工程师-半导体,苏州镁伽科技有限公司,应届生求职网转前程无忧 | 编号 job-008-046-426;2026-09-01 | https://m.yingjiesheng.com/job-008-046-426.html | 5.1 |
| 11 | 160 条样本、5 次重复与全部准确率/极差/kappa 数字 | 本地脚本 2026-11-03-01_消融方差实测.py 与日志 2026-11-03-01_消融方差实测.log(Python 3.13.14,纯标准库) | 无文号;2026-11-03 运行 | 本地文件 | 1.2、3.1、4.1、4.2、7.2 |
附表 B:术语速查表
| 术语 | 一句话解释 | 在本文哪里用到 |
|---|---|---|
| 消融实验 | 拿掉一个部件、其余不动,看指标掉多少 | 第 1、2、5 章 |
| 验证集切分 | 调参一份、验收一份,后者只看一次 | 1.1、6.3 |
| 数据泄漏 | 答题时看到本该保密的答案,分数虚高 | 2.2 |
| 指标口径 | 这个数怎么算、分母是谁 | 3.2 |
| 解码参数 | 温度与 top_p,控制采样随机程度 | 4.1、6.2 |
| temperature | 把 logits 除以它再 softmax,越小越稳 | 4.1、6.2 |
| top_p | 只留累计概率刚过 p 的候选再采样 | 4.1、6.2 |
| 贪心解码 | 每步取概率最高的 token,不采样 | 6.1 |
| Cohen’s kappa | 扣掉碰巧一致后的一致性 | 3.2、4.1 |
| 配对显著性 | 同批样本逐条比,只看一个对一个错 | 4.3 |
写在最后:这篇用到的资料
写这篇文章时,把相关的官方文档和源码又翻了一遍,顺手也整理了几份配套的东西:
- 大模型学习路线图:从零基础到能自己动手做 Agent,按阶段说明每一步该学什么、哪些可以先跳过
- 《LangChain + LangGraph + MCP 智能体开发实战》视频课:7 个模块,从私有化部署、Embedding+RAG 到 MCP+Agent 全流程
- AI 大模型知识库(在线可查):Agent Skills 从入门到落地、Claude Skills 完全指南等专题,按目录浏览即可
- 640 套 AI 大模型行业报告 + 经典 PDF 书籍:看行业落地案例和别人怎么做的时候用得上
- 大模型零基础到精通教学视频:跟着敲一遍,比只读文档快得多
资料是我自己整理的,放在下面这个码上,扫码即可获取:
添加时备注「AI」,优先通过。
资料按「先路线、再动手、最后查漏」的顺序整理好了,建议先看学习路线那一份,照着它挑一条适合自己当前基础的路径再往下看。
更多推荐







所有评论(0)