回答为什么停在那个字上,多一字不少?答案是模型自己生成了一个特殊记号 EOS,表示到此为止。豆包、海螺AI的流畅收束背后,都是这个记号在把关,本文拆解它的判定条件与两种失效方向。
特殊记号:句号之外的开关
词表里除了正常文字,还登记着一类控制记号,EOS 是其中管结束的。它和普通字一样参与每一步的概率竞争,赢下那一步,生成循环就终止。logits 是什么那篇讲过,它的胜出同样取决于原始分与温度处理——分布被温度拉平时,EOS 与正文候选站在同一起跑线,谁分高谁上。训练语料里每段范文都以 EOS 收尾,模型由此学会了「说到哪该收」这件事本身,也学会了什么样的问题配多长的回答。
停不下来怎么办:阈值与强制截断
光靠 EOS 赢一局并不保险,工程上有几道保险丝:设定最小长度,起步阶段禁止 EOS 胜出,防止没头没尾的短回答;设定最大长度,到点强制截断,防止死循环;有的接口还允许登记停止词,命中即停。束搜索那篇的多路候选同样适用——任何一条路碰到 EOS 就封路计分。重复惩罚是怎么压制复读的扣分机制也有连带效果:复读被压住后,模型更容易转向收束词,长输出自然收得住。
| 手段 | 什么时候起作用 | 配错会怎样 |
|---|---|---|
| EOS 记号 | 模型自己判到该收尾时 | 该停不停,输出拖沓 |
| 最小长度 | 起步阶段禁止 EOS 胜出 | 短回答没头没尾 |
| 最大长度 | 到点强制截断 | 话没说完被切断 |
| 停止词 | 命中即停 | 误登记常用标点会提前断开 |
输出异常自查清单:先查停止机制
- 回答戛然而止:可能触发最大长度,未必是模型想说完
- 回答拖沓不收尾:EOS 分数长期不敌正文,试降温或加重复惩罚
- 多段输出提前断开:检查停止词是否误登记了常用标点
- 反馈生成异常前,先按这份清单排除停止配置的嫌疑
提前刹车:另一种误伤
反过来,EOS 也可能来得太早:模型在列举中途收束,该展开的地方一笔带过。常见原因是训练数据里短回答占优,或者解码参数把 EOS 的分数推得偏高。权重文件里的层那篇讲的上游结构决定理解质量,张量是什么那篇讲的数值精度影响分数稳定性,量化过头时 EOS 判定也会跟着抖。多查询注意力是怎么省缓存的那类结构改造若训练配套没跟上,同样可能波及收束行为;量化感知训练是怎么回事讲的压缩路线,正是为少抖动而设计的。
关于EOS的三个常问问题
- 为什么有时回答在句子中间就断了?:多半撞上最大长度或停止词,未必是模型的意思;把上限调高或检查停止词配置即可验证。
- EOS 是学出来的还是写死的规则?:记号本身是词表里的约定,但「什么时候该输出它」是模型从训练语料学来的,工程层再叠加最小长度等护栏。
- 温度高低会影响收束吗?:会。高温把分布压平,EOS 与正文候选的差距被稀释,长回答更拖沓;低温下谁分高谁上,收束更干脆。
把它想成裁判哨:模型吹哨才收工,护栏管住误哨与漏哨。还有个细节:这个记号本身也是一个普通候选,它出现在词表里,得分由模型算出,停止判定只是在每步解码后检查它有没有被选中或超过阈值,并不需要额外的判断模块。这也是为什么不同模型的话痨程度不一样——它的打分倾向是训练数据与对齐阶段塑造出来的。对开发者来说,停止词列表可以自己加,想让模型在特定标记处收工,把它加进停止条件即可;但删停止词要谨慎,容易让模型该停不停,白白烧算力。最后提醒一句:别把停不下来全怪模型,提示词里写了「请详细说明」「尽量展开」这类要求,本身就在压低停止记号的分。


