时代少年团大概也没想到,自己有一天会以这种方式进入中国 AI 行业史。
事情最开始很像一个饭圈小插曲。
有人测试自家爱豆马嘉祺,发现模型明明知道他是谁,能说出团体身份、经历和相关背景,可一到要输出马嘉祺这三个字,就开始绕路、回避、卡壳。
这件事发到社媒后,很快从粉丝吐槽变成技术圈围观。
大家一边觉得好笑,一边又忍不住好奇:一个大模型既然知道马嘉祺是谁,为什么偏偏说不出他的名字?
后来 MiniMax 的小哥回应了这个问题,并且把内部排查过程整理成了一篇技术 Blog。
我看完之后最大的感受是,最严苛的 AI QA,有时候真的藏在饭圈里。
很多人看到这个案例,第一反应会是:模型都知道他是时代少年团成员了,怎么会说不出名字?
但这恰好是大模型最容易被误解的地方。
对模型来说,知道一个人是谁,和把这个人的名字准确生成出来,并不是同一件事。
大模型内部大致有两条链路。
输入侧的 embedding,负责把文字变成模型能处理的向量。
输出侧的 lm_head,负责把模型内部的向量再变回具体文字。
也就是说,模型可能还保留着马嘉祺这个人的语义位置,知道他和时代少年团、队长、综艺这些信息有关。
但到了最后一步生成文字时,它未必还能稳定把马嘉祺这几个字拿出来。
这有点像我们平时遇到的人名卡壳。
你知道这个人长什么样,知道他做过什么,甚至知道他和谁有关,可就是一瞬间想不起来他的名字。
当然,大模型的卡壳不是人类记忆问题,背后是更底层的 token 机制。
这里最关键的角色,叫 tokenizer。
它会先把文字切成一个个 token,模型最终也只能在自己的词表里选择 token 输出。
马嘉祺这个名字里,马被切成一个 token,嘉祺被切成另一个 token。
问题就出在嘉祺这个 token 上。
MiniMax小哥排查后发现,嘉祺这个 token 在预训练阶段其实学得不错。
它的 embedding 正常,语义近邻也很合理,附近有亚轩、千玺、耀文、肖战这类明星或人名 token。
换句话说,模型早期确实知道嘉祺这个词应该待在什么语义区域里。
真正的问题出现在后训练阶段。
后训练数据里,嘉祺这个 token 出现不足 5 条。
它在预训练时被学过,进入后训练后却几乎没再被当作生成目标训练。
时间一长,输入侧的 embedding 还比较稳定,输出侧的 lm_head 却开始漂移。
这就解释了那个现象:模型还认识这个词,但不太会生成这个词了。
另外MiniMax 在排查马嘉祺问题时,还顺手串起了另一个看起来完全不相关的 bug:日语对话里偶尔混入俄语。
一个是中文明星名字说不出,一个是日语输出冒出俄语,乍一看八竿子打不着。
但从底层看,它们指向的是同一个问题:后训练数据对部分 token 覆盖不足,导致这些 token 的 lm_head 表征发生漂移,最后在生成时被错误召回。
Blog 里有一个数字很刺眼。
在 baseline 模型里,29.7% 的日语 token,SFT 前后的 lm_head cosine similarity 跌破了 0.95。
相比之下,韩语是 3.3%,俄语是 3.7%,中文是 3.9%,英文和 Latin 是 3.5%。
这个差距说明,后训练数据的质量评估,不能只看任务有没有覆盖、领域有没有覆盖、指令能力有没有提升,还要看一个更底层的问题:词表里的每个 token,有没有在后训练里被好好照顾到。
如果某些 token 在预训练阶段进了词表,后训练阶段又几乎消失,它们就可能成为模型里的冷门住户。
平时没人找它们,真到需要它们出场的时候,它们已经站错位置了。
这个问题放到更大范围看,还挺像一次互联网语料考古。
MiniMax 小哥排查变化最大的 token 时,发现里面不只有马嘉祺,还有大量预训练语料里残留的旧互联网痕迹,比如传奇私服、外墙涂装等。
这些词之所以能进入词表,很多时候只是因为早期爬虫语料里出现得太频繁。
这也很有讽刺感。
我们以为大模型学习的是人类文明知识,结果它的词表深处,还住着一批古早 SEO 垃圾。
它们平时不会出现在正常对话里,却依然是模型历史的一部分。
修复思路也很朴素。
MiniMax 做了一个实验:把全量 20 万左右的词表随机拆分,用请重复以上内容这样的任务,构造约 500 条对话数据,让每个 token 至少作为 target 出现 20 次。
听上去像让模型做抄写作业。
但效果很明显。
日语到俄文的混淆率,从 baseline 的 47% 降到 1%。
马嘉祺 case 也能正常输出了。
这说明有些大模型问题,其实只要找到真正的断点,用足够克制的工程方式补上,效果就会很直接。
这里也能顺手理解最近行业里关于 tokenizer 的讨论。
有些路线会选择加法,保住更完整的词表,通过数据覆盖和训练策略来维护它。
有些路线会选择减法,把覆盖不到、维护成本高的 token 从词表里裁掉。
前者更重,后者更省,但代价不同。
词表越完整,模型对长尾名词、专有名词的兼容性可能更好。
词表越精简,训练和推理可能更高效,但用户有时候也需要花更多 token 去表达同样的内容。
我觉得这篇 Blog 真正有价值的地方,也在这里。
它没有把问题轻轻带过。
它把一个很好笑的 bug,拆成 tokenizer、embedding、lm_head、后训练数据分布、词表覆盖度几个层次,再用实验把修复路径跑了一遍。
它暴露的是一个更长期的问题:当模型从预训练走向后训练,哪些能力被增强了,哪些冷门 token 被遗忘了,哪些语种因为覆盖不足开始漂移,这些都需要被看见。
这也是这次回应比较加分的地方。
大多数公司遇到这种 bug,可能会选择降低声量。
因为从传播学角度看,大模型不认识马嘉祺这个说法太容易变成玩梗素材。
但 MiniMax 这次把它讲清楚了。
马嘉祺也意外成为一个入口,让更多人看见,大模型不是神奇魔法,也不是万能百科。
它有自己的结构、路径和盲区。
很多看起来玄学的问题,拆到底,往往都是工程问题。
AI 行业有时候总喜欢聊宏大的东西,AGI、智能涌现、下一代入口。
但我越来越觉得,很多真正推动行业变好的问题,往往就藏在这种很小、很具体、甚至有点好笑的 case 里。