结构化数据的超强功能:对比OpenAI与DeepSeek的结构化输出
随着大语言模型的普及,结构化输出成为提升响应可控性和实用性的关键技术。本文对比了 OpenAI 和 DeepSeek 的结构化输出功能,展示了其在开发者中的应用潜力。OpenAI 的 Chat Completions API 通过 response_format 和 strict: true,强制生成符合 JSON 架构的响应,适合需要高精度场景;DeepSeek 的 API 则通过 respon
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。
更多推荐
所有评论(0)