DSML 工具调用格式完全指南:在 DeepSeek-V4-Pro-0813 中定义工具的 4 个步骤
【免费下载链接】DeepSeek-V4-Pro-0813项目地址: https://ai.gitcode.com/hf_mirrors/deepseek-ai/DeepSeek-V4-Pro-0813
想要让 DeepSeek-V4-Pro-0813 真正"动手干活"?掌握DSML 工具调用格式是关键。作为 DeepSeek-V4-Pro 的官方正式版,DeepSeek-V4-Pro-0813 大幅增强了 Agent 能力(Terminal Bench 2.1 得分 87.9),而它的函数调用并不使用传统 JSON,而是采用了一种名为DSML(DeepSeek Markup Language)的标记语言。本文用 4 个步骤,带你从零完成工具定义到调用解析的全流程,新手也能快速上手。🚀
一、DSML 工具调用格式是什么?
在解释步骤之前,先认识两个核心概念,这会让你后面的操作事半功倍。
DSML 是什么?DSML 是 DeepSeek-V4 系列模型专用的结构化标记语言,用<|DSML|>前缀标签来描述工具调用,而不是像 OpenAI 那样输出 JSON 字符串。模型的工具调用输出形如:
<|DSML|tool_calls> <|DSML|invoke name="get_weather"> <|DSML|parameter name="location" string="true">Beijing</|DSML|parameter> </|DSML|invoke> </|DSML|tool_calls>为什么用 DSML?相比纯 JSON,DSML 用明确的开始/结束标签把"函数名"和"参数"天然分隔,解析更稳定、错误更少,特别适合多轮、多工具并发的复杂 Agent 场景。
好消息是:你不需要手动拼这些标签。官方在 encoding_dsv4.py 中提供了完整的编码/解码参考实现,直接调用即可。下面进入正题。
二、第一步:用 OpenAI 格式定义工具
DeepSeek-V4-Pro-0813 的工具定义采用OpenAI 兼容的 JSON Schema 格式,如果你用过其他大模型 API,这套定义几乎零成本迁移。
每个工具包含三要素:name(名称)、description(描述)、parameters(参数 Schema)。来看官方测试用例 test_input_1.json 中的真实示例:
{ "type": "function", "function": { "name": "get_weather", "description": "Get the weather for a specific location", "parameters": { "type": "object", "properties": { "location": {"type": "string", "description": "The city name"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]} }, "required": ["location"] } } }新手最容易踩的 3 个坑:
required字段千万别漏——不声明的参数,模型可能不填。enum枚举能极大提升参数命中率,例如温度单位就限定celsius/fahrenheit。- 描述要写清楚用途,模型的工具选择准确性直接依赖描述质量。
三、第二步:把工具注入 system 消息
定义好工具后,需要把它挂到system(或 developer)消息的tools字段上。这是整个流程的"注入点"。
在 Python 中,你的消息列表长这样:
messages = [ {"role": "system", "content": "You are a helpful assistant.", "tools": tools}, {"role": "user", "content": "What's the weather in Beijing?"}, ]注意:工具只支持挂在 system / developer 消息上。调用编码函数后,系统会自动把## Tools区块(包含使用说明 + 工具 Schema JSON)拼接到 system 提示词中,这一逻辑由 encoding_dsv4.py 中的render_tools()函数实现。
四、第三步:编码消息为 DSML 提示词
这是最核心的一步——调用encode_messages()把整个对话(含工具定义)转换成模型能理解的 DSML 提示词字符串:
from encoding_dsv4 import encode_messages prompt = encode_messages(messages, thinking_mode="thinking")思考模式参数说明:
thinking_mode="thinking":模型先在<think>...</think>中推理,再输出工具调用(推荐 Agent 场景)。thinking_mode="chat":直接输出,不产生推理块。
生成的提示词中,模型扮演的助手会收到一份完整的工具使用说明书,包括 DSML 标签语法、string="true|false"参数规则,以及 "You MUST strictly follow..." 的强约束语句。参数规则务必记住:字符串参数标记为string="true"原样输出;数字、布尔、数组、对象等 JSON 类型标记为string="false"。若想控制推理深度,还可传入reasoning_effort="low" | "high" | "max"。
五、第四步:解析工具调用并回填结果
模型输出后,用parse_message_from_completion_text()解析出结构化结果——它会自动抽取reasoning_content(思考)、content(正文)和tool_calls(工具调用,自动转回 OpenAI 格式):
from encoding_dsv4 import parse_message_from_completion_text parsed = parse_message_from_completion_text(completion_text, thinking_mode="thinking") # => {"role": "assistant", "tool_calls": [{"function": {"name": "get_weather", ...}}], ...}多轮工具对话的两个关键细节:
工具结果回填:DeepSeek-V4没有独立的 tool 角色。工具执行结果要用
<tool_result>标签包裹、合并进 user 消息。官方提供了merge_tool_messages()帮你自动完成这种合并,无需手工拼接。多工具结果排序:如果一次调用了多个工具,结果必须按调用顺序排列,否则模型会"串台"。
sort_tool_results_by_call_order()正是为此设计,可在 encoding_dsv4.py 中查看实现。
六、完整流程验证:跑通官方测试
想快速验证自己理解是否正确?项目自带了 4 组完整的编解码测试,覆盖了"思考 + 工具调用 + 多轮回填"、"纯思考对话"、"搜索 + 工具"等真实场景。
cd encoding python test_encoding_dsv4.py测试脚本会读取 test_input_1.json 等输入文件,将编码结果与 test_output_1.txt 等黄金文件逐字节比对。你也可以直接查看输出文件,直观感受 DSML 完整格式——从 BOS 开始、工具区块注入、<|DSML|tool_calls>调用,到<tool_result>结果回填、EOS 收尾,一目了然。
七、总结:记住这条最小链路
回顾一下,在 DeepSeek-V4-Pro-0813 中完成一次 DSML 工具调用,只需记住 4 步:① OpenAI 格式定义工具 → ② 挂到 system 消息 → ③ encode_messages 编码 → ④ parse 解析 + 结果回填。官方 encoding/README.md 有更完整的格式文档,encoding_dsv4.py 则是可放心复用的参考实现。掌握这套 DSML 工具调用格式,你的 Agent 应用开发就能直接站在官方基准之上起跑。💪
【免费下载链接】DeepSeek-V4-Pro-0813项目地址: https://ai.gitcode.com/hf_mirrors/deepseek-ai/DeepSeek-V4-Pro-0813
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考