R

LLM 随机性与种子机制

创建 2026-05-16 更新 2026-05-18 5 条双链 共创

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 真”随机”,三条路径:

  1. 改采样器:API 层 seed/top_p/temperature 联调,但只能在分布平坦化层面起作用
  2. 改条件:往 prompt 里塞真正的随机锚(指定语义域、给一段乱码作 hash 输入)。代价:语义约束 → Rick 反对的”指定语义域就不够随机了”
  3. 外部熵源:调用前先用 /dev/urandom 等抽一个真随机选择,再喂给 LLM 当作”题目”

Rick 的产品视角

[!quote] Rick 的关键介入 不行,我指定语义域就不够随机了。这个游戏需要的就是 llm 的随机

这一句把问题暴露成产品级别的两难:游戏场景要的是”无锚点真随机”,但 LLM 架构上根本没有不依赖条件的输出——它的”随机”永远是条件分布上的采样。这意味着 LLM 不是合适的随机数发生器,但作为有偏好的”原型生成器”恰好胜任。把它用错了的人很多。

关联节点