ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

图解温度与采样:同一个问题为什么每次回答不一样

图解温度与采样:同一个问题为什么每次回答不一样 版权与内容来源声明本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容均在附表 A 中标注来源引用官方原文保持原样不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准标注「待验证」的部分请以你本地环境实际输出为判断依据。本文不推荐任何不合规的软件获取方式也不对任何收益结果作承诺。转载请注明出处。第1章 同一个问题为什么每次回答都不太一样1.1 权重要不变、提示词没变变的是「解码」你有没有遇到过同一个问题、同一段提示词连着问两次模型给的答案却不完全一样尤其是让它写一段文案、生成几行代码刷新一下就换了个说法。很多人第一反应是「模型是不是抽风了」「是不是没训练好」。其实不是。本账号之前写过「图解模型量化」讲怎么压缩数值精度、「图解上下文工程」「图解函数调用」那几篇多是在讲「喂给模型的输入」和「模型的结构」这一层。本文要讲的是另一条链路解码阶段。一句话先给结论在「解码」这一步模型的权重没有变、提示词没有变变的是「从候选词里挑哪一个」这个动作里的随机性。也就是说模型每一步其实都给了一整张「候选词分数表」而「采样」就是从这张表里按概率抽一个——抽谁带运气成分。1.2 本文要立住的判据输出不稳定 解码阶段的随机性判断「输出为什么会变」要抓住一个可执行的判据如果换一个模型、换一版权重输出变了 → 那是模型本身的差异不在本文讨论范围如果模型、提示词、参数全部相同只是「再跑一次」就变了 → 这几乎一定是解码阶段的采样随机性也就是本文的主角。抓住这个判据后面所有参数温度、top-k、top-p、seed都是在回答同一个问题怎么控制这层随机性。1.3 本文结构速览下面七章依次讲四步机制链条第2章→ 温度到底改了什么第3章→ top-k 与 top-p 怎么在候选池截断第4章→ 温度调到 0 是不是就完全一样第5章→ 按任务类型怎么选参数第6章→ 一个能亲手跑的参数敏感性小实验第7章。第2章 解码到底发生了什么四步机制链条2.1 第一步模型只输出一张「分数表」先澄清一个常见误解大模型并不是「直接吐出一个词」。它在每一步做的是——根据已经写出来的内容给词表里的每一个候选词算一个分数。这个分数在技术上叫logits人话一张「每个候选词一个分数」的表分数越高模型当下越想选它。注意这一步是确定的同样的输入、同样的权重算出来的这张分数表完全一致。变数的开关在下一步。2.2 第二步温度把分数差距放大或压平拿到分数表后会先做一次 softmax人话把一整张分数表变成「加起来等于 1 的概率分布」这样每个词都有一个被选概率。然后温度登场它不改变「谁分高谁分低」这个顺序只改变分数之间的差距被放大还是被压平。温度低比如接近 0差距被放大原本最高的那个词概率被推得极高几乎稳赢温度高比如 0.8、1.0差距被压平原本不太可能的小众词也获得了一搏的机会。官方文档里对温度的描述OpenAI是「What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.」原文见附表 AHugging Face 对temperature的文档原文是「The value used to module the next token probabilities.」注意官方原文就是 module 这个拼写本文原样引用不作修正。2.3 第三、四步从候选里挑一个再循环第三步从这张被温度处理过的概率表里挑一个词出来——要么永远挑概率最高的这就是「贪婪解码」greedy decoding人话每步都选当下最稳的那一个要么按概率随机抽一个这就是「采样」sampling。Hugging Face 对do_sample的原文是「Whether or not to use sampling; use greedy decoding otherwise.」第四步把这个词接到已经生成的内容后面再回到第一步直到写完或触发停止条件。把四步串起来就是下面这张表步骤动作是否确定受哪个参数影响第1步 打分对词表里每个候选词算一个分数logits确定同输入同权重结果一致模型权重、提示词第2步 调温做 softmax 后用温度放大/压平分数差距确定温度值固定则结果一致temperature第3步 挑选从概率分布里选一个词取最高 or 按概率抽不确定抽哪一个是随机的是否采样、top-k、top-p、seed第4步 循环把选出的词接回去重复上面三步取决于第3步同上关键判据前三步在数学上都是确定的唯一会引入随机性的就是第3步的「抽」。所以「为什么每次不一样」答案就在第3步。第3章 温度到底改了什么3.1 温度不改变候选顺序改的是「低分候选被选中的机会」这是最容易被误解的一点要立住温度不改变候选词的排名顺序。温度调高并不会让原本第 5 名的词变成第 1 名它做的是「把差距抹平」让第 5 名也有机会被抽中。用大白话讲温度管的是「胆子大小」。温度低模型很保守基本只敢选它最有把握的那个词温度高模型胆子大愿意赌一赌那些概率不高但可能更出彩的说法。3.2 两个极端极低温度 ≈ 贪婪解码温度高 → 长尾候选两个极端最能说明问题极低温度趋近 0分数差距被放得极大最高分词的概率几乎被推到 1于是「抽」这个动作几乎总是抽到它——效果上等价于「每步都选最高分」也就是第2章说的贪婪解码。Anthropic 文档原话「Use temperature closer to 0.0 for analytical / multiple choice」。原文见附表 A温度升高长尾候选概率很低、但可能更生动或更跑偏的词开始有被抽中的机会。好处是文本更发散、更有创意坏处是更容易「跑偏」——说出不相关、甚至事实错误的句子。下面这张表把中间的区间也列出来方便对照温度区间经验参照非收益承诺候选池被怎么处理典型表现适用场景举例趋近 0差距被放大最高分词几乎必胜输出稳定、保守、偏模板化抽取、分类、确定性问答0.2 ~ 0.5差距略压平低分候选偶尔出场较稳但有少量变化代码补全、结构化输出0.6 ~ 0.9差距明显压平长尾词常出场发散、创意强、易跑偏文案、头脑风暴1.0 及以上OpenAI 上限 2差距被高度压平高度随机、波动大纯发散探索慎用注上表的「区间」是业界常见用法参照不是官方承诺的「最佳值」具体怎么定要看任务有没有唯一正确答案第6章展开。第4章 top-k 与 top-p在「候选池」这一层做截断4.1 top-k固定个数截断温度处理完分数后、正式「抽」之前还有一道「候选池」的过滤网。top-k的做法是不管分数怎么分布只保留概率最高的 k 个词其余全部扔掉再从这 k 个里抽。Hugging Face 文档对top_k的原文是「The number of highest probability vocabulary tokens to keep for top-k-filtering.」原文见附表 A默认值 50人话top-k 等于「先圈定排名前 k 的候选人再抽签」。k 越小越保守k 越大越开放。4.2 top-p固定累计概率截断nucleus samplingtop-p也叫 nucleus sampling核采样换了一种截断方式不固定个数而是按概率从高到低累加一直加到累计概率达到 p就把这些词圈成候选池其余扔掉。OpenAI 文档原文「An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.」原文见附表 A两者的区别用一张表说清维度top-ktop-pnucleus sampling截断依据固定个数前 k 个固定累计概率加到 p 为止候选池大小永远恰好 k 个随每一步模型信心变化信心高时池子小信心低时池子大官方描述要点HF保留概率最高的 k 个词OpenAI只保留累计概率达到 p 的词集合直觉「只从排名前几里选」「只从够格的那一撮里选」4.3 为什么工程里常只调其中一个注意一个工程上的硬约束温度、top-k、top-p 是层层叠加的过滤网而不是互相替代的开关。但官方普遍建议「不要同时大改温度和 top-p」。OpenAI 原文「We generally recommend altering this or top_p but not both.」Anthropic 在 Bedrock 文档中也写「When adjusting sampling parameters, modify either temperature or top_p. Do not modify both at the same time.」原文见附表 A原因很实际温度和 top-p 都在「压平/收窄分布」这件事上发力两个一起猛调效果会互相放大、难以解释「到底是哪个参数在起作用」。所以工程惯例是——温度定「胆子」top-k 或 top-p 二选一定「候选池口径」一次只动一类方便排查。下面这张「作用在哪一层」的总表是理解全篇的关键参数作用在四步链条的哪一层它实际改了什么会改变候选排名吗temperature温度第2步 调温放大/压平分数差距不改排名只改低分被抽中的概率top-k第3步前的候选池过滤只保留概率最高的 k 个词会删掉排名靠后的但不改变留下的顺序top-pnucleus第3步前的候选池过滤只保留累计概率达 p 的词集合同上按概率动态截断seed随机种子第3步 抽的随机源固定随机数序列使「抽」可复现不改排名只让抽的结果可复现一个只调温度的请求参数示例如下未在本机跑通字段以你用的接口为准⚠️代码待验证{model:你的模型名,messages:[{role:user,content:从下面文本中抽取订单号订单号 20260929-001金额 99 元。}],temperature:0.2,seed:42}若改用 nucleus sampling就把 temperature 换成 top_p例 0.95二者不并用与官方建议一致。截至 2026-09-29 的参数可用性提醒采样参数并非在所有平台、所有模型上都能手动设置。Anthropic 官方 API 文档已把temperature、top_k、top_p标注为 Deprecated并写明 “Models released after Claude Opus 4.6 do not support setting temperature. A value of 1.0 will be accepted for backwards compatibility, all other values will be rejected with a 400 error.”Opus 4.6 之后发布的模型不再支持设置 temperature非默认值会被拒绝。这意味着本文讲的是机制层面的事长期成立但能不能手动调取决于你调用的模型与平台。动手前先查你所用模型的最新参数文档不要照抄网上旧教程里的参数建议。第5章 温度调到 0是不是就完全一样了5.1 直觉0 应该完全确定很多人以为温度设成 0不就等价于贪婪解码、每步都选最高分那两次跑出来肯定一模一样加上官方 API 还提供了seed随机种子参数于是更觉得「固定 seed 就能复现」。5.2 真实官方自己说「不保证完全一致」先把最重要的依据摆出来。OpenAI 对seed参数的官方原文写道逐字引用“This feature is in Beta. If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.”注意那句关键话「Determinism is not guaranteed」——确定性「不被保证」。也就是说seed只是「尽力而为」best effort不是「保证一致」。不仅是 OpenAIAnthropic 在 temperature 的说明里也直接写了「Note that even with temperature of 0.0, the results will not be fully deterministic.」原文见附表 A——即便温度调到 0结果也不会完全确定。5.3 为什么会不一致三个真实原因既然温度 0 seed 都不保证一致根因在「抽」这一步之外更底层的地方。常见原因有三浮点运算顺序不固定概率计算是大量浮点乘加不同框架、不同实现下加法的结合顺序可能不同微小的尾数误差会累积进而让「本该并列第一」的两个词次序反转。批处理与算子实现差异服务端常把多个请求拼成一个批次batch跑算子矩阵乘法的底层实现在不同硬件后端上可能走不同 kernel结果末位会有差异。服务端硬件与并行策略不同模型部署在不同代次的训练卡、不同并行切分策略下数值结果并非逐位一致即便同型号浮点非结合律也会带来偏差。要点这些都不是「模型抽风」而是浮点计算本身的固有特性。所以「温度 0 完全一样」这个直觉在论文和工程上都不成立。5.4 那 seed 还有没有用有但要放对预期seed的价值在于提高复现概率、便于排查而不是「锁死结果」。OpenAI 还提供了一个system_fingerprint字段用来监控后端是否发生了变化——如果 fingerprint 变了结果可能随之变化。所以工程上更稳妥的做法是把 seed 当作「尽量固定」的手段而不是「保证相同」的手段。配套资料这一章讲到的官方原文与参数边界我整理进了资料包里的「采样参数速查卡」扫码即可获取第6章 工程取舍按任务类型定参数6.1 判据任务有没有唯一正确答案参数怎么设不能拍脑袋。本文给一个可执行的判据看任务有没有「唯一正确答案」。有唯一正确答案抽取、分类、确定性转换→ 要稳定、要可复现 → 低温度、可不采样、尽量固定 seed没有唯一正确答案创意、发散、多方案探索→ 要多样、要惊喜 → 高温度、开启采样、不必强求一致。这个判据不是「经验之谈」而是直接对应第2章第3步的「抽」有标准答案时我们希望「抽」尽量不发生没标准答案时我们恰恰要靠「抽」来产出多样性。6.2 任务类型参数建议表按上面的判据给出一张建议表注意这是「取向」建议不是「调到 X 就一定好」的承诺任务类型有没有唯一答案温度取向是否要采样是否固定 seed依据信息抽取如从文本抽字段有低趋近 0否 / 弱采样建议固定错一个字段就错要稳定分类打标签、判类别有低趋近 0否建议固定类别应唯一确定代码生成较唯一低 ~ 中0.2 左右参照否 / 弱采样建议固定语法结构要稳少量变化可接受文案创作无中 ~ 高0.6~0.9 参照是可不固定要多样性不怕不同说法多候选发散头脑风暴、起名无高是 用 n 多生成几份可不固定要尽可能多不同方案注n是「一次请求生成几个候选」的参数OpenAI 原文见附表 A默认 1。多候选发散场景常用它一次性拿多个结果再人工挑。6.3 可复现的工程约定日志记什么把「不确定性」当成一个正常事实来管理而不是当成 bug。一个最小可用的工程约定——日志里至少记这几项日志字段为什么记不记会怎样模型名 版本号同模型不同版本结果可能不同出问题无法定位是否模型变动temperature / top-k / top-p直接决定分布形状无法复现同样的随机性设置seed辅助复现不保证一致失去「尽量固定」的抓手时间戳 / 后端 fingerprint捕捉服务端变化同样参数结果变了却查不出原因记这些不是「过度工程」而是因为第5章说的——即便参数全同后端变化也可能让结果漂移。6.4 验收阶段如何对待「不确定性」最关键的工程纪律不要一次运行定论。正确做法是「多次运行取一致性」——同一个输入连跑 N 次比如 3~5 次看关键结论是否稳定。对「有唯一正确答案」的任务如抽取可以用「多次抽取取交集 / 多数投票」来提升可靠度比如跑 5 次抽同一字段取出现次数占多数的那个值作为最终结果而不是赌单次抽对。对「无唯一答案」的任务则看「多样性是否够、质量是否达标」而不是「两次是否一样」。第7章 可交付项目参数敏感性小实验7.1 实验设计同一问题、固定提示词、多组温度/seed把你前面学到的串成一个能亲手跑的项目统计「同一问题在不同温度 / 不同 seed 下两次运行结果的一致率」。设计要点选一个有唯一答案的小任务比如「从这段 JSON 里抽出订单号」这样「一致」才好判断固定提示词只变 temperature 和 seed 两个旋钮每组参数跑两次或三次比对两次输出是否一致把「一致 / 不一致」记进一张表最后算一致率。7.2 记录表怎么设计下面是一张可直接套用的记录表模板markdown 形式作为示例文本给出| 组别 | temperature | seed | 第1次输出 | 第2次输出 | 是否一致 | 备注 | | ---- | ----------- | ---- | -------- | -------- | -------- | ---- | | A | 0.0 | 42 | ... | ... | 是/否 | | | B | 0.0 | 42 | ... | ... | 是/否 | 同组复跑看seed是否稳住 | | C | 0.8 | 42 | ... | ... | 是/否 | 高温下是否更易不一致 | | D | 0.8 | 7 | ... | ... | 是/否 | 换seed看影响 |判读建议如果 temperature0 且 seed 固定时仍出现「不一致」正好印证第5章——seed只是 best effort如果 temperature 升高后不一致明显变多说明「抽」的随机性在主导输出。7.3 实验脚本骨架未实测下面给一个多次运行、统计一致率的脚本骨架未在本机实测仅供结构参考实际调用前请按你用的 SDK 与接口填好密钥与模型名⚠️代码待验证importopenai# 或其他你使用的 SDK按实际替换PROMPT从下面的文本中抽取订单号订单号 20260929-001金额 99 元。MODEL你的模型名# 替换成实际模型GROUPS[{temperature:0.0,seed:42},{temperature:0.8,seed:42},]defrun_once(temperature,seed):# 返回模型输出文本下面调用按你用的接口填写respopenai.chat.completions.create(modelMODEL,messages[{role:user,content:PROMPT}],temperaturetemperature,seedseed,)returnresp.choices[0].message.contentforginGROUPS:out1run_once(g[temperature],g[seed])out2run_once(g[temperature],g[seed])print(g,一致ifout1out2else不一致)这个骨架说明「多次运行取一致率」是怎么落地的真要做严谨统计建议每组跑 3~5 次再算一致率而非只看两次。7.4 把实验沉淀成你的「参数手感」这个实验的价值不在「得出某个神奇数字」而在于让你亲眼看清温度、seed 到底在多大程度上影响输出。跑完一轮你对「我的任务该用多高温度、要不要固定 seed」会有属于自己的判断而不是照搬别人的经验值。配套资料实验用的「记录表模板 各平台参数对照」我放进资料包了扫码即可获取附表 A本文引用事实与出处对照表事实出处文档名 发布方 链接本文位置OpenAI temperature 原文「What sampling temperature to use, between 0 and 2…」以及「We generally recommend altering this or top_p but not both.」OpenAI Create chat completionChat Completions API Referencehttps://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create/第3、4章OpenAI top_p / nucleus sampling 原文「An alternative to sampling with temperature, called nucleus sampling…」同上第4章OpenAI seed 原文「Determinism is not guaranteed…」同页该参数标注为 Deprecated / Beta同上第5章OpenAI n 原文「How many chat completion choices to generate… Keep n as 1 to minimize costs.」同上第6章best_of截至 2026-09-29 核到的 OpenAI Chat Completions 文档未列出该参数旧版 Completions 接口曾提供当前状态待验证OpenAI 文档待验证第5章脚注Anthropic temperature 原文含「even with temperature of 0.0, the results will not be fully deterministic」Anthropic Messages API ReferenceAnthropichttps://platform.claude.com/docs/en/api/messages第3、5、6章Anthropic top_k 原文「Only sample from the top K options… Used to remove long tail low probability responses.」同上第4章Anthropic top_p / nucleus sampling 原文「In nucleus sampling, we compute the cumulative distribution…」同上第4章Anthropic Bedrocktop_p 默认 0.999top_k 默认关闭且「modify either temperature or top_p, do not modify both」AWS Bedrock Anthropic Claude Messages 文档Amazonhttps://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages-request-response.html第4章HF do_sample 原文「Whether or not to use sampling; use greedy decoding otherwise.」Hugging Face transformers 文档 main_classes/text_generationHugging Facehttps://huggingface.co/docs/transformers/main/en/main_classes/text_generation第2、3章HF temperature 原文「The value used to module the next token probabilities.」同上第2、3章HF top_k 原文「The number of highest probability vocabulary tokens to keep for top-k-filtering.」默认 50同上第4章HF top_p 原文「only the smallest set of most probable tokens with probabilities that add up to top_p or higher are kept」默认 1.0同上第4章HF 束搜索「is not guaranteed to find the most likely output」Hugging Face 博客 How to generate textHugging Facehttps://huggingface.co/blog/how-to-generate第2、3章Holtzman et al. 2019 摘要Nucleus Sampling 来源ICLR 2020arXiv:1904.09751 https://arxiv.org/abs/1904.09751第4章Fan et al. 2018 摘要top-k 采样来源Hierarchical Neural Story GenerationarXiv:1805.04833 https://arxiv.org/abs/1805.04833第4章附表 B术语速查表术语一句话解释在本文哪里用到logits分数表模型每一步给词表里每个候选词算的分数第2章softmax把一整张分数表变成相加为 1 的概率分布第2章贪婪解码 greedy decoding每步都选当下概率最高的词第2、3章采样 sampling按概率分布随机抽取一个词带来随机性第2、3章nucleus sampling核采样 / top-p只从累计概率达到 p 的那一撮词里抽第4章top-k只从概率最高的前 k 个词里抽第4章seed随机种子固定随机数序列让「抽」尽量可复现但不保证一致第5章system_fingerprintOpenAI 用来标识后端实现的字段变了结果可能变第5章写在最后这篇用到的资料写这篇文章时把相关的官方文档和源码又翻了一遍顺手也整理了几份配套的东西大模型学习路线图从零基础到能自己动手做 Agent按阶段说明每一步该学什么、哪些可以先跳过《LangChain LangGraph MCP 智能体开发实战》视频课7 个模块从私有化部署、EmbeddingRAG 到 MCPAgent 全流程AI 大模型知识库在线可查Agent Skills 从入门到落地、Claude Skills 完全指南等专题按目录浏览即可640 套 AI 大模型行业报告 经典 PDF 书籍看行业落地案例和别人怎么做的时候用得上大模型零基础到精通教学视频跟着敲一遍比只读文档快得多资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「AI」优先通过。资料按「先路线、再动手、最后查漏」的顺序整理好了建议先看学习路线那一份照着它挑一条适合自己当前基础的路径再往下看。
返回列表