Structured Output

结构化输出

强制模型输出 JSON 或指定 Schema 的结果,便于程序解析。

详解

结构化输出是让模型输出符合预定义格式(通常是 JSON)的技术,目标是让输出可以被程序直接解析,而非只是给人看的自然语言。纯靠 Prompt 要求「输出 JSON」在实践中失败率约 8–15%——模型偶尔会输出 Markdown 代码块、多说一句废话、或字段名写错。更可靠的做法有两种:①Schema 约束(OpenAI 的 Structured Outputs 或 Gemini 的 response_schema,成功率可达 99.7%+)②工具调用(Anthropic 的方案:把目标 JSON 结构定义成一个「工具」的 input_schema,让模型以调用工具的形式输出结构化数据,成功率约 99.8%)。Anthropic 没有专门的 JSON mode,但 tool use 方案同样稳定。使用结构化输出时,Schema 设计要遵守:字段名清晰易懂(模型靠字段名猜语义)、必填字段列入 required、类型要具体(用 enum 而非 string,当取值有限时)。即使用了 Schema 约束,生产代码也应该加 try/except 做容错解析,不要假设 100% 成功。

一个类比
就像餐厅订单系统:服务员(模型)听到客户需求后,不能随便用语言描述给厨房,而必须填一张标准订单表格(JSON)——「主菜:牛排,熟度:七分,忌口:无葱」。表格格式固定,厨房系统才能自动读取处理。如果服务员用自由文本描述「客人要一份不太熟的牛排,还有点不喜欢葱」,厨房系统就没办法直接解析了。
举个例子
# Anthropic 结构化输出:用 tool use 方案稳定获取 JSON
import anthropic
import json

client = anthropic.Anthropic()

# 把目标结构定义为工具的 input_schema
extract_tool = {
    "name": "extract_product_info",
    "description": "从用户描述中提取产品信息",
    "input_schema": {
        "type": "object",
        "properties": {
            "product_name": {"type": "string", "description": "产品名称"},
            "price": {"type": "number", "description": "价格(元)"},
            "category": {
                "type": "string",
                "enum": ["电子产品", "服装", "食品", "其他"],
                "description": "产品类别"
            },
            "in_stock": {"type": "boolean", "description": "是否有货"}
        },
        "required": ["product_name", "price", "category"]
    }
}

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=256,
    tools=[extract_tool],
    tool_choice={"type": "tool", "name": "extract_product_info"},  # 强制调用工具
    messages=[{
        "role": "user",
        "content": "索尼 WH-1000XM5 耳机,售价 2499 元,目前有货。"
    }]
)

# 从 tool_use block 取出结构化数据
tool_result = next(b for b in resp.content if b.type == "tool_use")
data = tool_result.input  # 已经是 dict,可直接使用
print(json.dumps(data, ensure_ascii=False, indent=2))
PYTHON 示例
相关概念