OpenAI 的 Chat Completions API 和 DeepSeek 的 API 都提供了结构化输出功能,确保模型返回符合预期的 JSON 数据。目前来看,OpenAI的这一功能相对比较完善,DeepSeek还在探索和更新阶段,不过DeepSeek的API也是支持这一功能的。
结构化输出是指通过定义特定的数据格式(通常是 JSON),让模型生成可预测、可直接使用的响应。相比传统的自由文本输出,它在生产环境中更可靠,适用于数据提取、界面渲染或工作流驱动等场景。
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 的 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 实现,展示两者的实际应用。
系统提示:简洁,依赖模式定义。
你是一个人力资源助手。请根据用户输入生成员工的月度考勤报表。
代码:
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": "因病"
}
系统提示:详细,包含示例。
你是一个人力资源助手。请根据用户输入生成员工的月度考勤报表,输出为 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="" )
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))
输出:同上。
应用场景:人力资源系统,生成可存入数据库的数据。
系统提示:
你是一个书籍信息提取助手。请从描述中提取书名、作者和出版年份。
代码:略(类似案例 1,调整模式为 title, author, published_year)。
输出:
{ "title": "活着", "author": "余华", "published_year": 1993 }
系统提示:
你是一个书籍信息提取助手。请从描述中提取书名、作者和出版年份,输出为 JSON 格式,包含: - title: 书名 - author: 作者 - published_year: 出版年份 示例:输入“《活着》是余华创作的小说,出版于1993年”,输出: {"title": "活着", "author": "余华", "published_year": 1993}
代码:略(类似案例 1)。
输出:同上。
应用场景:内容管理系统,提取结构化信息。
系统提示:
你是一个智能推荐助手。根据用户需求推荐产品类别和颜色。
代码:模式定义 category(枚举)和 color。 输出:
{ "category": "鞋子", "color": "浅色" }
系统提示:
你是一个智能推荐助手。根据用户需求推荐产品类别和颜色,输出为 JSON 格式,包含: - category: 类别(服装、鞋子、配件) - color: 颜色 示例:输入“我想买一双春天的鞋子,最好是浅色的”,输出: {"category": "鞋子", "color": "浅色"}
代码:略。
输出:同上。
应用场景:电商推荐系统,生成查询参数。