结构化输出
使用 response_format 参数获取 JSON 格式的模型输出,适用于数据提取、分类、信息结构化等场景。
JSON 模式
最简单的方式是设置 {"type": "json_object"}。模型会尝试返回合法的 JSON,但不保证符合特定结构。
JSON 模式Python
from openai import OpenAI
client = OpenAI(
base_url="https://www.ulovegpt.com/v1",
api_key="<你的 API_KEY>"
)
# 使用 json_object 模式
response = client.chat.completions.create(
model="openai/gpt-5.4-mini",
messages=[
{
"role": "system",
"content": "你是一个数据提取助手。请将以下文本提取为 JSON 格式。"
},
{
"role": "user",
"content": "张三,28岁,北京人,软件工程师,喜欢摄影和徒步旅行。"
}
],
response_format={"type": "json_object"}
)
import json
data = json.loads(response.choices[0].message.content)
print(json.dumps(data, indent=2, ensure_ascii=False))
# {
# "name": "张三",
# "age": 28,
# "city": "北京",
# "occupation": "软件工程师",
# "hobbies": ["摄影", "徒步旅行"]
# }JSON Schema 模式
使用 json_schema 类型可以定义严格的输出结构,配合 strict: true 强制模型遵循 Schema。
JSON Schema 模式Python
from openai import OpenAI
client = OpenAI(
base_url="https://www.ulovegpt.com/v1",
api_key="<你的 API_KEY>"
)
# 使用 json_schema 模式,定义严格的 JSON Schema
response = client.chat.completions.create(
model="openai/gpt-5.4-mini",
messages=[
{
"role": "system",
"content": "分析用户评论并提取结构化信息。"
},
{
"role": "user",
"content": "这家餐厅环境很好,服务也很热情,但价格有点贵,菜品味道一般。"
}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "review_analysis",
"schema": {
"type": "object",
"properties": {
"sentiment": {
"type": "string",
"enum": ["positive", "negative", "neutral", "mixed"]
},
"aspects": {
"type": "array",
"items": {
"type": "object",
"properties": {
"category": {"type": "string"},
"score": {"type": "integer", "minimum": 1, "maximum": 5}
},
"required": ["category", "score"]
}
},
"summary": {"type": "string"}
},
"required": ["sentiment", "aspects", "summary"]
},
"strict": True
}
}
)
print(response.choices[0].message.content)Anthropic JSON 输出
Anthropic 协议不原生支持 response_format,但可以通过 Prompt 指令实现。对于结构化输出,也可以使用 Anthropic 的 tool_use 作为替代方案。
Claude JSON 输出Python
import anthropic
import json
client = anthropic.Anthropic(
base_url="https://www.ulovegpt.com/anthropic",
api_key="<你的 API_KEY>"
)
message = client.messages.create(
model="anthropic/claude-sonnet-4.6",
max_tokens=1024,
messages=[
{
"role": "user",
"content": """请分析以下用户评论并以 JSON 格式返回。
格式要求:{"sentiment": "positive|negative|mixed", "keywords": [...], "summary": "..."}
评论:这款产品性价比很高,但售后服务需要改进。"""
}
]
)
data = json.loads(message.content[0].text)
print(json.dumps(data, indent=2, ensure_ascii=False))response_format 参数
| 模式 | 说明 | 支持协议 |
|---|---|---|
{"type": "text"} | 默认,纯文本输出 | 全部 |
{"type": "json_object"} | JSON 格式,无结构约束 | OpenAI |
{"type": "json_schema"} | 严格 JSON Schema 约束 | OpenAI |
最佳实践
- System Prompt:在 system 消息中明确说明 JSON 格式要求
- strict: true:开启严格模式确保输出符合 Schema
- 异常处理:始终用
try/except包裹 JSON 解析 - enum 约束:使用 enum 限制字段可选值,提升一致性
- 备用方案:Claude 可通过 tool_use 实现等效的结构化输出