把大模型从演示变成能值班的系统时,从 logits 到文本几乎总会先露出工程缺口。下面按可执行的顺序来拆:先讲它解决什么、卡在哪,再讲选型时看哪些数字,最后落到智能体和网关该怎么接。本文面向要上线的工程师,不写空泛趋势。
一、logits、softmax、temperature:解码接的是哪个输入
一个训练好的语言模型,权重固定之后,对同一个 prompt 只会输出同一组 logits。但把这组 logits 换成文本的那一步——选贪心、开 beam、调 temperature、切 top-p、加多大的重复惩罚——完全在权重之外发生,而且足以让同一个模型看起来像两个不同的产品:一个稳定但呆板,一个多变但容易跑偏。
这不是一个可以随手调的“默认参数”问题。生产系统里,代码生成、JSON 输出、工具调用几乎总用低随机性甚至贪心;创意写作、闲聊、头脑风暴则要开采样甚至调高 temperature。同一份权重、同一个 checkpoint,靶子完全不同的两组解码参数背后,是完全不同的失败模式:一边怕重复和死板,一边怕幻觉和格式跑飞。这篇要把“解码”当成一层独立的策略问题来拆:它接的输入是模型给的分布,输出是最终呈现给用户的 token 序列,中间每一个旋钮都有自己的几何直觉、失效条件和副作用。
二、贪心解码:局部最优的正反馈陷阱
这里边界说明在前面:KV Cache 如何让自回归推理避免重算前缀,见 49|KV Cache ;用小模型加速验证的 Speculative Decoding 算法,见 50|Speculative Decoding ;解码失控导致的死循环、乱码、数值溢出的完整机制,见 59|推理退化 。这三篇处理的是缓存实现、加速算法和故障机制;这里钉住的是策略层本身——同一个分布下,为什么选不同的解码策略会得到质量、风格、幻觉风险完全不同的文本。
模型最后一层输出一个长度等于词表大小的向量,这是 logits。 \(z_i\) 越大,token \(i\) 在当前上下文下越可能。softmax 把它变成概率分布:
三、Beam Search:机器翻译时代的最优搜索,为什么在开放生成里显得枯燥
到这里为止,模型的工作结束了——它给出的是一个完整的、固定的分布 \(p\) 。解码策略要做的事情,是在这个分布上定义一个“选择规则”:贪心选 \(\arg\max\) ,采样按 \(p\) 抽签,Beam Search 在序列层面找高概率路径。同一个 \(p\) ,不同选择规则会给出完全不同的 token。这是这里要反复强调的一点:解码不是模型能力的延伸,是模型能力之外、独立可调的策略层。
\[ p_i(T)=\frac{\exp(z_i/T)}{\sum_j \exp(z_j/T)} \]
四、top-k、top-p、min-p:候选集合的几何直觉
这个形式来自统计力学里的 Boltzmann 分布, \(T\) 对应温度,能量对应 \(-z_i\) ——这也是“temperature”这个名字的来源,不是比喻。几何上, \(T<1\) 把 logits 的差距放大,分布向着最大值坍缩,接近 one-hot; \(T>1\) 把差距压缩,分布趋于均匀。 \(T \to 0\) 就是贪心解码; \(T \to \infty\) 就是均匀随机采样。所有后面要讲的策略,本质上都是在“要不要相信模型给出的相对大小”和“要给多少随机性”这两个维度上做选择。
temperature 不改变模型的知识或推理能力,它改变的是这个分布被“信任”到什么程度。低 temperature 意味着相信模型给出的排序是对的,把差距拉大到几乎只选第一名;高 temperature 意味着不完全信任这个排序,愿意让原本分数不高的候选也有机会。
五、重复惩罚与 presence/frequency penalty:缓解重复的代价
贪心解码每一步取 \(\hat y_t=\arg\max_y p(y\mid x,\hat y_{<t})\) 。它确定、可复现、延迟最低,对格式固定、答案唯一的任务(分类、抽取、闭式问答)往往就是最优选择——没有必要为了“多样性”去牺牲稳定性。
但贪心把每一步的局部最优当成了全局目标,而生成一个序列不是逐位置独立分类。Holtzman 等人在《The Curious Case of Neural Text Degeneration》( ICLR 2020 )里给出了一个具体机制:训练数据里确实存在少量真实重复(强调、口吃、格式化文本),模型据此学到的条件概率 \(P(x_t=w\mid x_{t-1}=w)\) 并不总是很低。一旦某一步贪心选中了 \(w\) ,上下文变成“…… \(w\ w\) ”,模型看到连续重复后,往往会把“继续重复”的概率抬得更高——因为它在训练里也见过这种模式延续下去的样本。这不是某一步概率算错了,而是贪心把一个不算离谱的局部偏好(比如 0.15 对其他候选的 0.03)锁成了确定性路径:采样有 85% 的机会绕开它,贪心 100% 会踩进去。这条正反馈回路在 59|推理退化 里有更完整的注意力层面推导;这里只强调它的解码层根源——贪心本身没有
六、争论:采样是不是在掩盖模型校准问题
Beam Search 保留 \(k\) 条累计对数概率最高的候选序列,每步用所有候选扩展词表后再截断回 \(k\) 条:
\[ \log P(Y)=\sum_{t=1}^{|Y|}\log p(y_t\mid y_{<t}) \]
落地时建议先做的 5 件事
- 用自己的 20 条真实请求测 TTFT / TPOT / 失败原因,不要只看公开榜。
- 先写显存和 KV 缓存账,再决定卡数、量化和并发上限。
- 网关层把鉴权、配额、审计和模型路由收口,应用里不要各接各的 Key。
- 工具调用默认拒绝,按白名单放开,高风险动作必须人审。
- 模型升级准备回滚:旧权重、旧 Prompt、旧评测集要能一键切回。
和智能体产品怎么接
对龙虾PRO这类要把 OpenClaw 落到中国业务场景的平台来说,从 logits 到文本决定的是延迟能不能进对话、成本能不能规模化、出了问题能不能追溯。技能市场、数字员工和网关都应该吃同一套观测与权限,而不是文章里的概念演示。
本文侧重智能体生命周期与技能边界。若你要动手验证,优先用 Playground 做小任务压测;权限与托管再单独规划,避免「先装一堆再治理」。 相关:Playground · 创建智能体 · 学习中心
常见问题 FAQ
什么是智能体栈里的从?
「智能体栈里的从」可概括为:语言模型每一步只输出一组 logits,真正决定输出哪个 token 的是解码策略。本文从 softmax 与 temperature 的几何直觉出发,讲清贪心、Beam Search 为何在开放生成中显得枯燥重复,top-k/top-p/min-p 叠加时的组合陷阱,以及重复惩罚、presence/frequency penalty 对专有名词和代码的副作 本文从定义、方法与实践要点展开说明。
为什么要关注智能体栈里的从?
关注智能体栈里的从,是因为它直接影响效率、风险与可复制性。文中指出:一个训练好的语言模型,权重固定之后,对同一个 prompt 只会输出同一组 logits。但把这组 logits 换成文本的那一步——选贪心、开 beam、调 temperature、切 top-p、加多大的重复惩罚——完全在权重之外发生,而且足以让同一个模型看起来像两个不同的产品:一个稳定但呆板,一个多变但容易跑偏。
如何落地智能体栈里的从?有哪些关键步骤?
建议按以下路径推进智能体栈里的从:1) 用自己的 20 条真实请求测 TTFT / TPOT / 失败原因,不要只看公开榜。;2) 先写显存和 KV 缓存账,再决定卡数、量化和并发上限。;3) 网关层把鉴权、配额、审计和模型路由收口,应用里不要各接各的 Key。;4) 工具调用默认拒绝,按白名单放开,高风险动作必须人审。;5) 模型升级准备回滚:旧权重、旧 Prompt、旧评测集要能一键切回。。细节见正文对应章节。
智能体栈里的从适合哪些人或团队?
智能体栈里的从更适合:产品/技术负责人、运营与增长团队、需要落地智能体或自动化的中小团队、关注「AI智能系统」方向的读者。若你只需要单次聊天式问答,可先读概念;若要上生产,请重点看步骤、权限与风控相关段落。
关于「一、logits、softmax、temperature:解码接的是哪个输入」,本文给出了什么结论?
在「一、logits、softmax、temperature:解码接的是哪个输入」部分,要点是:用几乎总用低随机性甚至贪心;创意写作、闲聊、头脑风暴则要开采样甚至调高 temperature。同一份权重、同一个 checkpoint,靶子完全不同的两组解码参数背后,是完全不同的失败模式:一边怕重复和死板,一边怕幻觉和格式跑飞。这篇要把“解码”当成一层独立的策略问题来拆:它接的输入是模型给的分布,输出是最终呈现给用户的 token 序列,中间每一个旋钮都有自己的几何直觉、失效条件和副作用。 二、贪心解码:局部最优的正反馈陷阱 这里边
关于「二、贪心解码:局部最优的正反馈陷阱」,本文给出了什么结论?
在「二、贪心解码:局部最优的正反馈陷阱」部分,要点是:两个维度上做选择。 temperature 不改变模型的知识或推理能力,它改变的是这个分布被“信任”到什么程度。低 temperature 意味着相信模型给出的排序是对的,把差距拉大到几乎只选第一名;高 temperature 意味着不完全信任这个排序,愿意让原本分数不高的候选也有机会。 五、重复惩罚与 presence/frequency penalty:缓解重复的代价 贪心解码每一步取 (hat y_t=argmax_y p