深入理解大模型采样:Temperature:Top-K:Top-P 的原理与实战

作者:袖梨 2026-07-23

深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战


参数一句话调小调大
Temperature控制概率分布的锐利程度输出更确定、更保守输出更随机、更有创意
Top-K只保留概率最高的 K 个候选候选越少越保守候选越多越自由
Top-P保留累积概率超过 P 的最小集合候选越少越保守候选越多越自由

前言

你有没有好奇过:

深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战

  • 为什么同一个问题问 ChatGPT 两次,答案可能完全不同?
  • 为什么有时候 AI 回答很严谨,有时候又很"发散"?
  • 为什么写代码时建议用低 temperature,写小说时又建议用高 temperature?

这一切的答案,都藏在大模型的采样策略里。

读完本文,你将理解:

  1. 大模型"说话"的本质是概率采样
  2. 三个核心参数各自的数学原理和直觉理解
  3. 如何在实际项目中选择合适的参数组合
  4. 通过 LangChain 代码亲身感受不同参数的效果差异

一、大模型是怎么"说话"的?

1.1 下一个词预测

大语言模型(LLM)的核心任务其实很简单:预测下一个词

 复制代码输入:  "你好"
输出:  概率分布
        "吗"  → 0.6
        "啊"  → 0.15
        "呀"  → 0.1
        "美"  → 0.05
        "坏"  → 0.01
        ...(词表中所有 token 都有概率)

模型会对词表中每一个 token 计算一个概率(logit),然后通过 softmax 归一化为概率分布,最后从中采样一个 token 作为输出。

1.2 采样 = 选择的艺术

如果每次都选概率最高的那个词(贪心解码),输出会非常确定但单调

如果我们想让 AI 的回答更有创意、更自然,就需要引入随机性

Temperature、Top-K、Top-P 就是控制这种随机性的三个旋钮。下面我们逐一拆解。

1.3 采样流程全景图

在深入每个参数之前,先看一张完整的流程图,建立全局认知:

 复制代码模型输出 logits(未归一化的分数)
    │
    ▼
┌─────────────────────────┐
│  1. Temperature 缩放     │  ← 除以 T,调整分布的"锐利程度"
│     logits_i = logits_i / T │
└─────────────────────────┘
    │
    ▼
┌─────────────────────────┐
│  2. Softmax 归一化       │  ← 转为概率分布(所有 token 概率之和 = 1
└─────────────────────────┘
    │
    ▼
┌─────────────────────────┐
│  3. Top-K 截断           │  ← 只保留前 K 个高概率 token
└─────────────────────────┘
    │
    ▼
┌─────────────────────────┐
│  4. Top-P 截断           │  ← 在剩余 token 中,保留累积概率 ≥ P 的最小集合
└─────────────────────────┘
    │
    ▼
┌─────────────────────────┐
│  5. 采样                 │  ← 从最终候选集中随机选一个 token
└─────────────────────────┘

二、Temperature(温度):控制随机性的总开关

2.1 数学原理

Temperature 的公式非常优雅:

 复制代码P_i = exp(logit_i / T) / Σ exp(logit_j / T)

其中 T 就是温度参数。核心操作是:在 Softmax 之前,将每个 logit 除以 T

  • 当 T < 1 时,logit 之间的差距被放大,概率分布变得更"尖锐"
  • 当 T > 1 时,logit 之间的差距被缩小,概率分布变得更"平坦"

2.2 直觉理解

你可以把 Temperature 想象成概率分布的"锐化/模糊"滤镜

Temperature效果比喻
T = 0概率分布趋向 one-hot,等价于贪心解码精准的手术刀
T = 1保持原始概率分布原图
T > 1趋向均匀分布,每个词概率相等万花筒

2.3 实际效果对比

假设原始概率分布是:[猫:0.4, 狗:0.3, 鱼:0.1, 鸟:0.05, 蛇:0.03, ...]

 复制代码T = 0.2(低温)[猫:0.85, 狗:0.12, 鱼:0.02, 鸟:0.005, ...]
→ 几乎必选"猫",非常确定T = 1.0(原始)[猫:0.4, 狗:0.3, 鱼:0.1, 鸟:0.05, ...]
→ 保持原始分布T = 2.0(高温)[猫:0.25, 狗:0.22, 鱼:0.15, 鸟:0.12, ...]
→ 分布变平,选到"鸟""蛇"的概率大大增加

用柱状图直观感受:

 复制代码原始分布 (T=1.0):
猫 ████████████████████ 40.0%
狗 ██████████████       30.0%
鱼 █████                10.0%
鸟 ██                    5.0%
蛇 █                     3.0%低温 (T=0.2):
猫 █████████████████████████████████████████ 85.0%
狗 ██████                                    12.0%
鱼 █                                          2.0%
鸟 ▏                                          0.5%
蛇 ▏                                          0.2%高温 (T=2.0):
猫 ████████████         25.0%
狗 ██████████           22.0%
鱼 ███████              15.0%
鸟 ██████               12.0%
蛇 █████                10.0%

可以看到:温度越低,概率越集中在最高概率的 token 上;温度越高,分布越平坦。

2.4 使用建议

场景推荐 Temperature理由
代码生成0.0 ~ 0.2代码需要精确,一个字符错了就报错
数据分析0.1 ~ 0.3数字和事实不能"创造"
通用对话0.7 ~ 0.9自然但不失准确
创意写作0.8 ~ 1.2需要发散思维和新颖表达
诗歌生成1.0 ~ 1.5越高越有"灵感"

三、Top-K 采样:限定候选池

3.1 原理

Top-K 的思路很直接:只保留概率最高的 K 个词,其他的全部丢弃

 复制代码原始分布:[猫:0.4, 狗:0.3, 鱼:0.1, 鸟:0.05, 蛇:0.03, 虾:0.02, ...]Top-K = 3
→ 只保留 [猫, 狗, 鱼]
→ 重新归一化:[猫:0.5, 狗:0.375, 鱼:0.125]
→ 从这三个词中采样

3.2 优点与局限

优点:

  • 有效过滤掉不合理的低概率 token(比如"你好"后面接"量子力学")
  • 简单直观

局限:

  • K 是固定的,无法自适应
  • 当模型很确定时(某个词概率 0.95),K=10 仍然保留 9 个不太合理的候选
  • 当模型不确定时(概率分布很平),K=10 可能砍掉很多合理的候选

3.3 什么时候用 Top-K?

Top-K 通常不单独使用,而是配合 Temperature 一起使用:

 复制代码先用 Top-K 过滤掉离谱的词 → 再用 Temperature 控制剩余词的随机性

四、Top-P(核采样):自适应的智能筛选

4.1 原理

Top-P(也叫 Nucleus Sampling)的策略更聪明:

按概率从高到低排序,选择累积概率刚好超过阈值 P 的最小 token 集合。

 复制代码原始分布:[猫:0.4, 狗:0.3, 鱼:0.1, 鸟:0.05, 蛇:0.03, 虾:0.02, ...]Top-P = 0.8
累积概率:
  猫       → 0.4  (未达 0.8)
  猫+狗    → 0.7  (未达 0.8)
  猫+狗+鱼 → 0.8  (达到 0.8 )
→ 选择 [猫, 狗, 鱼] 作为候选集

4.2 Top-P vs Top-K 的核心区别

特性Top-KTop-P
候选集大小固定 K 个动态,取决于概率分布
模型很确定时仍保留 K 个候选可能只保留 1 个候选
模型不确定时可能砍掉合理候选自动扩大候选集
自适应性

例子:

 复制代码场景 A:模型很确定
分布:[猫:0.95, 狗:0.03, 鱼:0.01, ...]Top-K=5  → 保留 5 个候选(多余)
Top-P=0.9 → 只保留 [猫](自适应!)场景 B:模型不确定
分布:[猫:0.2, 狗:0.2, 鱼:0.2, 鸟:0.2, 蛇:0.2]Top-K=3  → 只保留 3 个(可能漏掉好选择)
Top-P=0.8 → 保留 4 个(自适应!)

4.3 推荐设置

场景推荐 Top-P
精确任务(代码、数学)0.1 ~ 0.3
通用对话0.8 ~ 0.95
创意写作0.9 ~ 1.0
不使用 Top-P(等价于关闭)1.0

五、三者的组合使用

5.1 采样流程

在实际的 LLM 推理中,三个参数通常按顺序应用(与 1.3 节的全景图一致):

 复制代码原始 logits
    ↓
Temperature 缩放(除以 T,调整分布的锐利程度)
    ↓
Softmax(转为概率分布)
    ↓
Top-K 截断(只保留前 K 个高概率 token)Top-P 截断(在 Top-K 基础上,保留累积概率 ≥ P 的最小集合)
    ↓
采样(从最终候选集中随机选一个 token)

5.2 最佳实践:不要同时调多个

原因很简单:两个参数都在控制随机性,同时调会互相干扰,让行为变得不可预测。

推荐策略:

 复制代码方案 A:只调 Temperature(最简单)
  - temperature: 0.7, top_p: 1.0(默认)方案 B:只调 Top-P(推荐)
  - temperature: 1.0(默认), top_p: 0.9方案 C:Temperature + Top-P(精细控制)
  - temperature: 0.8, top_p: 0.5
  - 高温度激发创意,低 Top-P 限制候选范围

5.3 参数组合速查表

场景TemperatureTop-P效果
代码生成0.00.1最严谨,等价于贪心解码
数据分析0.20.3保守准确,不"创造"数据
通用对话0.70.9自然平衡,安全起点
创意写作0.80.5有创意但不跑偏
诗歌/故事1.21.0高度发散,随机性最大

六、LangChain 实战:用代码感受差异

理论讲完了,让我们用 LangChain 来实际感受一下不同参数的效果。

6.1 项目结构

 复制代码t-demo/
├── main.mjs          # 主程序
├── .env              # 环境变量(API Key)
├── package.json
└── node_modules/

6.2 核心代码

 复制代码import 'dotenv/config';
import { ChatOpenAI } from '@langchain/openai';
import { StringOutputParser } from '@langchain/core/output_parsers';
import { PromptTemplate } from '@langchain/core/prompts';// 创意模式:高温度 + 低 Top-P
const creativeModel = new ChatOpenAI({
    model: process.env.MIMO_MODEL,
    temperature: 0.8,   // 高随机性,激发创意
    topP: 0.5,          // 只保留累积概率 50% 的候选,更聚焦
    maxTokens: 600,
    apiKey: process.env.MIMO_API_KEY,
    configuration: {
        baseURL: process.env.MIMO_API_BASE_URL,
    }
});// 严谨模式:低温度 + 低 Top-P
const preciseModel = new ChatOpenAI({
    model: process.env.MIMO_MODEL,
    temperature: 0.2,   // 低随机性,保守准确
    topP: 0.9,          // 保留更多候选,保证信息完整
    maxTokens: 600,
    apiKey: process.env.MIMO_API_KEY,
    configuration: {
        baseURL: process.env.MIMO_API_BASE_URL,
    }
});// 提示词模板
const storyPrompt = PromptTemplate.fromTemplate(`
    请写一篇短篇散文,主题:{theme}
    风格温柔治愈,篇幅200字左右,不要分段,文字细腻有画面感。
`);const outputParse = new StringOutputParser();// 组装工作流(Chain)
const creativeChain = storyPrompt.pipe(creativeModel).pipe(outputParse);
const preciseChain = storyPrompt.pipe(preciseModel).pipe(outputParse);// 运行对比
async function runWriteDemo() {
    const theme = "秋日山野晚风";    console.log('--- 创意写作模式(temperature=0.8, topP=0.5)---');
    const creativeText = await creativeChain.invoke({ theme });
    console.log(creativeText);    console.log('n--- 严谨写作模式(temperature=0.2, topP=0.9)---');
    const preciseText = await preciseChain.invoke({ theme });
    console.log(preciseText);
}runWriteDemo().catch(err => console.error(err));

6.3 运行结果对比

创意模式(temperature=0.8, topP=0.5)输出:

严谨模式(temperature=0.2, topP=0.9)输出:

对比分析:

维度创意模式严谨模式
修辞手法大量比喻("打翻了调色盘"、"大自然在低语")以白描为主("轻拂"、"深浅不一的轮廓")
用词风格大胆、文学化平实、注重事实描写
意象密度高,画面感强中等,叙述为主
适合场景散文、诗歌、故事报告、说明文、新闻稿

七、高级话题:其他采样策略

7.1 Min-P 采样

Min-P 是一种较新的采样策略:

 复制代码设定最小概率阈值 = p_min × max_prob如果 max_prob = 0.4, p_min = 0.1
则阈值 = 0.04
所有概率 < 0.04 的 token 都被过滤

优点是阈值会随最高概率自适应调整

7.2 Repetition Penalty(重复惩罚)

防止模型陷入重复循环:

 复制代码已经生成过的 token,其概率会被乘以一个惩罚系数(如 0.9)
→ 生成过"的" → "的"的概率 × 0.9
→ 再次生成"的" → "的"的概率 × 0.9 × 0.9

7.3 Beam Search(束搜索)

保留多个候选序列,选择整体概率最高的:

 复制代码序列1: "秋日山野晚风轻拂"  → 总概率 0.35
序列2: "秋日山野晚风徐来"  → 总概率 0.32
序列3: "秋日山野晚风送爽"  → 总概率 0.28
→ 选择序列1

常用于翻译等需要全局最优的任务。


八、总结

8.1 一句话理解

参数一句话核心原理
Temperature控制概率分布的"锐利程度"logits 除以 T,影响 Softmax 输出的集中度
Top-K只保留概率最高的 K 个词截断概率分布,丢弃低概率 token
Top-P保留累积概率超过 P 的最小集合自适应截断,分布集中时少选、分散时多选

8.2 最终建议

  1. 新手入门:只调 Temperature(0.0~1.5),其他用默认值
  2. 进阶使用:Temperature + Top-P 组合,覆盖大多数场景
  3. 生产环境:根据业务场景反复测试,找到最佳参数组合
  4. 切记:不要同时调 Temperature 和 Top-P,会互相干扰
  5. 调试技巧:如果不确定选什么,从 temperature=0.7, top_p=0.9 开始,这是业界公认的"安全起点"

参考资料

  • OpenAI API 官方文档 - Chat Create - temperature、top_p 等参数的官方说明
  • Hugging Face - How to generate text - 从解码策略到采样的完整指南
  • The Curious Case of Neural Text Degeneration - Top-P(Nucleus Sampling)的原始论文
  • LangChain 官方文档 - 本文代码示例使用的框架


觉得有用的话,点赞 + 收藏是对创作者最好的支持。

相关文章

精彩推荐