---
title: "seed 能让输出完全可复现吗"
description: "seed 只能减少采样阶段的随机性，不能保证两次输出逐字一致。本文讲清模型版本、后端批处理与并发为什么仍会改变结果，temperature 设为 0 为什么不等于确定性，以及怎么记录可复现实验。"
updated: 2026-11-13
canonical: https://docai.cc/concepts/seed/
markdown_mirror: https://docai.cc/concepts/seed.md
---
## 它是什么

seed 是采样参数：一个整数，用来初始化生成过程中的伪随机数发生器。相同 seed、参数、模型和后端，理论上应该得到相同或很接近的采样结果。

「理论上」很重要。OpenAI 把这个能力定位成 beta，明确说系统会尽力保证确定性，但不保证结果相同。它还提供 `system_fingerprint` 字段，用来观察后端配置有没有变化。

Anthropic Messages API 的参数表里没有 seed。这不代表输出更随机，只是这条路在该接口上不存在。跨厂商做可复现实验时，不能假定同一套参数通用。

## 怎么工作

模型每生成一个 token，都会先算出候选词的概率分布，再按策略挑一个。[temperature](/concepts/temperature/) 控制分布的平滑程度，top_p 控制候选范围，seed 控制「挑」这一步使用的随机序列。三者分工不同：seed 不改变概率分布，只改变抽样时的随机起点。

把 temperature 设为 0 时，采样通常退化成每次挑概率最高的 token，抽样随机性基本消失。但确定性仍可能被打破：

- **模型版本变化。** 厂商更新权重或推理配置，相同输入就会变。系统指纹能提示这种变化，但不会阻止变化。
- **后端批处理与并发。** 你的请求会和别人的请求一起排队、一起算。批次组成不同，浮点运算的合并顺序可能不同，微小差异会放大成不同的 token 选择。
- **硬件与算子实现。** 不同机器与算子路径可能给出不同结果。

所以更准确的说法是：temperature 设为 0 去掉的是采样随机性，不是系统非确定性。seed 能固定前者，固定不了后者。

## 常见误解

**「seed 相同，输出一定相同。」** 不。OpenAI 自己写的是「尽力而为」；后端一变，同样的 seed 也会给出不同结果。

**「temperature=0 就等于确定性。」** 不等于。它只是让抽样变成取最大值，批处理和浮点误差仍在。概率并列时还可能选不同 token。

**「seed 可以跨模型、跨厂商复用。」** 不能。每个实现的随机数生成方式和后端不同，同一个数字没有可比性。

**「seed 可以当审计凭证。」** 不建议。审计需要的是当时实际返回了什么，而不是当时用了什么种子。种子只说明你尝试控制过随机性，不证明别人重跑能得到同样结果。

## 怎么记录可复现实验

做回归对比时，重点不是复现某一次输出，而是让比较公平。建议每次实验至少记录：

- 模型标识与版本快照，而不是只写模型大类；
- 全部参数：seed、temperature、top_p、max_tokens、停止序列；
- 完整的提示词模板与变量值，最好存模板版本或哈希；
- 工具定义、系统提示与上下文拼接方式；
- 原始响应、停止原因、token 用量；
- 系统指纹（如果有）与请求时间。

比较两次实验时，固定 seed 和 temperature，只改一个变量，每种配置跑多次看分布，不要拿一次输出下结论。单次差异可能来自噪声，聚合指标才说明问题。

审计级复现则不同：仅靠 seed 不够，还要保存原始输入输出，固定模型版本，记录运行环境；即便如此，也要接受重跑可能不同。把可复现写成可解释、可追溯，比承诺逐字一致更诚实。排查生成质量波动时，可以配合[评测改动](/learn/evaluate-changes/)一起看。

## 怎么排查

- 同样 seed 结果仍变：先比对系统指纹和模型版本，再看并发与批次是否变化。
- 改了提示词后差异很大：确认只改了一个变量，其他参数没有顺手变动。
- 两次运行温度都为 0 但结果不同：检查是否走了不同模型别名、不同区域或不同服务层级。
