结构化输出
结构化输出是一项功能,它强制 LLM 返回符合指定 schema(通常是 JSON schema)的回答。它不是寄希望于模型能产出可解析的 JSON,而是由推理引擎约束 token 的采样,从而保证输出一定能通过校验。
结构化输出是一项功能,它强制 LLM 返回符合指定 schema(通常是 JSON schema)的回答。它不是寄希望于模型能产出可解析的 JSON,而是由推理引擎约束 token 的采样,从而保证输出一定能通过校验。
为什么重要
返回自由格式文本的 LLM 很难被程序消费。即便提示了"返回 JSON",模型偶尔也会添加散文、漏掉字段或臆造类型。这会破坏下游代码,并迫使你做防御性解析。结构化输出在解码层解决了这个问题,你能 100% 得到有效的 JSON,而不是 95%。OpenAI、Anthropic、Google 以及 vLLM、Outlines 等开源引擎现在都原生支持它,使其成为构建可靠 LLM 流程的默认方式。
工作原理
受约束的解码:在每一步生成时,模型只能采样那些能让输出保持与 schema 兼容的 token。任何会违反 schema 的 token 都会被掩码为零概率。
Schema 指定:你提供一份 JSON schema(或 Pydantic 模型、Zod schema、TypeScript 类型),描述必填字段、类型和枚举值。
免校验解析:调用方可以直接对结果执行 JSON.parse,无需为格式错误的输出加上 try/catch。
JSON 模式 vs 结构化输出
| 维度 | JSON 模式 | 结构化输出 |
|---|---|---|
| 保证 | 有效的 JSON 语法 | 符合你的 schema 的有效 JSON |
| Schema 强制 | 无 | 完全 |
| 字段是否存在 | 不保证 | 保证 |
| 臆造的字段 | 可能出现 | 不可能出现 |
| 延迟开销 | ~0 | 较小(约束编译) |
JSON 模式只确保输出能被解析。结构化输出则确保它既能被解析,又符合你所需的确切形状。对于生产系统,只要可用就务必使用结构化输出。
何时使用
从文本中抽取数据:从非结构化输入中提取姓名、日期、地址。
构建调用工具的智能体:工具调用的参数必须与工具的参数 schema 完全一致。
分类到枚举值:强制模型从一组固定标签中挑选一个。
生成多字段回答:一次性产出标题、摘要、标签、分数。
任何你目前用正则解析模型输出的地方:那是一个迟早会出问题的隐患。
权衡取舍
轻微的延迟开销:解码器需要跟踪语法状态。通常可以忽略不计。
创造力下降:过重的 schema 约束会让生成显得机械。对于创意写作,更宜采用自由格式。
Schema 设计很重要:过于严格的 schema(要求全部 20 个字段)会迫使模型臆造值。把真正可选的字段设为可选。
并非所有模型都支持:较旧的模型和部分开源模型仍缺乏原生支持。Outlines 等类似的库可以为其加装这一能力。
示例
Schema:
{
"type": "object",
"properties": {
"title": { "type": "string" },
"tags": { "type": "array", "items": { "type": "string" } },
"sentiment": { "enum": ["positive", "negative", "neutral"] }
},
"required": ["title", "tags", "sentiment"]
}
保证的输出:
{ "title": "Launch recap", "tags": ["product", "Q2"], "sentiment": "positive" }
没有解析错误。没有缺失字段。没有臆造的枚举值。
Sources: