Skip to content

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 对象

GLM 方言(2026-09):GLM 模型不说 <invoke> 方言,而用 <tool_call>...</tool_call>。ds4_server.c 的 glm_tool_syntax(一个 dsml_syntax 实例)+ 泛化的 dsml_find_tool_start_from 让同一套解析状态机跑两种方言。

字面工具数据(2026-09):参数体里出现的 </parameter> 等文本只转义它自己的关闭分隔符(ds4_tool_text.h 的 ds4_tool_text_escaped_close / _unescape / _partial_escape)——agent 与 server 两条渲染路径共用,保证"模型看到的字节 = 客户端来回传递的字节",KV cache 不因重渲染失效。

流式解析状态机 ​

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 尝试修复:

  1. 在最后一个 </thinking> 后搜索 DSML 标记
  2. 统计已打开但未关闭的标签
  3. 按逆嵌套顺序追加关闭标签

解析器加固 ​

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 的区别 ​

方面DSMLOpenAI Function Calling
格式类 XML 标签JSON tool_calls 数组
流式天然支持(增量标签)需要 JSON 拼接
参数类型string="true" 属性JSON schema 类型
嵌套支持 <parameter> 嵌套扁平 JSON 对象

相关概念 ​

  • kv-cache — DSML 工具记忆的精确回放保护 KV cache 一致性
  • sse — 工具调用通过 SSE 流式推送给客户端
  • cooperative-interruption — DSML 生成过程中可通过合作式中断优雅停止

详见 Part 5 — Tool Calling。