当你把 temperature 设为 0 时,whisper.cpp 其实准备了 6 套后备方案——从源码拆解 ASR 推理参数体系的每一个工程决策
打开whisper.h的第 487 行,你会看到一个庞大的结构体whisper_full_params——它有超过 50 个字段,从采样策略到语法约束,从 VAD 参数到四种回调函数指针,几乎涵盖了一个工业级 ASR 推理引擎需要做出的所有决策。但真正让我停下来反复读了三遍的,不是这个结构体本身的大小,而是whisper_full_with_state函数中的一段不起眼的代码:当你老老实实地把temperature设为 0.0、temperature_inc保持默认的 0.2 时,引擎会悄悄地为你准备一个包含[0.0, 0.2, 0.4, 0.6, 0.8, 1.0]六个温度值的后备列表——如果第一次贪心解码的结果不够好,它会自动升温重试,最多重试五次,直到温度升到 1.0。这意味着你以为的"确定性解码",实际上是一个精心设计的"渐进式随机化降级策略"。这篇文章将从源码层面,逐一拆解whisper_full_params中每一个参数背后的设计意图和工程权衡。我们不会止步于"这个参数是什么",而是要深入到"为什么默认值是这个"、“它在推理循环的哪个环节生效”、“调错了会产生什么后果”。一、采样策略的双轨制:Greedy vs Beam Search 的工程博弈1.1 从 Softmax 分布到 Token 选择——采样的本质在深入源码之前