评估,才是微调里最反直觉的部分

26 阅读7分钟

训练跑通了,并不意味着你“完成了微调”

如果你已经做过几次大模型微调,很可能会有一种奇怪的感觉。

 

训练这件事,其实没那么难。

数据准备好,参数配一配,模型一跑,loss 往下走,看起来一切都很正常。只要环境不炸,显存够用,大多数人都能把训练流程跑完。

 

但等你真正停下来,准备回答一个问题时,事情就开始变得不那么确定了。

 

“这次微调,到底算不算成功?”

 

模型是不是更好了?

好在哪里?

这种“好”是不是稳定的?

会不会只是在你测试的那几个问题上凑巧表现不错?

 

你会发现,这些问题远比“训练能不能跑”要难回答得多。

 

也正是在这里,很多微调项目开始失控:

  • 要么过早自信上线,要么永远陷在“再调一轮看看”的循环里。

 

一个必须先明确的前提:训练是确定的,评估是不确定的

这是理解“为什么评估更难”的关键。

 

训练这件事,本质上是一个确定性很强的过程。

你给定模型、数据、参数,训练过程要做的事情其实非常明确:最小化一个目标函数。

 

只要代码没 bug、数值没爆炸,训练就一定会“有结果”。

loss 会降,参数会更新,checkpoint 会生成。

 

但评估完全不是这样。

 

评估面对的是一个模糊的问题:

“你想要的‘好’,到底是什么?”

 

这个问题,在大多数微调项目开始时,甚至是没有被认真想清楚的。

 

为什么 loss 在评估里几乎派不上用场

很多人第一次微调时,会下意识把 loss 当成主要参考指标。

这其实非常自然,因为 loss 是你唯一能立刻看到、而且是数值化的信号。

 

但问题在于,loss 回答的从来不是你真正关心的问题。

 

loss 只在回答一件事:

模型在多大程度上拟合了你给它的训练样本。

 

它不关心模型在真实输入上的表现,

不关心模型有没有学到你示例里的“潜台词”,

更不关心模型是不是开始在不该自信的时候乱说。

 

在微调阶段,loss 更多像一个训练健康度指标,而不是效果指标。

 

11.png

loss 能覆盖的信息范围示意图

 

评估真正难的地方:你很难定义“什么叫变好了”

这是评估比训练难的第一个根本原因。

 

在训练阶段,你的目标函数是清晰的;

但在评估阶段,你面对的是一种非常复杂的判断。

 

举个很常见的例子:

你希望模型“回答更专业一点”。

 

那什么叫“更专业”?

是用词更正式?

是结构更清晰?

还是少说废话、多给结论?

 

这些标准,几乎不可能被压缩成一个简单指标。

 

这也是为什么在很多项目里,评估讨论到最后,都会回到一句话:

“感觉好像是比之前好了一点,但也说不太清楚。”

 

这不是你不专业,而是问题本身就不简单。

 

第二个难点:评估面对的永远是“分布外世界”

训练时,你看到的是训练数据;

评估时,你面对的是未来真实用户的问题。

 

这两者之间,几乎一定存在分布差异。

 

哪怕你准备了验证集,它也往往和训练集来自同一批数据来源,同一种表达习惯。

而真实用户的问题,通常更加随意、更不完整、更不可预测。

 

于是你会看到一个非常经典的现象:

验证集表现不错,真实使用一塌糊涂。

 

这不是模型“突然变坏了”,而是你评估时看的世界,本来就不是真实世界。

 

12.png 训练分布 / 验证分布 / 真实分布的关系图

 

 

为什么“人工评估”不可替代,但又如此痛苦

当 loss 不再可靠,自动指标又很有限,最终你一定会走向人工评估。

 

但人工评估恰恰是很多工程师最抗拒的部分。

 

原因很现实:

  • 主观

  • 难复现

  • 很难规模化

 

但你不得不承认,在微调这种高度依赖目标定义的任务里,人工判断本身就是最核心的信息来源。

 

你想让模型更“谨慎”,

更“像客服”,

更“不像胡说八道”,

 

这些东西,本质上就只能由人来判断。

 

一个现实问题:人工评估为什么经常变成“拍脑袋”

很多团队做过人工评估,但效果并不好,原因通常不是“人不专业”,而是流程设计有问题。

 

最常见的几个问题是:

  • 没有固定对照问题

  • 每次看的问题都不一样

  • 评估标准不统一

  • 评估结论无法沉淀

 

结果就是:

每一轮评估都像一次新的讨论,无法积累共识。

 

一个更可执行的做法:固定对照集 + 对比输出

在工程实践中,我更推荐一种非常朴素、但可持续的方法。

 

准备一小批你非常熟悉的问题,数量不需要多,十几到几十个就够。

这些问题应该覆盖你最关心的风险点、边界点和核心场景。

 

每一轮微调后,用完全相同的输入,对比模型前后的输出。

 

你不需要一开始就给分数,只需要回答几个问题:

  • 这次输出在哪些地方变了?

  • 这些变化是不是我想要的?

  • 有没有明显的副作用?

 

这种方式虽然“笨”,但信息密度极高。

 

13.png 对照评估流程示意图

 

什么时候“量化评估”才真正有意义

这并不是否定量化评估,而是要把它放在合适的位置。

 

量化指标在以下几种情况下,才会真正有价值:

  • 目标已经被明确拆解

  • 评估维度相对单一

  • 你关心的是趋势,而不是绝对值

 

比如在偏好排序、拒答率、结构合规率等场景中,量化指标就非常有用。

 

但在模型行为仍然模糊、目标尚未收敛的阶段,过早追求量化,只会制造假象。

 

一个简单但实用的半自动评估示例

下面是一个非常简单的示例,展示如何在人工评估基础上,做一点轻量的统计辅助。

 


questions = load_eval_questions()

 

before = run_model(base_model, questions)

 

after = run_model(tuned_model, questions)

 

def contains_refusal(text):

    keywords = ["无法", "不能", "不确定", "建议联系人工"]

    return any(k in text for k in keywords)

 

refusal_before = sum(contains_refusal(x) for x in before)

refusal_after = sum(contains_refusal(x) for x in after)

 

print("Refusal rate before:", refusal_before / len(questions))

print("Refusal rate after:", refusal_after / len(questions))

 

这段代码并不能告诉你模型“好不好”,

但它能帮你验证一个非常具体的问题:

你期望的行为,有没有在整体上变得更常见。

 

为什么评估几乎一定是一个“反复推翻自己的过程”

这是评估比训练更让人痛苦的地方。

 

训练一旦跑完,结果就在那里;

但评估过程中,你很可能会不断发现:

  • 之前定义的“好”不够准确

  • 之前关注的指标并不重要

  • 模型的副作用被低估了

 

评估本身,会不断逼着你修正目标。

 

而这,恰恰是很多团队不愿意面对的事情。

 

一个现实建议:别指望一次评估就“盖棺定论”

评估不是一个“通过 / 不通过”的开关。

它更像一个不断校准认知的过程。

 

你应该期待的,不是一个完美结论,而是:

你对模型行为的理解越来越清楚。

 

在需要频繁对比不同微调版本、快速回放输出变化时,使用 LLaMA-Factory online 这类工具来缩短验证路径,往往能把评估成本压到一个可接受的范围。

 

总结:评估之所以更难,是因为它逼你面对“你到底想要什么”

写到这里,其实答案已经很清楚了。

  训练难,是工程问题;

评估难,是认知问题。

  评估要求你不断追问:

  • 你真正关心的是什么?

  • 你愿意为哪些变化付出代价?

  • 哪些“看起来更好”的东西,其实并不重要?

  也正因为如此,评估才是微调里最有价值、也最不可替代的一环。