上午问 AI 一个问题,答得头头是道;下午拿同样的问题再问一遍,答案却走了样——很多人由此断定模型「看心情」,或者怀疑自己记错了上午的问法。GPT 这类模型的输出不稳定是真实存在的,但它有明确的机制来源,也有可调的参数,学会调参就能把稳定性握在自己手里。这篇从机制篇的角度讲三件事:随机性从哪来、两个随机性参数各自怎么起作用、工程上如何按任务类型定参数,顺带讲清 seed 这个参数能把「可复现」做到什么程度。
同问不同答:先认清采样这回事
先纠正一个直觉误解:模型并没有记住「标准答案」,它在每一步生成时输出的是一个概率分布——下一个词是「是」的概率多少、「可能」的概率多少,然后从这份分布里抽一个词出来接着往下写。抽签就有随机性:同样的分布,这次抽中这个、下次抽中那个,文字随即分岔,分岔之后的整段答案自然长得不一样。所以同问不同答是采样机制的正常表现,是模型「设计如此」,故障或异常无从谈起。这个现象在产品侧与参数侧各有对照:网页版用户感受到的答案多变,现象层面的解释见答案多变一篇;写程序调 API 的人手里多了两个旋钮,可以直接调节这份随机性——那就是下面要讲的 temperature 与 top_p。
temperature:给概率分布调温的旋钮
temperature 控制的是抽签前的分布形状。低温(趋近 0):分布变尖,概率最高的词几乎垄断抽签,输出趋向最「标准」的答案——稳定、可预期、重复性强,代价是语言呆板,遇到开放问题容易车轱辘话来回说。高温(趋近 1 或更高):分布变平,低概率词也有机会被抽中,输出更有变化与新意,代价是跑偏概率同步上升,事实性错误与离题都在这一侧滋生。参数语义的通用原理见temperature 参数一篇,各家实现一致。实用参考:分类、抽取、格式化这类有标准答案的任务用低温;创意写作、命名、头脑风暴用中高温。要强调一句:温度只改变「选哪个词」,不改变「哪些词对」——它不能让模型变得更聪明,只改变它表达的多样性。
top_p:另一种收窄,别两个一起拧
top_p 是从另一个方向控制随机性的参数:不管分布多平,只从累计概率达到 p 的那一小撮候选词里抽签。p 设小(比如 0.1),候选圈缩到最有把握的几个词,效果接近低温;p 设大,候选圈放开,随机性增加。它与 temperature 达成的是同一个目标——控制输出的随机程度——只是从「改变分布形状」换成了「直接圈定候选范围」。工程实践里的建议很干脆:两个参数只调一个。两个一起拧时,行为互相纠缠,你很难说清某个输出变化到底归因于谁,排查问题与复现实验都会变难。主流做法是固定 top_p、按需调 temperature;迁移到其他家 API 时也类似,Kimi(Moonshot)与通义千问的接口同样提供这两个参数,语义相近,跨平台时把调参习惯平移过去基本成立,个别取值范围差异以各家文档为准。
seed 与可复现:确定性到哪一步为止
调参之外,还有一条通往稳定输出的路:seed。抽签用的随机数生成器可以播种——同样的 seed、同样的参数、同样的输入,采样过程就会走出同样的路径,输出保持一致。这对工程场景价值很大:跑评测集时固定 seed,两次结果才有可比性;排查问题时固定 seed,改一个变量看效果,归因才干净。但要把「可复现」的边界讲准:seed 保证的是采样层的确定性,模型服务本身的软硬件环境、底层版本变化仍可能带来输出差异,这类因素不在你的控制范围内,截至发稿版本,以官方更新日志为准。做严肃对比实验时,除了固定 seed,还应记录返回里的指纹类字段(如 system_fingerprint),两边的指纹一致,对比才成立;指纹变了,差异就可能来自模型侧而非你的改动。
工程取舍:按任务类型定参数
把前面的内容收进一张取舍清单。要稳定压倒一切的场景——结构化输出、工具调用、批量打标——低温起步,配合结构化输出约束效果更好:JSON 字段一旦靠「抽签」生成,格式错误率随温度上升,schema 约束的用法见结构化输出一篇,function calling 的参数同样建议低温调用,见function calling一篇。要多样性的场景——起名、文案、探索多种解法——温度调高,但配一个质量筛选步骤,多样性换来的候选要有人或规则把关。要可复现的场景——评测、回归测试、A/B 对比——固定 seed 加低温,双保险。验证稳定性的办法也简单:同一输入固定参数跑十次,观察结果分布;分布宽说明随机性高,按需收紧。参数调到什么程度算「合适」,最终以你的任务指标为准,而不是以手感为准——这个判断思路与评估实验设计的通用原则一致,见方差来源一篇。
| 任务类型 | 温度取向 | 配套动作 |
|---|---|---|
| 结构化输出、工具调用、批量打标 | 低温起步 | 叠 schema 约束;function calling 的参数同样低温调用 |
| 起名、文案、探索多种解法 | 调高 | 配一个质量筛选步骤,候选要有人或规则把关 |
| 评测、回归测试、A/B 对比 | 低温 | 固定 seed,并把返回里的指纹字段纳入记录 |
输出稳定性速查
- 同问不同答是采样的正常机制,模型没有「标准答案库」
- 低温稳定呆板,高温多样易跑偏,按任务方向选
- temperature 与 top_p 只调一个,主流做法固定 top_p
- seed 保证采样可复现,但模型侧环境变化不在控制内
- 结构化与工具调用场景低温 + schema 约束双管齐下
- 验证办法:同输入固定参数跑多次,看结果分布
关于输出不稳定的常见疑问
- 把 temperature 设成 0,输出就完全一致了吗?:实践中非常接近一致,但「完全」二字要谨慎:采样趋近于选最高概率词,多数平台近似确定性;不过底层环境变化仍可能引入差异,多次调用偶尔出现个别用词不同属于正常范围。需要严格一致的实验,固定 seed 再叠加低温,并把指纹字段纳入记录。
- 网页版 ChatGPT 能调 temperature 吗?:一般不能,网页版面向对话体验,不暴露采样参数;自定义指令与对话习惯影响的是内容偏好,控制不了随机性本身。需要参数级控制的,走 API 或支持参数设置的开发者工具。
- 输出不稳定,会不会是模型被降智了?:参数与版本两条先查。先确认你的调用参数没变(温度、top_p、seed、模型名),再确认模型版本与指纹有没有变化,最后对照状态页看有没有降级公告;三样都排除后仍有异常,再用固定输入做对照测试,把结论建立在数据上再下判断。
参数解决的是「怎么调稳」;如果你要的是「怎么让答案更贴合需求」,那是提示词工程的领地,两件事互补而不互替。评测自己调参效果时,也可以把同一组测试问题分别发给通义千问与 Kimi 的开放接口对照一轮,跨模型看一遍,你对「随机性」的体感会准得多。


