# GPT-4o 新版本发布,成本直降 50%,还能“指哪打哪”地输出结构化数据!
先说个好消息:GPT-4o 昨天迎来了新版本更新!输入成本直接砍半,输出也省了三分之一。更关键的是,这次它原生支持了结构化输出——对做开发的读者来说,这功能简直是个“梦中情技”。
从非结构化的自然语言里,精确提取结构化数据,一直是AI应用落地的核心痛点。过去,开发者们得靠开源工具、写提示词、反复重试请求,才能让大模型乖乖输出符合系统要求的格式。折腾不说,效果还不稳定。现在,OpenAI 的 Structured Outputs(结构化输出)算是把这条路彻底铺平了——通过在复杂模板上训练模型,再辅以约束解码,效果立竿见影。
下面这张对比图很能说明问题:在生成复杂 JSON 的任务上,Structured Outputs 直接拉到 100% 的成功率:

接下来,我们拆解一下 OpenAI 是怎么做到的,以及怎么上手用起来。
## 实现原理
Structured Outputs 的核心思路,说白了就是“约束解码”——通过限制模型生成 token 时的可选范围,确保输出严格匹配开发者预定义的 JSON Schema。关键点有这么几个:
- **基于 JSON Schema 的约束**:你给什么格式,模型就出什么格式,不走样。
- **上下文无关文法(CFG)**:OpenAI 把 JSON Schema 转成 CFG。相比有限状态机(FSM),CFG 能处理更复杂的结构,像嵌套、递归这些,CFG 都扛得住。
- **动态约束解码**:模型每生成一个 token,推理引擎就根据已生成的 token 和 CFG 规则,实时算出身下哪些 token 是允许的。跟考试时划重点一样——不在范围内的,答案直接判零分。
- **缓存加速**:预处理后的 JSON Schema 会被转成高效缓存数据结构,每次采样时,快速确定有效 token 列表,几乎不拖慢速度。
- **无效 token 归零**:每生成一个 token,马上用有效列表“掩蔽”下一步的采样空间,让无效 token 的概率直接降为 0。
- **新 Schema 的延迟**:第一次用某个新 JSON Schema 时,首请求会多花点时间(通常不到 10 秒,复杂 Schema 可能更久)去做处理缓存。
- **避开并行函数调用**:Structured Outputs 和并行函数调用不兼容。如果在函数定义里开了并行调用,输出可能跟 Schema 对不上。解决办法是在调用时设置 `parallel_tool_calls: false`。
- **靠工程手段实现 100% 可靠性**:尽管模型本质上是非确定性的,但这套方法几乎能做到“指哪打哪”,输出百分百合规。
- **限制**:目前只支持 JSON Schema 的一部分。此外,如果模型识别到不安全请求,或输出达到 token 上限,也有可能无法遵循 Schema。
### 什么是 CFG
CFG(上下文无关文法)是形式语言理论里的经典概念,用来描述语法结构。它由几个基本部分组成:
1. **终结符**:语言的基本单元,好比句子里的单词或字符。
2. **非终结符**:代表终结符的组合方式,可以逐步展开。
3. **起始符号**:整个推导过程的起点。
4. **产生式规则**:每条规则定义如何把一个非终结符替换为其他符号或终结符序列。
5. **句子生成**:从起始符号开始,反复应用规则,直到生成一串完整的终结符序列。
CFG 最大的优势在于,它能描述嵌套和递归这种复杂的语言结构——比如深度嵌套的 JSON 对象。这点意义重大,我们下面会看到。
### CFG 的替代方案
除了 CFG,业界也有用有限状态机(FSM)或正则表达式来做约束解码的。它们原理相似——每生成一个 token 后动态更新有效 token 集——但和 CFG 有本质不同:FSM 在处理嵌套或递归结构时,往往会“卡壳”。举个简单的例子,JSON 里冒号后深层嵌套的花括号,FSM 经常匹配不上。OpenAI 的做法就是靠 CFG 彻底解决这个问题。
下面这个递归模式,在 OpenAI API 上完全支持,但用 FSM 就表达不了:
```json
{
"type": "object",
"properties": {
"value": { "type": "number" },
"next": { "type": "object", ... }
}
}
```
## 如何调用
目前有两种方式可以启用结构化输出。
### 1. 函数调用
在函数定义中设置 `strict: true` 即可。适用于所有支持工具调用的模型(包括 `gpt-4-0613` 和 `gpt-3.5-turbo-0613` 及更高版本)。启用后,模型输出会严格匹配你提供的工具定义。
```json
POST /v1/chat/completions
{
"model": "gpt-4o-2024-08-06",
"messages": [
{"role": "system", "content": "You are a helpful assistant. The current date is August 6, 2024. You help users query for the data they are looking for by calling the query function."},
{"role": "user", "content": "look up all my orders in may of last year that were fulfilled but not delivered on time"}
],
"tools": [{
"type": "function",
"function": {
"name": "query",
"strict": true,
"parameters": { ... }
}
}]
}
```
### 2. 新参数:response_format
如果你不需要模型调用工具,而是希望它直接以结构化方式响应用户,可以用 `response_format` 参数,设置 `type: json_schema`,再传入你的 JSON Schema。这个功能在 `gpt-4o-2024-08-06` 和 `gpt-4o-mini-2024-07-18` 上已经支持。
```json
POST /v1/chat/completions
{
"model": "gpt-4o-2024-08-06",
"messages": [
{"role": "system", "content": "You are a helpful math tutor."},
{"role": "user", "content": "solve 8x + 31 = 2"}
],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "math_response",
"strict": true,
"schema": {
"type": "object",
"properties": {
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"explanation": {"type": "string"},
"output": {"type": "string"}
},
"required": ["explanation", "output"]
}
},
"final_answer": {"type": "string"}
},
"required": ["steps", "final_answer"]
}
}
}
}
```
更详细的介绍可以看 OpenAI 官方博客。
总的来说,这次更新实实在在地降低了开发者接入大模型的成本和门槛。结构化输出不再是需要额外工具绕路的“硬骨头”,而变成了 API 原生支持的“水到渠成”。如果你在搭应用时一直被模型“乱输出”困扰,不妨试试这个新能力。