前言:模型是怎么“说话“的?
想象一下,你让ChatGPT写一篇文章,它是怎么一个字一个字“蹦”出来的?
其实,大模型每次只预测下一个词(token)。每次预测时,模型会给词库里的所有词打分。算出每个词出现的概率,然后从中“挑选”一个词。这个“挑选”的过程,就叫做Decoding(解码)

📌 举个例子:

输入:“今天天气真”
模型预测下一个词的概率:

“好” → 40%
“差” → 30%
“热” → 20%
“冷” → 10%
……(词库里几万个词都有概率)
那么,选哪个词?这就是解码策略要解决的问题!

一、贪心搜索(Greedy Search)----每次选最好的那个

🍎 通俗理解
就像考试做选择题,每道题都选你最有把握的那个答案,不管前后联系,只追求当前最优。

⚙️ 工作原理

输入:今天天气真
第1步:选概率最大的词 → "好"    (概率40%)
第2步:选概率最大的词 → "啊"    (概率55%)
第3步:选概率最大的词 → "!"    (概率60%)
输出:今天天气真好啊!

每一步都只保留概率最大的那一个词,直到生成结束。

✅ 优点
⚡ 速度极快,计算量小
❌ 缺点
一步错,步步错(某一步选错了,后面全受影响)
生成的文本单调、重复,容易陷入"局部最优"
💡 就像走迷宫时每次只选眼前看起来最好的路,结果走进死胡同,却发现最优路线其实是绕一步才能找到的。

📱 适用场景
对速度要求极高、对质量要求不高的场景(如实时字幕、快速问答)

二、束搜索(Beam Search)----同时走几条路

🍎 通俗理解
贪心搜索只走1条路,而束搜索同时走N条路,最后选出最好的那条路。就像高考填志愿,你同时投了3所学校,等结果出来后选最好的那个。

⚙️ 工作原理

假设 num_beams = 3(同时保留3条候选路径):

输入:今天天气真

第1步:保留概率最高的3个词
  路径1:今天天气真[]    得分:0.40
  路径2:今天天气真[]    得分:0.30
  路径3:今天天气真[]    得分:0.20

第2步:每条路径继续延伸,再保留总分最高的3条
  路径1:今天天气真好[]  得分:0.40×0.55 = 0.22
  路径2:今天天气真好[]  得分:0.40×0.30 = 0.12
  路径3:今天天气真差[]  得分:0.30×0.40 = 0.12

……直到生成结束,选总分最高的路径输出

num_beams 效果
1 退化为贪心搜索
3~5 常用范围,质量和速度平衡
越大 质量越好,但速度越慢
✅ 优点
比贪心搜索生成质量明显更好
能找到更优的完整序列
❌ 缺点
计算量比贪心大N倍
最优路径可能被剪掉(不保证找到全局最优)
生成文本仍然可能过于保守,缺乏创意
📱 适用场景
机器翻译、文本摘要等对准确性要求高的任务

三、Top-K采样—从前K名随机选

🍎 通俗理解
不再选"最好的那一个",而是先选出前K个候选词,然后按概率随机抽一个

就像班里选班长,不让全班投票(词库太大),先选出前5名候选人,再从这5个人里按得票率随机决定。

⚙️ 工作原理

词库概率分布:
好(40%)(30%)(20%)(10%)(5%)(2%) ...

K=3时,只保留前3个候选词并重新归一化:
好(44%)(33%)(22%)

然后按此概率随机抽取一个词

📊 K值的影响

K=1  → 等同于贪心搜索,每次只选最大概率的词,无随机性
K=5  → 从前5个词中随机选,有一定多样性
K=50 → 从前50个词中随机选,多样性很强但可能选到奇怪的词

✅ 优点
引入随机性,生成内容更有多样性和创意
❌ 缺点
⚠️ K是固定的,但概率分布是动态变化的!

情况1(分布陡峭):好(95%)(2%)(1%)(0.5%)...
→ K=50时,仍会采样到概率极小的词,生成奇怪内容

情况2(分布平缓):好(3%)(3%)(2.9%) ...(所有词概率差不多)
→ K=5时,只采样了5个词,遗漏了很多合理选项

📱 适用场景
创意写作、故事生成等需要多样性的场景

四、Top-P采样(核采样)—按概率累计动态选词

🍎 通俗理解
Top-K的缺点是K是固定的,Top-P则动态决定候选词数量。规则是:从概率最高的词开始累加,直到累计概率达到P为止,这些词就是候选集。

就像买东西,不是固定买5件,而是在预算用完之前,按喜好程度一件一件加入购物车

⚙️ 工作原理

P = 0.9,词库概率从高到低排列:
好(40%)  → 累计 40%  < 90%  ✅加入
差(30%)  → 累计 70%  < 90%  ✅加入
热(20%)  → 累计 90% = 90%  ✅加入(刚好达到)
冷(10%)  → 累计100%  > 90%  ❌不加入

候选词:好、差、热(重新归一化后采样)

📊 P值的影响

P值	候选词	效果
0.1	极少	非常保守,接近贪心
0.9	适中	多样性和质量平衡(推荐)
1.0	全部	完全随机,可能生成乱内容

优点

  • 动态调整候选词数量,比Top-K更灵活
  • 分布陡峭时自动减少候选词,分布平缓时自动增加候选词

缺点

  • P设太低 → 输出太固定
  • P设太高 → 输出太混乱

🔗 Top-K 与 Top-P 联合使用
两者可以同时使用,取更严格(更小)的那个范围

先用Top-K筛选出前K个词
再用Top-P从中进一步筛选出累计概率≤P的词
最后在剩余词中采样

五、Temperature

🍎 通俗理解
Temperature就像空调的温度调节:

温度调低:模型变得"谨慎保守",更倾向于选高概率词
温度调高:模型变得"大胆随机",低概率词也有更多机会被选中

⚙️ 工作原理
Temperature通过修改softmax公式来调整概率分布:

其中 T 就是 Temperature

原始概率:好(40%)(30%)(20%)(10%)

T=0.5(低温,概率差距拉大):
好(70%)(20%)(8%)(2%)   → 更确定

T=1.0(标准,不变):
好(40%)(30%)(20%)(10%)

T=2.0(高温,概率差距缩小):
好(28%)(26%)(24%)(22%) → 更随机

六、联合采样----三剑合璧

🍎 通俗理解
Top-K、Top-P、Temperature 各有优缺点,单独使用效果有限。三者联合使用,可以取长补短,生成既有质量又有创意的文本。

⚙️ 执行顺序

原始概率分布
     ↓
① Top-K:先筛选出前K个高概率词(粗筛)
     ↓
② Top-P:再从K个词中按累计概率进一步筛选(精筛)
     ↓
③ Temperature:调整剩余候选词的概率分布(调节随机性)
     ↓
④ 按最终概率采样一个词

📋 完整示例

设置:K=50, P=0.9, T=0.8
输入:今天天气真

Step1 Top-K:从词库取概率最高的50个词
  [好, 差, 热, 冷, 棒, 糟, 爽, 烂...共50个]

Step2 Top-P:累计到90%停止
  [(40%), 差(30%), 热(20%)] 累计=90%
  → 保留3个词,丢弃剩余47个

Step3 Temperature=0.8(略微压低随机性):
  [(46%), 差(31%), 热(23%)]

Step4 按概率随机采样
  → 假设抽到"好"
  
输出:今天天气真好...(继续预测下一个词)

七、总结:如何选择解码策略?

你的需求是什么?
│
├── 速度第一,质量其次?
│   └── ✅ 贪心搜索(Greedy Search)
│
├── 准确性第一(翻译/摘要)?
│   └── ✅ 束搜索(Beam Search),num_beams=5左右
│
├── 需要创意和多样性(写作/对话)?
│   └── ✅ 联合采样(Top-K + Top-P + Temperature)
│       推荐初始参数:K=50, P=0.9, T=0.8
│
└── 需要稳定精确输出(代码/数学)?
    └── ✅ Temperature趋近于0,或者直接贪心搜索
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐