作者:互联网 时间: 2026-07-23 08:20:54
| 参数 | 一句话 | 调小 | 调大 |
|---|---|---|---|
| Temperature | 控制概率分布的锐利程度 | 输出更确定、更保守 | 输出更随机、更有创意 |
| Top-K | 只保留概率最高的 K 个候选 | 候选越少越保守 | 候选越多越自由 |
| Top-P | 保留累积概率超过 P 的最小集合 | 候选越少越保守 | 候选越多越自由 |
你有没有好奇过:

这一切的答案,都藏在大模型的采样策略里。
读完本文,你将理解:
大语言模型(LLM)的核心任务其实很简单:预测下一个词。
复制代码输入: "你好"
输出: 概率分布
"吗" → 0.6
"啊" → 0.15
"呀" → 0.1
"美" → 0.05
"坏" → 0.01
...(词表中所有 token 都有概率)
模型会对词表中每一个 token 计算一个概率(logit),然后通过 softmax 归一化为概率分布,最后从中采样一个 token 作为输出。
如果每次都选概率最高的那个词(贪心解码),输出会非常确定但单调。
如果我们想让 AI 的回答更有创意、更自然,就需要引入随机性。
而 Temperature、Top-K、Top-P 就是控制这种随机性的三个旋钮。下面我们逐一拆解。
在深入每个参数之前,先看一张完整的流程图,建立全局认知:
复制代码模型输出 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 的公式非常优雅:
复制代码P_i = exp(logit_i / T) / Σ exp(logit_j / T)
其中 T 就是温度参数。核心操作是:在 Softmax 之前,将每个 logit 除以 T。
你可以把 Temperature 想象成概率分布的"锐化/模糊"滤镜:
| Temperature | 效果 | 比喻 |
|---|---|---|
| T = 0 | 概率分布趋向 one-hot,等价于贪心解码 | 精准的手术刀 |
| T = 1 | 保持原始概率分布 | 原图 |
| T > 1 | 趋向均匀分布,每个词概率相等 | 万花筒 |
假设原始概率分布是:[猫: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 上;温度越高,分布越平坦。
| 场景 | 推荐 Temperature | 理由 |
|---|---|---|
| 代码生成 | 0.0 ~ 0.2 | 代码需要精确,一个字符错了就报错 |
| 数据分析 | 0.1 ~ 0.3 | 数字和事实不能"创造" |
| 通用对话 | 0.7 ~ 0.9 | 自然但不失准确 |
| 创意写作 | 0.8 ~ 1.2 | 需要发散思维和新颖表达 |
| 诗歌生成 | 1.0 ~ 1.5 | 越高越有"灵感" |
Top-K 的思路很直接:只保留概率最高的 K 个词,其他的全部丢弃。
复制代码原始分布:[猫:0.4, 狗:0.3, 鱼:0.1, 鸟:0.05, 蛇:0.03, 虾:0.02, ...]Top-K = 3
→ 只保留 [猫, 狗, 鱼]
→ 重新归一化:[猫:0.5, 狗:0.375, 鱼:0.125]
→ 从这三个词中采样
优点:
局限:
Top-K 通常不单独使用,而是配合 Temperature 一起使用:
复制代码先用 Top-K 过滤掉离谱的词 → 再用 Temperature 控制剩余词的随机性
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 )
→ 选择 [猫, 狗, 鱼] 作为候选集
| 特性 | Top-K | Top-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 个(自适应!)
| 场景 | 推荐 Top-P |
|---|---|
| 精确任务(代码、数学) | 0.1 ~ 0.3 |
| 通用对话 | 0.8 ~ 0.95 |
| 创意写作 | 0.9 ~ 1.0 |
| 不使用 Top-P(等价于关闭) | 1.0 |
在实际的 LLM 推理中,三个参数通常按顺序应用(与 1.3 节的全景图一致):
复制代码原始 logits
↓
Temperature 缩放(除以 T,调整分布的锐利程度)
↓
Softmax(转为概率分布)
↓
Top-K 截断(只保留前 K 个高概率 token)
↓
Top-P 截断(在 Top-K 基础上,保留累积概率 ≥ P 的最小集合)
↓
采样(从最终候选集中随机选一个 token)
原因很简单:两个参数都在控制随机性,同时调会互相干扰,让行为变得不可预测。
推荐策略:
复制代码方案 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 限制候选范围
| 场景 | Temperature | Top-P | 效果 |
|---|---|---|---|
| 代码生成 | 0.0 | 0.1 | 最严谨,等价于贪心解码 |
| 数据分析 | 0.2 | 0.3 | 保守准确,不"创造"数据 |
| 通用对话 | 0.7 | 0.9 | 自然平衡,安全起点 |
| 创意写作 | 0.8 | 0.5 | 有创意但不跑偏 |
| 诗歌/故事 | 1.2 | 1.0 | 高度发散,随机性最大 |
理论讲完了,让我们用 LangChain 来实际感受一下不同参数的效果。
复制代码t-demo/
├── main.mjs # 主程序
├── .env # 环境变量(API Key)
├── package.json
└── node_modules/
复制代码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));
创意模式(temperature=0.8, topP=0.5)输出:
严谨模式(temperature=0.2, topP=0.9)输出:
对比分析:
| 维度 | 创意模式 | 严谨模式 |
|---|---|---|
| 修辞手法 | 大量比喻("打翻了调色盘"、"大自然在低语") | 以白描为主("轻拂"、"深浅不一的轮廓") |
| 用词风格 | 大胆、文学化 | 平实、注重事实描写 |
| 意象密度 | 高,画面感强 | 中等,叙述为主 |
| 适合场景 | 散文、诗歌、故事 | 报告、说明文、新闻稿 |
Min-P 是一种较新的采样策略:
复制代码设定最小概率阈值 = p_min × max_prob如果 max_prob = 0.4, p_min = 0.1
则阈值 = 0.04
所有概率 < 0.04 的 token 都被过滤
优点是阈值会随最高概率自适应调整。
防止模型陷入重复循环:
复制代码已经生成过的 token,其概率会被乘以一个惩罚系数(如 0.9)
→ 生成过"的" → "的"的概率 × 0.9
→ 再次生成"的" → "的"的概率 × 0.9 × 0.9
保留多个候选序列,选择整体概率最高的:
复制代码序列1: "秋日山野晚风轻拂" → 总概率 0.35
序列2: "秋日山野晚风徐来" → 总概率 0.32
序列3: "秋日山野晚风送爽" → 总概率 0.28
→ 选择序列1
常用于翻译等需要全局最优的任务。
| 参数 | 一句话 | 核心原理 |
|---|---|---|
| Temperature | 控制概率分布的"锐利程度" | logits 除以 T,影响 Softmax 输出的集中度 |
| Top-K | 只保留概率最高的 K 个词 | 截断概率分布,丢弃低概率 token |
| Top-P | 保留累积概率超过 P 的最小集合 | 自适应截断,分布集中时少选、分散时多选 |
temperature=0.7, top_p=0.9 开始,这是业界公认的"安全起点"觉得有用的话,点赞 + 收藏是对创作者最好的支持。