今天看到一个挺有意思的现象。
有人在 DeepSeek 的输入框里敲了几个字符:`` 中间,是模型推理的草稿。
这些字符叫 special token,是模型训练时用来区分谁在说话、在做什么动作的分隔符。它们在词表里都被分配了独立的 ID,模型看到这些 ID,就会切到对应的模式里。
平时我们敲一个「你好」,DeepSeek「看」到的并不是这两个字。它看到的是一段拼好的模板,类似 <|begin▁of▁sentence|><|User|>你好<|Assistant|> ,然后从最后那个 <|Assistant|> 之后开始往下接话。
坑就在这里。
如果用户直接把 <think> 打进输入框,而模板层又没把它当普通文字给「关起来」,tokenizer 就可能把它认成真的控制 token。
这样一来,DeepSeek 看到的景象,就好像一块后台路牌,被人硬塞进了用户留言里。
按训练时的逻辑,模型应该看到「用户问了一个问题,我要回答」。现在模型看到的是 <think> 直接出现在用户的位置,然后什么问题都没有。它的训练数据里压根没这种结构,但它又必须继续生成下去。
它并没有去数据库里捞东西。前缀给到这儿就断了,连个问题锚点都没有,它只能顺着训练时学到的概率分布往下硬编。于是你看到的就是一堆碎片,一会儿数学,一会儿小说,这跟训练数据泄露没啥关系。
到这里就能看出来了,麻烦不在模型脑子里,在模板那层「字符串胶水」上。它没把控制 token 当成普通文字给锁住。

这也不是 DeepSeek 一家的毛病。很多模型都有自己的对话格式,早期 ChatML 有 <|im_start|> ,Claude 旧格式也用过 Human / Assistant 这种分隔符。
只是有些商业 API 把这层包起来了,用户摸不到原始模板。DeepSeek 把权重和配置放出来,这些后台路牌就明晃晃地摆在文件里。
Trend Micro 去年的红队报告里有个更危险的案例。他们测的是 671B 的 DeepSeek-R1,问题就出在 R1 默认把思考过程放在 <think> 标签里展示。结果,最终回答里没泄密,但思考区反而把系统提示里的 API key 给带了出来。
所以,如果以后我再看到哪个人工智能模型突然「抽风」,我可能第一反应就是去翻它前面的模板。很多怪事,就卡在那层「字符串胶水」里。
那一行 <think> 撬开的,就是这一层。
|