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

流式解析状态机

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