同一个问题连续问大模型几次,得到的答案往往不完全相同。
有时只是措辞变化,有时连结论和代码实现都会发生改变。很多人会把这种现象简单归结为"AI 有随机性",然后开始反复调整 temperature:写代码就设为 0,写文案就拉到 1。
但 temperature 究竟改变了什么?它会不会直接给模型增加创造力?Top-K 和 Top-P 又是在控制什么?
要理解这些参数,必须回到大模型最基础的工作方式:根据当前上下文,预测下一个 Token。
一、大模型不是直接想出一句完整答案
假设上下文中已经出现了"你好",模型准备生成下一个 Token。经过 Transformer 计算后,它不会立即得到唯一答案,而是得到一组候选 Token 的分数。
为了便于理解,可以把分数转换成下面这样的概率分布:
| 候选 Token | 概率 |
|---|---|
| 吗 | 0.60 |
| 啊 | 0.15 |
| 呀 | 0.10 |
| 美 | 0.05 |
| 坏 | 0.01 |
| 其他 Token | 0.09 |
"吗"的概率最高,但概率最高不代表模型每次都必须选它。
生成阶段通常有两类策略:
- 贪心选择:永远选择当前概率最高的 Token;
- 采样选择:按照概率分布随机抽取一个 Token。
如果始终使用贪心选择,输出通常比较稳定,但也容易机械、重复;如果允许在候选 Token 中采样,表达会更加多样,但错误和偏离主题的风险也会上升。
temperature、Top-K 和 Top-P,就是在真正抽取 Token 之前调整候选范围和概率分布。
二、Temperature 改变的是概率分布的形状
模型最初输出的通常不是概率,而是一组称为 Logits 的原始分数。Temperature 会在 Softmax 之前参与计算:
text
调整后的概率 = softmax(logits / temperature)
它不是凭空增加新的候选词,而是在重新调整已有候选词之间的概率差距。
Temperature 较低
当 Temperature 小于 1 时,高分候选会变得更加突出,低分候选的机会进一步下降。概率分布会更"尖锐"。
text
原始分布:吗 0.60、啊 0.15、呀 0.10......
降低温度:吗的优势继续扩大,其他候选更难被选中
输出通常具有以下特点:
- 稳定性更高;
- 多次执行的差异更小;
- 更适合工具调用、信息提取、代码生成和结构化输出;
- 但也可能更加保守、重复。
Temperature 较高
当 Temperature 大于 1 时,不同候选之间的概率差距会缩小,原本概率较低的 Token 获得更多机会。概率分布会更"平缓"。
输出通常更加多样,但同时也可能出现:
- 偏离原始要求;
- 选择不常见的表达;
- 事实错误增多;
- 格式约束更难保持。
因此,Temperature 控制的不是"模型聪不聪明",而是生成时愿意在多大程度上尝试低概率候选。
Temperature 为 0 怎么理解
从数学公式看,Temperature 不能直接除以 0。API 中的 temperature: 0 通常是服务端提供的一种特殊配置,用来尽量采用最稳定的生成策略。
它也不意味着任何情况下都能获得完全相同的结果。模型版本、服务端实现、并行计算、工具返回内容和上下文变化,都可能使输出发生差异。
所以更准确的说法是:
temperature: 0会尽量降低采样随机性,但不等于绝对确定。
三、Top-K:先把候选数量限制住
Temperature 调整的是概率差距,Top-K 控制的是最多保留多少个候选 Token。
如果设置:
text
Top-K = 3
模型会先按照概率从高到低排序,只留下前三个候选:
| 候选 Token | 原始概率 |
|---|---|
| 吗 | 0.60 |
| 啊 | 0.15 |
| 呀 | 0.10 |
"美""坏"和其他候选会被排除,然后系统对剩余三个 Token 重新归一化,再执行采样。
Top-K 较小时:
- 候选范围更集中;
- 输出更容易保持主题;
- 但表达可能单一。
Top-K 较大时:
- 候选范围更宽;
- 表达可能更加丰富;
- 低质量 Token 进入采样范围的概率也会增加。
需要注意,Top-K 并不是所有大模型 API 都直接开放的参数。它常见于 Hugging Face Transformers 和部分开源模型推理框架;OpenAI 兼容接口更常见的是 temperature 与 top_p。
四、Top-P:根据累计概率动态选择候选
Top-P 也叫 Nucleus Sampling,中文常译为核采样。
它不固定候选数量,而是从概率最高的 Token 开始累加,保留累计概率达到或超过指定阈值的最小候选集合。
假设:
text
Top-P = 0.8
按照前面的概率分布开始累加:
text
吗:0.60
吗 + 啊:0.75
吗 + 啊 + 呀:0.85
加入第三个 Token 后累计概率超过 0.8,因此这次保留"吗、啊、呀"三个候选。
Top-P 与 Top-K 的区别在于候选数量是否固定:
| 参数 | 选择方式 | 特点 |
|---|---|---|
| Top-K | 固定保留概率最高的 K 个 Token | 候选数量固定 |
| Top-P | 保留累计概率达到 P 的最小集合 | 候选数量随分布变化 |
当模型非常确定时,少量 Token 的累计概率就能达到 Top-P;当概率比较分散时,需要保留更多 Token。因此,Top-P 对不同上下文的适应性更强。
五、三个参数怎样共同参与生成
从概念上看,一次 Token 采样可以理解为:
text
上下文
→ 模型计算下一个 Token 的 Logits
→ Temperature 调整概率差距
→ Top-K 或 Top-P 缩小候选范围
→ 重新归一化概率
→ 按概率抽取一个 Token
→ 把新 Token 加入上下文
→ 继续预测下一个 Token
这个过程会一直循环,直到模型生成结束标记,或者达到最大输出长度。
不过,参数越多不代表控制越精确。以当前 DeepSeek Chat Completion 接口为例,官方文档建议通常修改 temperature 或 top_p 中的一个,而不是同时调整两个。
原因很简单:两个参数都会改变最终的采样空间。如果同时修改,很难判断输出变化究竟来自哪一个参数,也不利于后续测试和复现。
正确的调参方式应该是:
- 保持 Prompt、模型和测试数据不变;
- 每次只改变一个参数;
- 使用同一组问题重复执行;
- 比较正确率、格式稳定性、重复性和内容多样性;
- 根据真实业务结果选择参数,而不是直接照搬一个"万能值"。
六、为什么 Agent 和 RAG 项目经常使用 temperature: 0
在现有的 LangChain Agent 项目中,模型配置使用了:
javascript
const model = new ChatOpenAI({
modelName: process.env.DEEPSEEK_MODEL || 'deepseek-chat',
apiKey: process.env.DEEPSEEK_API_KEY,
temperature: 0,
configuration: {
baseURL: 'https://api.deepseek.com/v1',
},
});
这里使用低 Temperature,并不是因为 Agent 完全不需要创造力,而是因为这类任务更重视可控性。
例如,一个 Agent 需要决定:
- 是否调用工具;
- 调用哪一个工具;
- 参数应该填写什么;
- 拿到工具结果后是否继续执行。
如果模型在这些步骤中过度追求多样性,可能会选择错误工具、生成不符合 Schema 的参数,或者在相同输入下采用差异很大的执行路径。
RAG 也有类似需求。检索到的资料已经提供了事实依据,模型的主要任务是根据资料组织答案,而不是自由发挥。因此,较低 Temperature 通常更符合问答、摘要和事实整理任务。
但要特别注意:
降低 Temperature 只能减少输出波动,不能修复错误知识、检索失败或上下文缺失。
如果 RAG 没有检索到正确文档,即使 temperature: 0,模型仍然可能基于错误或不完整的上下文生成答案。
七、Temperature 在 LangChain 工作流中的位置
LangChain 的作用,是把 Prompt、模型、输出解析器和工具等节点连接成一条工作流。
例如,一条基础链可以表示为:
javascript
const creativeChain = storyPrompt
.pipe(creativeModel)
.pipe(outputParser);
await creativeChain.invoke('一段 prompt');
对应的执行顺序是:
text
输入
→ PromptTemplate 组织提示词
→ ChatModel 根据参数生成内容
→ StringOutputParser 解析模型输出
→ 返回业务结果
Temperature 属于模型节点的配置,不属于 PromptTemplate,也不是输出解析器的能力。
同一个应用可以根据任务选择不同的模型节点:
- 严谨模型负责事实提取、分类、工具决策和格式化输出;
- 创意模型负责标题、故事、营销表达和方案发散;
- 输出解析器负责把最终结果转换成业务需要的格式。
这种设计比在整个应用中使用同一个 Temperature 更合理。因为真实工作流中的每个节点,对稳定性和多样性的要求并不相同。
八、不同任务可以从什么范围开始测试
下面的数值不是固定标准,而是便于开始测试的经验范围。不同模型、不同服务商的实际表现可能不同。
| 任务 | 可尝试的 Temperature | 主要目标 |
|---|---|---|
| 工具调用、结构化提取 | 0~0.2 | 参数稳定、格式准确 |
| RAG 问答、资料摘要 | 0~0.3 | 忠于上下文、减少发挥 |
| 技术解释、普通对话 | 0.2~0.6 | 在稳定与自然之间平衡 |
| 标题和文案方案 | 0.6~0.9 | 增加表达差异 |
| 故事、创意发散 | 0.8~1.2 | 扩大候选空间 |
调高 Temperature 之前,应该先把 Prompt 的目标、上下文和输出要求写清楚。一个模糊的 Prompt 配上高 Temperature,只会放大不确定性,不会自动得到高质量创意。
九、几个常见误区
1. Temperature 越高,模型越聪明
错误。Temperature 不会改变模型已经学到的知识,也不会增强推理能力,只会改变生成阶段的采样分布。
2. Temperature 越高,内容一定越有创意
错误。更随机只意味着候选范围更宽,也可能产生不相关、低质量或事实错误的内容。创意质量还依赖模型能力、Prompt、上下文和筛选流程。
3. Temperature 设置为 0,就不会产生幻觉
错误。幻觉可能来自训练知识局限、问题含糊、上下文缺失、检索错误或工具结果错误。低 Temperature 只能让模型更倾向于高概率表达。
4. 所有模型都支持 Top-K
错误。不同厂商暴露的采样参数不同。写代码前应该查看当前模型的接口文档,不要把某个推理框架的参数直接搬到另一个 API。
5. Temperature 和 Top-P 一起大幅调整更有效
不一定。多个变量同时变化会让结果更难分析。优先固定其中一个,只测试另一个参数的影响。
总结
大模型的每一步生成,本质上都是在候选 Token 的概率分布中做选择。
- Temperature 调整候选之间的概率差距;
- Top-K 固定保留概率最高的 K 个候选;
- Top-P 根据累计概率动态确定候选集合;
- 低 Temperature 更适合工具调用、RAG 和结构化任务;
- 高 Temperature 可以增加多样性,但不等于提高模型能力;
- 调参应该基于固定测试集,每次只改变一个变量。
真正可靠的 AI 应用,不是找到一个适用于所有任务的 Temperature,而是根据工作流中每个节点的职责,分别控制稳定性和多样性。