GEO

结构化输出

结构化输出是一项功能,它强制 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: