集束搜索解码

Beam Search

Beam Search 集束搜索是 LLM 文本生成的经典解码策略之一:每一步同时保留 Top-B 个最高概率的候选路径(Beam Size = B),继续扩展到下一步再全局剪枝,最后输出一条联合概率最高的完整序列;比贪婪解码质量更高,比纯随机采样更可控。

详细解释

Beam Search(集束搜索 / 束搜索) 是从机器翻译时代(2016 年 seq2seq)沿用到今天的解码算法,本质是对”每一步只选 Top-1 的贪婪解码(Greedy Decode)“做扩展:我不只走一条路,我同时开 B 条路(Beam = B,B 一般取 4、5、10),每一步给 B 条路的每个都算下一步词表所有概率 → 组合出 B × V 条新路 → 剪枝只留联合概率最高的 B 条 → 到终止符(EOS)或 max_tokens 就返回得分最高的那条。

直观对比 3 种解码策略(Prompt = “从北京去上海最快的交通方式是”):

解码策略过程描述典型输出适合场景
Greedy(贪婪,B=1)每步直接选概率最高的 1 个词“从北京去上海最快的交通方式是高铁,约 5 个半小时。”简单抽取 / 机器翻译(要求准确、不要创造力)
Beam(B=5)同时保留 5 条最优路径,最后选联合概率最高的“从北京去上海最快的交通方式是京沪高铁复兴号,全程约 4 小时 28 分;其次是直飞航班 2 小时左右。”机器翻译、摘要、抽取——追求流畅 + 内容完整 + 不易错
Top-P + Temperature(采样)每一步按核概率分布随机采样“从北京去上海最快的方式嘛,一般看情况!推荐京沪高铁复兴号(4.5h),赶时间也可以飞大兴→虹桥……”创意写作、闲聊、头脑风暴(要多样性和自然度)

Beam Search 解决了 Greedy 的经典问题:局部最优不代表全局最优。比如一个翻译句子 “The cat sat on the mat”,Greedy 第一步选了”猫”(概率最高)就锁死了;但 Beam Size=5 会同时保留”猫 / 那只猫 / 这只猫咪 / 猫科动物 / 小猫”这 5 条候选,当后面词语是”坐在垫子上”时,可能”那只猫坐在垫子上”的全局联合概率比猫要高——Beam 就会选后者。所以 Beam 生成的句子整体更流畅、少重复。

Beam Search 重要超参数

超参数常用值作用调参指南
Beam Size(束宽 B)4、5、8、10同时保留多少条候选路径B 越大越准(越不容易错过全局最优)但计算量 × B,超过 10 边际收益骤降,一般 5 足够
Length Penalty(长度惩罚 α)0.6(摘要)~ 1.0(翻译)联合概率 = 每步乘积,天然偏短句(每步乘一个 小于 1 的概率,句子越长总得分越小);LP 给长句一点补偿:Score = TotalLogProb / Length 的 alpha 次方。α=1 就是平均对数概率。摘要短句 α=0.6,翻译 α=1.0,长文 α=1.2 鼓励长
No Repeat N-gram(禁止重复 N 元组)N=3任意 N 元词组在输出中不允许出现两次,强力抑制”谢谢谢谢谢谢”这种复读生成任务默认开 3;摘要/翻译 N=3,代码 N=2
Diversity Penalty(多样性惩罚,多 Beam 不同)0.2 至 0.5,用于 Diverse Beam Search多个 Beam 输出相同路径时扣分,鼓励 B 条路各说各话想生成 K 个不同的候选(SC 投票前用)时开
Early Stopping(早停)只要 N 个 Beam 都出了 EOS 就停止生成,不用等到 max_tokens默认开,提速 20–40%

主流生成场景下的 Beam / 采样选型建议(收藏级)

场景推荐解码原因典型参数
机器翻译(中英/英中)Beam Search翻译的”标准答案空间”相对单一,Beam 准确率最高beam=5, lenpen=1.0, no_repeat_ngram=3
新闻/文章摘要Beam Search(+ 短 LP)摘要要准确、要点全,不需要多样性beam=4, lenpen=0.8, min_length=30
结构化抽取(JSON/表格)Greedy / Beam=1 + JSON Schema抽取不要创造力,要稳定和正确;强制 JSON 模式temperature=0, response_format=json_object
代码生成(函数级)Self-Consistency(SC)用采样 出 K=40 → 单测过滤代码正确与否单测一眼知道,采样多样性 + 客观测试最香temperature=0.7, top_p=0.95, K=40
创意文案/营销软文Nucleus Sampling(Top-P)需要风格和创意,Beam 会生成”万金油”文风temperature=0.9, top_p=0.9, Presence Penalty=0.8
闲聊对话客服Top-P + T=0.7 至 1.0闲聊要求自然度,Beam 会显得像机器人temperature=0.8, top_p=0.9, Freq Penalty=0.3
RAG 问答Top-P + T=0.2 + 结构化引用低温度保证事实准确,采样比 Beam 更少编造temperature=0.2, Frequency Penalty=0.1
长文档续写(技术手册)Beam + No Repeat 4-gram要求连贯、结构化、不重复段落beam=4, no_repeat_ngram=4, lenpen=1.2

唯元智创 的模型调试 Playground 把上述所有预设都做成了场景化下拉:选”翻译”自动切 Beam + 参数,选”文案”自动切 Top-P + T=0.9。

常见问题

为什么现在越来越多模型默认用 Top-P 采样,而不是 Beam?
两个原因:(1)Chat/对话成为主流场景,Beam 的输出”太正确”会显得机械、官方、不像人类闲聊;采样出的回复更自然。(2)2022 年后社区的多篇论文发现 Beam 在超长生成(500 tokens+)上反而更容易出现”枯燥重复 + 模板化表达”——所谓 Beam Search Degeneration(Beam 退化)。2025 年的结论是:任务型(翻译/摘要/抽取)继续用 Beam;开放对话/创意/写作 → 用 Top-P 采样。没有银弹,按场景选解码策略,不要迷信某个单一算法。
我能不能先 Beam 生成 K 个候选,再走 Self-Consistency 投票?
能,但实际效果 不如”Diverse Beam Search(多样性集束)→ SC 投票”组合更差。原因:标准 Beam Search 生成的 K 条路高度相似(它们是同一个概率峰附近的 B 个局部变体),拿它们投票就像”让一个人换 5 个坐姿做同一张试卷——结果大概率还是一样的错”,多样性不够。正确组合:SC 的 40 条候选由”高 Temperature 采样”生成(保证路径多样性),最后用”投票 + 客观指标(代码单测/正则匹配)“选答案;Beam Search 单独作为一个确定性场景的解码手段,不要把它和 SC 混到同一条链路上。
流式输出(Streaming)支持 Beam Search 吗?
支持,但和你想象的不一样——标准流式只能流”最终选出来的那一条 Beam”,中间切换路径时会有”跳字”问题(前 10 个 Token 是路径 A 的,第 11 步选了路径 B 全局更优,就得回滚 10 个 Token,这在 SSE 里实现不了)。所以在 Streaming 流式 API 里,厂商大多不开启 Beam Search 暴露给用户(或者内部用 Beam B=2 只流最终那条路径,用户看不到切换)。如果你的业务强依赖流式逐字效果,还是乖乖走 Top-P 采样。需要 Beam 质量的场景(翻译/摘要)就走非流式,一次性返回完整结果更稳。