LLM 随机性与种子机制
LLM 随机性与种子机制
核心命题:LLM 的”随机”是采样意义上的伪随机,分布由前序上下文锁死。给一个固定 prompt,第一 token 的分布几乎不变;temperature 改的是采样平坦度而非分布形状本身。要真随机,必须改变条件——加入外部随机锚(语义域指令、随机种子串、外部熵源),但加锚意味着语义约束。
现象起点
Rick 反复让 Claude 列 10 个”尽可能不相关”的词,发现第一个词高频是螺丝刀/螺栓/棘轮一类机械工具词。问题被切到产品架构层:为什么?
为什么相同上下文 → 相似首词
每个 token 生成是对前序 token 条件下分布的采样。相同 prompt → 几乎相同的条件 → 几乎相同的概率分布。temperature 只是把分布拉平或压尖:
- temperature 0:贪心,确定性最强
- temperature 0.7-1.0:保留概率质量结构,只放大长尾被选中的几率
- temperature → ∞:分布趋平,但即便如此,“质量集中的区域不变”
所以反复运行只是反复从同一分布抽样,自然频繁命中相邻高概率区。
为什么偏偏是”机械/工具”类
这不是巧合,是 meta-pattern:模型在训练数据里学到”当人类要求生成不相关的词,什么词是好的起始锚”。机械工具类满足三个原型条件:
- 语义具体(不抽象)
- 日常但不高频(不像”水/手”那么 generic)
- 与其它语义域距离远(满足”不相关”约束)
LLM 把”举不相关例子”内化为一种范式,机械工具词成了首选原型。
第一 token vs 后续 token
- 第一 token:分布完全由 prompt 决定,自由度最低
- 后续 token:已生成词成为新条件信息,模型会主动回避语义相近区(因为训练数据里”不相关列表”的样本就是这么分布的)
- 多样性沿序列单调上升
”种子”在 API 层的实际状态
很多 LLM 在 API 上不暴露 seed 字段(或暴露但行为不保证确定性)。Anthropic Messages API 当前没有公开 seed 参数;OpenAI 有但只承诺”通常确定性”。Rick 试过的”参考编号:7X9Q3”在 prompt 里加文本随机串,无效——因为模型不会把这个串理解为”对采样器加扰”,而是当作语义内容继续生成。
要让 LLM 真”随机”,三条路径:
- 改采样器:API 层 seed/top_p/temperature 联调,但只能在分布平坦化层面起作用
- 改条件:往 prompt 里塞真正的随机锚(指定语义域、给一段乱码作 hash 输入)。代价:语义约束 → Rick 反对的”指定语义域就不够随机了”
- 外部熵源:调用前先用 /dev/urandom 等抽一个真随机选择,再喂给 LLM 当作”题目”
Rick 的产品视角
[!quote] Rick 的关键介入 不行,我指定语义域就不够随机了。这个游戏需要的就是 llm 的随机
这一句把问题暴露成产品级别的两难:游戏场景要的是”无锚点真随机”,但 LLM 架构上根本没有不依赖条件的输出——它的”随机”永远是条件分布上的采样。这意味着 LLM 不是合适的随机数发生器,但作为有偏好的”原型生成器”恰好胜任。把它用错了的人很多。
关联节点
- Claude — 当前 API 行为参考
- Claude Code — Rick 主要使用环境
- c10 - Agent 技术栈与工具调用 — 上层 Agent 在其上构建
- Scaling Laws — 训练分布如何决定 inference 行为