结构化输出(深挖)
工具调用演变 讲了 Function Calling 让 AI 能调用外部工具。但有个问题一直没解决:AI 输出的格式不可靠。 你让它返回 JSON,有时候它多一个逗号,有时候少一个引号,程序就崩了。
2024 年 8 月,OpenAI 发布了 Structured Outputs,解决了这个问题 1。
问题:AI 的输出不可靠
之前想让 AI 输出结构化的数据,有两种办法:
JSON Mode(2023 年):告诉 AI “请输出 JSON 格式”。AI 会尽力——但有时候格式不对。{"name": "张三" 少了结尾的 },程序解析失败。
Function Calling(2023 年):让 AI 调用一个虚拟函数,函数的参数就是你想要的数据结构。AI 会把数据填进参数里。这个方法比 JSON Mode 可靠,但偶尔还是会出错——参数类型不对、漏了必填字段。
两种方法都依赖”提示词约束”——你只能靠文字描述告诉 AI 要什么格式。但文字描述是模糊的——“一个用户对象”和”一个带 name、age、email 的用户对象”——AI 理解可能不一致。
Structured Outputs:格式保证
Structured Outputs 的核心变化:格式不再是”文字描述”,而是”代码规则”。
你定义一个 JSON Schema(一种精确描述数据格式的规范),OpenAI 的 API 保证输出一定符合这个 Schema。不是”尽量”——是”保证”。
# 定义输出格式
schema = {
"type": "json_schema",
"json_schema": {
"name": "user_info",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"},
"email": {"type": "string"}
},
"required": ["name", "age", "email"]
}
}
}
response = client.chat.completions.create(
model="gpt-5.5", # 2026年推荐
messages=[{"role": "user", "content": "张三,28岁,邮箱 zhangsan@example.com"}],
response_format=schema # 保证输出符合 schema
)
# 输出保证是合法的 JSON,字段类型保证正确
原理:OpenAI 在模型推理的最后一步,强制约束输出 token 的选择——只允许那些能让 JSON 保持合法的 token。如果下一个 token 会破坏 JSON 结构,就跳过它,选下一个合法的。这是”结构性保证”,不是”提示词请求”。
JSON Mode vs Function Calling vs Structured Outputs
| JSON Mode | Function Calling | Structured Outputs | |
|---|---|---|---|
| 推出时间 | 2023 | 2023.06 | 2024.08 |
| 格式保证 | 尽力 | 较可靠 | 100%保证 |
| 适用场景 | 简单 JSON | 工具调用 | 任何结构化输出 |
| 需要 Schema | 不需要 | 函数签名 | 需要 |
2025-2026 年,Function Calling 也在底层升级了——支持 Strict Mode,背后用的就是 Structured Outputs 的技术。你不需要特意选 Structured Outputs vs Function Calling——底层已经统一 2。
为什么重要
在 Structured Outputs 之前,生产系统用 AI 做数据提取一直有”格式风险”——10 次调用可能有 1 次格式错误。那 1 次可能让整个流程崩溃。
Structured Outputs 把格式风险降到了零。AI 可以可靠地输出:
- 数据库记录
- API 响应
- 表单数据
- 代码 AST
这直接催生了”AI 替代传统解析器”的范式——以前用正则表达式从网页提取数据,现在直接让 AI 输出结构化数据。
跟你有什么关系
你用 AI 工具时可能感受不到 Structured Outputs 的存在——但它在幕后让很多功能变得可靠:
- AI 帮你整理表格数据(输出了一个合法的 CSV)
- AI 帮你填写表单(每个字段格式都对)
- AI 帮你做数据标注(输出的标签列表格式一致)
相关笔记
- 工具调用演变 — Function Calling 从 2023 到 2024 的演化
- 第15章 · Agent 之间的通信协议 — MCP 的工具定义是 JSON Schema
来源
- OpenAI, “Introducing Structured Outputs”, 2024.08, https://openai.com/index/introducing-structured-outputs/
- Vellum, “Function Calling vs Structured Outputs”, 2024.09, https://www.vellum.ai/blog/when-should-i-use-function-calling-structured-outputs
注释
-
OpenAI, “Introducing Structured Outputs”, 2024.08, https://openai.com/index/introducing-structured-outputs/ ↩
-
Vellum, “Function Calling vs Structured Outputs”, 2024.09, https://www.vellum.ai/blog/when-should-i-use-function-calling-structured-outputs ↩
关联5
知识图谱局部图谱 · 点节点跳转