结构化输出是什么
结构化输出让模型返回可被程序直接解析的数据,而不是一段自然语言。做法分三档:最弱的是在提示里要求返回 JSON,靠模型自觉;中间档是指定返回类型为 JSON 对象;最强的是给出 JSON Schema 约束,服务端保证输出符合模式。约束越强,下游解析越省事,但模式写得太复杂会挤压模型表达空间,也更容易触发拒绝。
基本信息
| 目标 | 输出可直接解析、可直接入库的结构化数据 |
|---|---|
| 强度分档 | 提示要求、返回类型约束、模式严格约束 |
| 关键参数 | 返回格式字段加模式定义 |
| 常见形式 | 对象、数组、枚举与嵌套结构 |
| 失败表现 | 解析报错、字段缺失、被截断 |
| 配套措施 | 程序侧做校验与重试,提示里写清字段含义 |
三档约束的取舍
| 方式 | 可靠性 | 适用 |
|---|---|---|
| 提示里要求 JSON | 较低,模型可能夹带解释文字 | 快速验证与内部实验 |
| 返回类型约束 | 中等,保证是合法 JSON | 结构简单、字段固定的场景 |
| 模式严格约束 | 较高,按定义生成 | 结果要直接入库的生产链路 |
| 自由文本加后处理 | 取决于解析规则 | 非关键路径的批量抽取 |
典型使用场景
- 信息抽取:从合同、简历、工单里取固定字段
- 分类打标:输出固定枚举值,便于统计与路由
- 数据清洗:把非结构化文本转成表格记录
- 流程编排:让模型输出调用意图与参数,供程序执行
- 批量处理:为下游系统提供稳定的数据契约
模式约束的写法要点
模式约束的写法要点
{
"model": "gpt-4o",
"response_format": { "type": "json_schema",
"json_schema": { "name": "invoice", "strict": true,
"schema": { "type": "object",
"properties": { "金额": { "type": "number" }, "开票方": { "type": "string" } },
"required": ["金额", "开票方"], "additionalProperties": false } } },
"messages": [ { "role": "user", "content": "从这段文本里抽取开票信息" } ]
}
# 模式里把不需要的额外字段关掉,避免模型自由发挥出计划外的键常见失败与处理
| 现象 | 原因 | 处理 |
|---|---|---|
| 解析直接报错 | 输出里混入说明文字或代码块围栏 | 用模式约束,并在提示里禁止额外文字 |
| 字段缺失 | 未把字段列入必填 | 模式里标记必填,程序侧校验后重试 |
| 内容被截断 | 输出长度上限过小 | 调大上限,或拆成多次抽取 |
| 枚举值超出预期 | 模式里未限定取值范围 | 把取值限定为枚举,程序侧再兜底 |
| 模型拒绝执行 | 模式过于复杂或任务本身受限 | 简化结构,拆分为多步调用 |
解析失败不要无限重试:把失败样例连同模式一起回传再试一次通常有效,连续失败应记录并转人工或降级。
结构化输出保证的是格式合法,不保证内容正确:字段值仍需业务校验,金额、日期这类关键字段必须做范围与格式核对。