Appearance
DeepSeek Markup Language——DeepSeek 模型的原生工具调用格式,使用类似 XML 的标签结构表示函数调用和参数。
为什么需要 DSML
大语言模型输出的是文本序列。要让模型"调用工具"(如读文件、执行命令),需要一种文本格式来结构化地表达函数名和参数。DeepSeek 使用自有的 DSML 格式,而 OpenAI/Anthropic 使用 JSON 格式。ds4_server 做两种格式的双向转换。
标签结构
xml
<|DSML|tool_calls>
<invoke name="read_file">
<parameter name="path" string="true">/etc/hosts</parameter>
</invoke>
</|DSML|tool_calls>关键元素:
<|DSML|tool_calls>— 工具调用块的起始标记<invoke name="...">— 单个函数调用<parameter name="..." string="true">— 参数(string="true"表示字符串类型)- 嵌套参数支持——外层
<parameter>内可包含子参数,解析为 JSON 对象
流式解析状态机
ds4_server 在模型生成过程中实时追踪 DSML 状态:
DSML_DECODE_OUTSIDE — 不在工具调用内
DSML_DECODE_STRUCTURAL — DSML 标签结构(用温度 0 保证可解析)
DSML_DECODE_STRING_BODY — 字符串参数值(正常采样温度)
DSML_DECODE_JSON_STRUCTURAL — JSON 参数内的结构部分
DSML_DECODE_JSON_STRING — JSON 字符串值关键设计:标签结构用温度 0 保证可解析性,参数载荷(文件内容等)用正常温度避免重复。
Agent 工具结果包装
在 ds4-agent 中,工具执行结果现在以 <tool_result>...</tool_result> 标签包装后追加到对话历史。/history 命令自动剥离这些包装标签显示干净内容。畸形 DSML 调用触发语法提醒(agent_dsml_syntax_reminder)。
畸形 DSML 修复
模型输出因 max_tokens 截断时,try_repair_dsml 尝试修复:
- 在最后一个
</thinking>后搜索 DSML 标记 - 统计已打开但未关闭的标签
- 按逆嵌套顺序追加关闭标签
解析器加固
DSML 流式解析器经过多轮加固,处理模型输出的各种边缘情况:
- 标签校验:
agent_dsml_open_tag_is()精确匹配开标签(标签名后必须跟>/ 空格 / Tab / 换行),不再使用会误匹配子串的strncmp - 文本中的 DSML 检测:
agent_stream_note_plain_dsml_byte()检测正常文本中出现的 DSML 标记,触发AGENT_DSML_ERROR - 隐式 Invoke:当模型省略
<tool_calls>外层包装时,解析器自动合成规范开标签 - 参数关闭标签追踪:
param_close_prefix字段追踪部分关闭标签,支持 greedy 采样判断 - 畸形错误报告:终端显示红色
[invalid tool call: ...]错误信息 - Marker 检测器:
agent_dsml_marker_detector同时检测标准|DSML|和非标准DSML|格式
与 OpenAI Function Calling 的区别
| 方面 | DSML | OpenAI Function Calling |
|---|---|---|
| 格式 | 类 XML 标签 | JSON tool_calls 数组 |
| 流式 | 天然支持(增量标签) | 需要 JSON 拼接 |
| 参数类型 | string="true" 属性 | JSON schema 类型 |
| 嵌套 | 支持 <parameter> 嵌套 | 扁平 JSON 对象 |
相关概念
- kv-cache — DSML 工具记忆的精确回放保护 KV cache 一致性
- sse — 工具调用通过 SSE 流式推送给客户端
- cooperative-interruption — DSML 生成过程中可通过合作式中断优雅停止