DeepSeek V4 工具调用停止序列失效主因是 |DSML| 边界标记被破坏或特殊字符未转义,需严格校验 ASCII 格式、禁用客户端自动编码、显式设置 stop_sequences 并可切换至 V4-Flash 启用 strict_tool_mode。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您在使用 DeepSeek V4 进行工具调用或结构化输出时遇到停止序列(stop sequence)未生效、模型持续生成超出预期边界的内容,很可能是由于特殊字符未正确转义或 XML 格式 tool-call schema 中的 |DSML| 边界标记被破坏所致。以下是针对该问题的多种修正方法:
一、验证并重写 |DSML| 边界标记格式
DeepSeek V4 依赖严格的 |DSML| 特殊 token 作为工具调用起始与终止的硬性分隔符,任何空格、换行、Unicode 变体或编码差异都会导致解析失败,使停止序列失效。
1、确认请求 payload 中所有 |DSML| 出现位置均为 ASCII 字符,不含全角竖线、零宽空格或 BOM 头。
2、确保每个 tool-call 块严格遵循:|DSML|
3、若通过 JSON 接口提交,需将整个 XML 片段作为字符串字段值,且该字段名必须为 tool_calls 或符合官方 API 文档指定的 key 名。
二、禁用客户端自动转义机制
部分 HTTP 客户端库(如 Python 的 requests、JavaScript 的 fetch)会对 URL 参数或 JSON body 中的竖线(|)或尖括号()执行默认编码,导致 |DSML| 被篡改为 %7CDSML%7C 或其他形式,服务端无法识别原始边界标记。
1、在构造请求体前,手动对包含 |DSML| 的字符串进行 raw 字符串处理,避免双重编码。
2、若使用 Python,改用 json.dumps(..., ensure_ascii=False) 并关闭 urllib.parse.quote 自动调用。
3、在 JavaScript 中,使用 JSON.stringify() 直接序列化对象,不经过 encodeURI 或 encodeURIComponent 处理 tool_calls 字段。
三、显式设置 stop_sequences 参数
当模型在 tool-call 后仍继续生成自然语言内容时,需在 API 请求中显式传入终止序列数组,强制截断输出。V4 对 stop_sequences 的匹配是精确字节级的,大小写与符号必须完全一致。
1、在请求 JSON 中添加字段:"stop_sequences": ["|DSML|", "", "```"],按优先级从高到低排列。
2、确保数组中每个字符串均为纯 ASCII,长度不超过 16 字符,且不含尾部空格。
3、若使用 chat.deepseek.com 网页界面调试,需在开发者工具 Network 面板中检查实际发出的 POST payload,确认 stop_sequences 已正确嵌入 request body。
四、切换至 V4-Flash 模型并启用 strict_tool_mode
V4-Flash 版本内置更鲁棒的 tool-call 解析器,在 strict_tool_mode=true 下会主动拒绝任何未闭合或格式错误的 |DSML| 块,并立即触发停止,而非容错续写。
1、将 model 参数由 deepseek-v4-pro-max 替换为 deepseek-v4-flash。
2、在请求 body 中增加布尔字段:"strict_tool_mode": true。
3、验证响应 headers 中是否包含 X-Tool-Parse-Status: success,若为 failure 则返回含具体语法错误位置的 diagnostic message。



















