OpenAI 的 Chat Completions API 和 DeepSeek 的 API 都提供了结构化输出功能,确保模型返回符合预期的 JSON 数据。目前来看,OpenAI的这一功能相对比较完善,DeepSeek还在探索和更新阶段,不过DeepSeek的API也是支持这一功能的。


什么是结构化输出?

结构化输出是指通过定义特定的数据格式(通常是 JSON),让模型生成可预测、可直接使用的响应。相比传统的自由文本输出,它在生产环境中更可靠,适用于数据提取、界面渲染或工作流驱动等场景。

  • OpenAI 的方式:通过 response_format 参数和 strict: true,强制模型遵循指定的 JSON 架构。
  • DeepSeek 的方式:通过 response_format={“type”: “json_object”} 和提示工程,引导模型输出 JSON。这种方式OpenAI也是支持的。

实现方式对比

OpenAI 的结构化输出

OpenAI 的 Chat Completions API 提供了一种强大的结构化输出机制。开发者可以通过 json_schema 定义详细的模式,并启用 strict: true 确保严格遵守。这种方式适合需要高精度和复杂结构的场景。

核心代码示例

response = client.chat.completions.create(
    model="gpt-4o-2024-08-06",
    messages=[...],
    response_format={
        "type": "json_schema",
        "json_schema": {...},
        "strict": True
    }
)

DeepSeek 的 JSON 输出

DeepSeek 的 API 则依赖提示工程和 response_format={“type”: “json_object”}。开发者需要在提示中明确要求 JSON 格式并提供示例,模型会尽量生成符合预期的输出。这种方式更灵活,但一致性稍逊于 OpenAI。

核心代码示例

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[...],
    response_format={"type": "json_object"}
)
特性 OpenAI DeepSeek
定义方式 JSON Schema + strict: true 提示工程 + 示例
严格性 高,强制模式 中,依赖提示质量
灵活性 中等,需预定义模式 高,可动态调整输出
适用场景 复杂结构、高可靠性需求 简单结构、快速原型

案例展示

以下是三个案例,分别用 OpenAI 和 DeepSeek 实现,展示两者的实际应用。

案例 1:生成员工考勤报表

OpenAI 实现

系统提示:简洁,依赖模式定义。

你是一个人力资源助手。请根据用户输入生成员工的月度考勤报表。

代码

from openai import OpenAI
import json

client = OpenAI()
MODEL = "gpt-4o-2024-08-06"

def get_attendance_report_openai(employee_input):
    response = client.chat.completions.create(
        model=MODEL,
        messages=[
            {"role": "system", "content": "你是一个人力资源助手。请根据用户输入生成员工的月度考勤报表。"},
            {"role": "user", "content": employee_input}
        ],
        response_format={
            "type": "json_schema",
            "json_schema": {
                "name": "attendance_report",
                "schema": {
                    "type": "object",
                    "properties": {
                        "name": {"type": "string"},
                        "working_days": {"type": "integer"},
                        "absence_reason": {"type": "string", "nullable": True}
                    },
                    "required": ["name", "working_days"],
                    "additionalProperties": False
                },
                "strict": True
            }
        }
    )
    return json.loads(response.choices[0].message.content)

input_text = "张三这个月工作了20天,因病缺勤2天。"
result = get_attendance_report_openai(input_text)
print(json.dumps(result, ensure_ascii=False, indent=2))

输出

{
  "name": "张三",
  "working_days": 20,
  "absence_reason": "因病"
}
DeepSeek 实现

系统提示:详细,包含示例。

你是一个人力资源助手。请根据用户输入生成员工的月度考勤报表,输出为 JSON 格式,包含: - name: 员工姓名(字符串) - working_days: 工作天数(整数) - absence_reason: 缺勤原因,若无则为 null(字符串或 null) 示例:输入“张三本月工作了20天,因病缺勤2天”,输出: {"name": "张三", "working_days": 20, "absence_reason": "因病"}

代码

client = OpenAI(base_url="https://api.deepseek.com", api_key="<your_key>")
MODEL = "deepseek-chat"

def get_attendance_report_deepseek(employee_input):
    response = client.chat.completions.create(
        model=MODEL,
        messages=[
            {"role": "system", "content": "你是一个人力资源助手。请根据用户输入生成员工的月度考勤报表,输出为 JSON 格式,包含:\n- name: 员工姓名(字符串)\n- working_days: 工作天数(整数)\n- absence_reason: 缺勤原因,若无则为 null(字符串或 null)\n示例:输入“张三本月工作了20天,因病缺勤2天”,输出:\n{\"name\": \"张三\", \"working_days\": 20, \"absence_reason\": \"因病\"}"},
            {"role": "user", "content": employee_input}
        ],
        response_format={"type": "json_object"}
    )
    return json.loads(response.choices[0].message.content)

result = get_attendance_report_deepseek(input_text)
print(json.dumps(result, ensure_ascii=False, indent=2))

输出:同上。

应用场景:人力资源系统,生成可存入数据库的数据。


案例 2:书籍信息提取

OpenAI 实现

系统提示

你是一个书籍信息提取助手。请从描述中提取书名、作者和出版年份。

代码:略(类似案例 1,调整模式为 title, author, published_year)。

输出

{  "title": "活着",  "author": "余华",  "published_year": 1993 }
DeepSeek 实现

系统提示

你是一个书籍信息提取助手。请从描述中提取书名、作者和出版年份,输出为 JSON 格式,包含: - title: 书名 - author: 作者 - published_year: 出版年份 示例:输入“《活着》是余华创作的小说,出版于1993年”,输出: {"title": "活着", "author": "余华", "published_year": 1993}

代码:略(类似案例 1)。

输出:同上。

应用场景:内容管理系统,提取结构化信息。


案例 3:智能推荐系统

OpenAI 实现

系统提示

你是一个智能推荐助手。根据用户需求推荐产品类别和颜色。

代码:模式定义 category(枚举)和 color。 输出

{  "category": "鞋子",  "color": "浅色" }
DeepSeek 实现

系统提示

你是一个智能推荐助手。根据用户需求推荐产品类别和颜色,输出为 JSON 格式,包含: - category: 类别(服装、鞋子、配件) - color: 颜色 示例:输入“我想买一双春天的鞋子,最好是浅色的”,输出: {"category": "鞋子", "color": "浅色"}

代码:略。

输出:同上。

应用场景:电商推荐系统,生成查询参数。


优缺点分析

  • OpenAI
    • 优点:严格模式,高可靠性,适合复杂结构。
    • 缺点:需预定义模式,灵活性稍低,仅限部分模型(如 gpt-4o)。
  • DeepSeek
    • 优点:提示驱动,灵活性高,兼容性好。
    • 缺点:依赖提示质量,可能返回空内容,需优化 max_tokens。

最佳实践

  • OpenAI:使用 strict: true 和详细模式定义,确保输出一致性。
  • DeepSeek:提供清晰提示和示例,设置合理 max_tokens,处理空内容异常。
  • 选择建议:需要高精度选 OpenAI,快速原型或成本敏感选 DeepSeek。
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐