结构化输出

使用 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 实现等效的结构化输出