Skip to content

DeepSeek API 支持 JSON Output 模式,通过设置 response_format: {type: "json_object"} 强制模型输出合法 JSON 字符串,适合需要结构化数据的场景。使用时 prompt 中必须包含 json 字样,否则模型可能不知道要输出什么结构。

DeepSeek API JSON Output

什么是 JSON Output

JSON Output 模式确保模型输出合法的 JSON 字符串,解析时不会抛出 JSON.parse 异常。适用场景:

  • 从文本中提取结构化数据
  • 生成配置文件
  • API 返回固定格式的结果

使用方法

typescript
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.deepseek.com",
  apiKey: process.env.DEEPSEEK_API_KEY,
});

const systemPrompt = `从用户提供的文字中提取信息,输出 JSON 格式。
示例输入:小明今年 25 岁,住在北京。
示例 JSON 输出:{"name": "小明", "age": 25, "city": "北京"}`;

const response = await client.chat.completions.create({
  model: "deepseek-v4-pro",
  messages: [
    { role: "system", content: systemPrompt },
    { role: "user", content: "李华,女,32 岁,目前在上海工作。" },
  ],
  response_format: { type: "json_object" }, // 开启 JSON Output
});

const data = JSON.parse(response.choices[0].message.content ?? "{}");
console.log(data);
// { name: "李华", gender: "女", age: 32, city: "上海" }

Python 版本:

python
import json
from openai import OpenAI

client = OpenAI(api_key="<your api key>", base_url="https://api.deepseek.com")

system_prompt = """从用户提供的文字中提取信息,以 JSON 格式输出。
示例输入:小明今年 25 岁,住在北京。
示例 JSON 输出:{"name": "小明", "age": 25, "city": "北京"}"""

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": "李华,女,32 岁,目前在上海工作。"},
    ],
    response_format={"type": "json_object"},
)

data = json.loads(response.choices[0].message.content)
print(data)

必须遵守的规则

规则说明
prompt 必须包含 json 字样system 或 user prompt 中至少有一个地方提到 json,否则模型不知道要输出什么结构
提供示例输出告诉模型你期望的 JSON 结构,否则字段可能不稳定
设置合理的 max_tokens防止 JSON 被截断,导致无法解析
处理 null/空 content极少情况下模型可能返回空 content,需要做 fallback

常见踩坑

踩坑 1:忘记在 prompt 里写 json

typescript
// ❌ 错误:没有提到 json
const systemPrompt = "从文字中提取姓名和年龄";

// ✅ 正确:明确说明要 json 格式
const systemPrompt = "从文字中提取姓名和年龄,以 json 格式输出";

踩坑 2:JSON 被截断

typescript
// ❌ max_tokens 太小
{ max_tokens: 50 }  // JSON 还没结束就被截断

// ✅ 留够空间
{ max_tokens: 500 }

踩坑 3:没有处理空 content

typescript
// ❌ 直接 parse,空 content 会抛异常
const data = JSON.parse(response.choices[0].message.content);

// ✅ 做 fallback
const raw = response.choices[0].message.content ?? "{}";
const data = JSON.parse(raw);

JSON Output vs Tool Calls Strict 模式

JSON OutputTool Calls Strict 模式
约束程度保证合法 JSON,但字段不严格严格按 JSON Schema
schema 定义在 prompt 中描述tools.function.parameters 中定义
适用场景灵活提取、字段不固定需要精确结构的 Agent
复杂度

如果需要严格保证字段结构(比如必须有某字段、类型必须正确),建议用 Tool Calls Strict 模式,比 JSON Output 更可靠。

常见问题

Q: JSON Output 和直接在 prompt 里要求输出 JSON 有什么区别?

A: 没有 response_format: {type: "json_object"} 时,模型可能输出 markdown 代码块(json ... )包裹的内容,或者加一些解释文字,导致 JSON.parse 失败。开启 JSON Output 模式后,模型保证直接返回 JSON 字符串,不会有任何包装。

Q: 可以指定具体的 JSON Schema(字段类型、必须字段)吗?

A: JSON Output 模式不支持 schema 约束,只保证合法 JSON。需要 schema 约束请用 Tool Calls Strict 模式。

Q: stream 流式输出支持 JSON Output 吗?

A: 支持,但需要等流结束后再拼接完整字符串再解析,不能在流中间解析。