AI 输出为什么不稳定:temperature 解决不了的那部分随机性
同一个提示词两次结果不同,调低 temperature 也不管用。本文拆解采样、批处理、MoE 路由、上下文漂移、工具调用时序等六类真实噪声源,以及怎么在工程上兜住。
“我们把 temperature 设成 0 了,为什么同样的输入还是得到不同的输出?”
这是接入 LLM 后最常见的技术困惑之一。答案是:temperature 只控制采样阶段的一个参数,而整条链路上还有很多别的随机源。
理解这些随机源,是做好工程的基本功。因为很多问题(比如评测结果不可复现、线上偶发错误、A/B 结果不稳定)都源自对它们的不了解。
源头一:采样本身,不止 temperature
采样阶段涉及多个参数:temperature(温度)、top_p(核采样)、top_k、repetition penalty。设 temperature=0 通常变成贪心解码——每次选概率最高的 token。理论上确定性。
但注意两点:
- 有些 API 在 temperature=0 时并不做严格贪心,而是保留极小随机性(实现细节)
- top_p 等参数在某些实现里仍会引入采样
更重要的是:即使解码完全确定,不同批次、不同硬件上的浮点运算顺序可能不同。GPU 上的矩阵运算会按批次并行,批次组成变了,累加顺序就变了,最后一位小数的差异可能让两个几乎同概率的 token 排名互换。这就是”输出前面一样、中间某个词开始分叉”的现象。
结论:在 API 场景下,不要假设绝对可复现。要做确定性验证,要么用支持固定 seed 且保证复现的推理后端,要么接受”语义等价”而非”逐字相等”。
源头二:上下文变了但你以为没变
最常见也最隐蔽的原因。看起来”同样的输入”,实际上:
- 系统提示词里有时间戳。
当前时间:2026-10-25 15:03:22,每秒都不一样 - 注入的历史消息顺序或数量不同。多轮对话里,上下文截断策略可能每次裁的位置不同
- 工具描述带动态内容。比如把当前可选的文件列表、可用的模型版本塞进提示词
- 检索结果变了。RAG 场景下,知识库有更新、索引重建,召回内容就不同
排查方法:把每次实际送给模型的完整请求体落盘。太多团队只在应用层打印”用户输入”,看不到真实的完整 prompt。把请求体存下来做 diff,这类问题十分钟就能定位。
源头三:MoE 架构带来的路由不确定性
2026 年主流大模型大多采用 MoE(混合专家)架构。每个 token 会被路由到少数几个专家网络。路由是计算出来的,涉及浮点比较——当两个专家的分数非常接近时,微小的数值差异可能导致路由到不同专家。
这在实践中表现为:某些提示词对细微改动极其敏感,改一个标点,输出风格都变了。这不是玄学,是路由分叉。
应对方法只有一个:别指望靠微调提示词达到确定效果,要靠结构。用明确的输出格式约束(JSON schema、枚举值),把自由度压到最低。
源头四:批处理与负载
供应商为了吞吐,会把多个用户的请求打包成 batch。batch 的组成随线上负载变化,进而影响浮点运算顺序(见源头一)。所以在高峰期和低峰期,同样的请求可能结果略有不同。
这也解释了一个现象:本地测试很稳,线上偶发出错。本地是单请求,线上是动态 batch。
源头五:工具调用的时序与副作用
Agent 场景的”不稳定”往往根本不是模型的问题,而是外部世界变了:
- 工具返回的数据本身在变(查库存、查汇率)
- 工具调用顺序不同(并行调用时返回顺序不定)
- 工具偶发超时,模型走了降级路径
- 工具返回格式有细微差异,模型解析方式变了
这类问题的定位方法是给工具调用加全链路 trace:记录每次调用的参数、耗时、返回摘要。看一次失败请求的 trace,通常一眼能看出是哪个工具返回了异常。
源头六:模型版本静默更新
供应商可能在不通知的情况下更新快照版本。行为变化通常很小,但足以让依赖精确格式的代码出错。
应对:在请求里显式指定模型快照版本(而不是 latest 别名),并在升级时跑回归测试。锁定版本意味着你放弃自动获得改进,但换来可预测性。生产系统通常应该锁版本,定期主动升级并验证。
工程上怎么兜住
既然不能消除随机性,就要在架构上吸收它。
一、输出结构强制。 用 JSON schema / 结构化输出,而不是让模型自由发挥文本格式。解析失败率会大幅下降。
二、语义验证代替逐字比对。 测试里判断”是否包含必要字段、取值是否在允许范围”,而不是比较字符串是否相等。
三、关键操作加幂等与校验。 写操作前先读、执行后回读验证。同样的请求执行两次不应该产生两份数据。
四、多次采样投票。 对准确性要求高的场景(分类、抽取),跑三次取多数。成本涨三倍,稳定性提升明显,比换更大的模型更划算。这些任务通常用便宜模型,三次的成本依然很低。
五、评测用统计而非单例。 评测集至少几十条,看整体通过率的变化趋势,不要因为一条用例失败就大改提示词。
六、把不确定性暴露给用户。 低置信度的结果,产品上应该有”可能不准,请核对”的提示,而不是装作确定。这既是体验问题也是责任问题。
一个心态上的建议
很多团队在追”让 AI 完全稳定”上花了过多时间。这大概率是徒劳的——底层是概率模型,绝对稳定不现实,而且随着模型变复杂,不确定性来源只会更多。
更现实的目标是:让系统在 AI 不确定时依然可靠。校验、重试、降级、人工兜底、可观测性,这些传统工程手段在 AI 时代没有过时,反而更重要。
模型只是一个不太可靠的组件。好的系统设计不假设组件完美,而是假设它会出错,并让错误可控。