当前位置: 首页 > news >正文

DSML 工具调用格式完全指南:在 DeepSeek-V4-Pro-0813 中定义工具的 4 个步骤

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 个坑:

  1. required字段千万别漏——不声明的参数,模型可能不填。
  2. enum枚举能极大提升参数命中率,例如温度单位就限定celsius/fahrenheit
  3. 描述要写清楚用途,模型的工具选择准确性直接依赖描述质量。

三、第二步:把工具注入 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", ...}}], ...}

多轮工具对话的两个关键细节:

  1. 工具结果回填:DeepSeek-V4没有独立的 tool 角色。工具执行结果要用<tool_result>标签包裹、合并进 user 消息。官方提供了merge_tool_messages()帮你自动完成这种合并,无需手工拼接。

  2. 多工具结果排序:如果一次调用了多个工具,结果必须按调用顺序排列,否则模型会"串台"。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),仅供参考

http://www.cnnetsun.cn/news/4085524.html

相关文章:

  • Node.js入门教程(二十九):util 模块
  • Duo Navigation Drawer API 速查手册:核心方法与接口一网打尽
  • VBrowser-Android是什么?一款全网视频嗅探缓存APP的完整入门指南
  • SingGuard-NSFA-0.8B 的7个分类头详解:每个风险域如何独立检测与输出风险概率
  • 让AI控制电脑成为日常:UI-TARS Desktop零代码自动化工具完整上手攻略
  • 基于Python的旅游攻略分享平台系统网站(源代码+文档+PPT+调试+讲解)
  • 显卡频繁崩溃别再猜了:GPU显存测试免费工具 memtest_vulkan,5分钟锁定真凶
  • 为什么我建议每个 Mac 用户都试试 Topit?窗口置顶 30 分钟上手全记录
  • DotNetIsolator序列化原理深挖:MessagePack如何跨越宿主与沙箱传递任意对象
  • 为什么缓存会占满内存?Linux Page Cache原理与hcache的答案
  • Andy.scss 进阶指南:如何基于现有代码扩展属于自己的 SASS Mixins
  • FanControl快速上手指南:3分钟掌控Windows风扇转速曲线
  • AutoCAD字体缺失问题怎么解?FontCenter插件一劳永逸的完整指南
  • 大气层系统从入门到精通:Switch 自制固件完整实战避坑指南
  • 在ESP32上跑起OpenCV图像处理:新手也能一次成功的完整实战指南
  • NCSA Mosaic 2.7 的开源遗产:它对现代Web的10大深远贡献
  • 复现HMMR论文训练:从下载5大数据集到运行do_train.sh的一站式实操教程
  • 磁盘清理终极指南:Czkawka 14 个工具一次讲透,重复文件、相似图片、视频瘦身一步到位
  • 一副普通眼镜如何变成AI助手?OpenGlass 25元开源改造方案全解析
  • 用JSON定义游戏界面:FlatUI序列化功能完整上手教程
  • 开发效率提升300%:这套SpringBoot3+Vue3脚手架让你的项目快速启动
  • BilibiliDown使用指南:收藏夹300条内容一键落地的离线视频备份方案
  • Python进阶 - sys模块 退出程序与异常信息获取
  • 用 relly 学 Rust 系统编程:零拷贝与安全内存操作实战
  • lainTSX 是什么:在浏览器中游玩《Serial Experiments Lain》PSX 游戏的完整指南
  • 认识 LightningJS:第三方JavaScript嵌入方案如何同时做到安全、快速与异步?
  • stdarch测试体系全览:C/Rust随机对拍、反汇编断言与20+架构的CI矩阵
  • 【单片机毕业设计】基于 STM32 或 51 单片机的多传感融合智能学习照明设备设计 基于 STM32 或 51 单片机的带时钟定时功能智能护眼装置设计与实现(021303)
  • Milvus 迁移到 RAG:先守住索引和评测口径
  • 告别录屏几小时,m3u8-downloader 让 M3U8 视频下载一条命令搞定