下面是跑题的部分,那么从这个点出发,为什么ds灰度模型表现出了类似的xml antml的前缀通杀处理(实际上真的发生了吗?因为我本人从来没有被灰度命中过我无法保证,但是从一些人给出的证据看我们可以先姑且以这个事情发生了为前提继续往下看)会被怀疑有路由到claude系模型的可能。
我觉得可以从我设想的几种解释的不成立来反向体现这个嫌疑,我下面会列一些我认为合理的设想然后再驳斥掉,如果这些设想都不成立的话就显得剩下这个依然有可能性的路由论是发生可能性比较高的。当然如果后续有人提出来更合理的可能,那我就支持这种更合理的可能。
Q1 有没有可能deepseek的灰度模型也用了</antml:xxx>这套东西来进行特殊信息的控制?
A1 无法排除这种可能,但是在v4模型有了更好的处理方式的前提下,我觉得可能性不大。
dsv4和v4.1的分词器v4/4.1系列的公共分词器和system prompt(或者这里叫chat template也可以)V4.1构造system prompt的源码都是开源的。我们能看到deepseek用了一种我觉得比A社更好的方式。我们可以把dsv4的特殊消息标记叫做|DSML|标记简称dsml标记。
好的地方是,在分词器里可以看到,ds把|DSML|作为一个特殊token进行处理,而不是| DS ML |类似这样的零散token,当然光是这样还不够,还需要一个很巧妙的设计,就是在给用户分词的时候,即使用户的输入里有|DSML|这个文本,但是也不将其解释为那个特殊token,而是略过token以普通分词的方式把它拆分成普通token比如| DS ML |,这个是可以证明的,我们分别进行包含|DSML|和|QQQQ|输入的模型调用,看返回的input统计信息,如果token数是一致的就说明ds官方并没有把|DSML|视为一个特殊token,而是和|QQQQ|一样普通的token。
验证bash脚本(将官方key填在$DEEPSEEK_API_KEY的位置)
K=$DEEPSEEK_API_KEY; q(){ curl -s https://api.deepseek.com/v1/chat/completions -H "Authorization: Bearer $K" -H "Content-Type: application/json" -d "{\"model\":\"deepseek-flash\",\"messages\":[{\"role\":\"user\",\"content\":\"ZZZ$1ZZZ\"}],\"max_tokens\":1}" | python3 -c 'import json,sys;print(json.load(sys.stdin)["usage"]["prompt_tokens"])'; }; a=$(q '|DSML|'); b=$(q '|QQQQ|'); echo "|DSML| → $a tokens"; echo "|QQQQ| → $b tokens"; [ "$a" = "$b" ] && echo "✓ 相等 → 按普通文本拆开(无原子化)" || echo "✗ 不等 → DSML 被特殊对待"
所以其实DS本质上用了一种更巧妙的方法,就是将dsml标记隔离在用户输入外来实现防止特殊消息的攻击,那我就不觉得它会再用anthropic这种比较烂的方式在灰度模型处理攻击,而且还正好撞了antml这个名字。当然,也可以用DS灰度的时候正在学习A社的方法最后提出了更好的解决方案来解释,但是还是比较牵强就是了。
附带DS模型里dsml标记大概会长什么样:
[1] 工具调用(模型裸输出)──DSML 令牌唯一的用途
<|DSML| calls>
<|DSML| invoke name="...">
<|DSML| parameter name="..." string="true|false">...</|DSML| parameter>
</|DSML| invoke>
</|DSML| calls>
→ 调工具:外层 calls 包装 + 每调用一个 invoke + 参数列在 parameter;
可并行多个 invoke。string 属性:标量原样写标 "true",复合类型写 JSON 标 "false"
证据: encoding.py L429/L432(模板)、L520+(encode_arguments_to_dsml);
tokenizer id=128825;249 token 拟合确认线上同款
[2] 结果回传(系统注入,裸 ASCII 无 DSML)
<tool_result>...</tool_result>
→ 工具执行结果塞回对话,收发标签族不对称
证据: encoding.py L68-70 tool_output_template 原文
[3] 思考块(模型裸输出,纯 ASCII,无 DSML 无全角竖线)
<think>...思考内容...</think>
→ 交错思考;拼接式实现——历史里存「内容</think>」,
<think> 由 encoder 在 <|Assistant|> 后注入当"开始思考"提示
证据: encoding.py L31-32;tokenizer id=128821/128822;
249 拟合时填 <think> 成功对上线上 API
[4] 搜索任务令牌(encoder 注入,全角竖线格式但无 DSML 字样)
<|action|> <|query|> <|authority|> <|domain|> <|title|> <|read_url|>
→ 内置搜索流水线的分类令牌;公开 encoder 只做注入,无 cite 块
证据: encoding.py L43-50 DS_TASK_SP_TOKENS;tokenizer id=128829-128845
[5] 推理力度(第 0 条消息前缀,纯文本非 XML 无 DSML)
Reasoning Effort: 75 (range 1-100, the higher the value, the more thorough the reasoning)
→ 对应 API reasoning_effort 参数(low=50/high=75/max=100)
证据: encoding.py L439-442 REASONING_EFFORT_TEMPLATE 原文
[6] 消息边界令牌(encoder 注入,全角竖线格式无 DSML 字样)
<|begin▁of▁sentence|> <|System|> <|User|> <|Assistant|>
<|end▁of▁sentence|> <|latest_reminder|> <|deepseek_image|>
→ 角色边界标记;<|Assistant|> 后接 <think>(开思考)或 </think>(跳过思考)
证据: encoding.py L29-40;tokenizer 对应 id
Q2 退一步说,这个灰度模型有没有可能蒸馏了claude模型的输入和输出,让灰度模型具备类似的表现
A2 无法排除这种可能。但是这种可能成立的前提是DS专门或者无心搜集了用户输入里带</antml:xxx>的问答材料,并用于灰度模型的训练,否则在没有经过这方面的专项训练的情况下,灰度模型不可能自己学会了这种回答方式。而且这种材料理论上本身就是bad case,属于让模型困惑和降质的类型,专门清洗一批这样的数据用于训练逻辑上说不通。而且从现有证据来说灰度模型也是大小写通杀的,如果要通过蒸馏实现类似效果那么训练集也必须带有所有的大小写组合才行。
目前我能想到的正向猜想和反驳是这些,如果基于这个证据有更合理的猜测或者对于之前证据的推翻我觉得是可以进一步再讨论的