什么是 结构化输出(Structured Output)?

结构化输出(Structured Output)是一种 LLM 推理能力,它让响应遵循声明的机器可读契约,通常是供应商支持的 JSON Schema 子集,使应用代码能够稳定解析结果。

工作原理

四种常被混淆的机制

纯提示词 JSON 只是要求模型模仿格式,没有结构保证;JSON Mode 目标是生成语法合法 JSON,但不保证匹配指定 schema;schema 约束输出会把生成限制在供应商支持的 schema 子集内;严格函数或工具调用约束的是工具名称和参数,而响应格式 schema 约束助手最终返回的数据。执行动作应选工具调用,返回类型化结果应选响应格式,两者不能混为一谈。

Schema 约束生成如何工作

供应商通常把 schema 编译为语法或等价约束,在逐 token 生成时屏蔽会让当前响应结构失效的候选。这可能带来首次使用的编译延迟,也可能影响提示缓存。该能力并不等于完整 JSON Schema 可移植性:支持的关键字、嵌套、递归、可选字段、枚举规模和严格规则会因供应商与模型而异。部署时应验证 schema,并固定供应商、模型、API 与 schema 版本。

解析之后仍要继续校验

检查传输状态后,应按需拒绝未知字段,并用应用的权威 schema 解析对象。随后继续验证日期范围、币种白名单、标识所有权、跨字段一致性、证据来源和操作权限等语义与业务不变量。SDK 支持时可以从应用类型生成传输 schema;若手写两份定义,则应在 CI 中检查 schema 与代码类型是否漂移。

拒答、截断与不兼容输入

安全拒答或达到 token 上限可能优先于 schema,导致没有可用对象;流式消费者在生成结束前看到的也只是残缺前缀。如果来源缺少必填值,而 schema 和提示词没有定义 null 或 unknown,模型可能为了满足字段要求而编造内容。解析前应检查拒答和结束原因,限制重试次数,保留原始输入与响应元数据用于诊断,并把歧义或高风险记录送入人工审核。

主要特点

  • 把响应约束到声明的机器可读契约
  • 比纯提示词格式要求或 JSON Mode 提供更强保证
  • 通常只实现供应商特定的 JSON Schema 子集
  • 不保证事实准确、证据质量或业务有效性
  • 必须显式处理拒答、截断和不兼容输入
  • 结合应用校验后可支撑可靠抽取与工作流编排

常见用途

  1. 把发票或合同字段抽取为应用类型记录
  2. 按照枚举标签契约分类客服请求
  3. 为函数或 Agent 工具返回经过校验的参数
  4. 为类型化 UI 组件和工作流路由生成数据
  5. 在数据库写入或自动执行前生成可审核候选记录

示例

loading...
Loading code...

常见问题

结构化输出与 JSON Mode 有什么区别?

JSON Mode 旨在生成语法合法的 JSON,但不保证必填字段、类型、枚举或嵌套结构;schema 约束的结构化输出会把生成限制在受支持的 schema 内。即便如此,应用仍要处理拒答或截断,并继续校验事实与业务规则。

符合 schema 是否代表返回数据正确?

不代表。它只证明结果在供应商支持的 schema 子集内结构合规,不证明事实真实。合法日期可能来自错误句子,标识可能属于其他客户,引用也可能没有证据。来源、跨字段一致性、授权和领域不变量仍需独立校验。

模型拒答或达到 token 上限时会怎样?

供应商可能返回拒答标识或 token 上限等结束原因,而不是符合 schema 的对象。解析前应先检查响应元数据,不执行流式传输中的残缺对象,只对可恢复错误进行有限重试,并把持续失败或安全拒答导向明确的降级路径。

同一份 JSON Schema 能直接用于所有模型供应商吗?

通常不能。不同供应商和模型支持的子集、规模限制、可选字段约定与 API 形态不同。应尽量维护一个权威应用类型,显式生成或适配各供应商 schema,在 CI 中验证,并在评估记录里固定供应商、模型、API 和 schema 版本。

应该使用结构化输出还是函数调用?

若助手的最终回答本身需要成为类型化数据,使用响应格式 schema;若模型要选择应用能力并提交参数,使用严格函数或工具调用。Agent 工作流常同时需要二者:执行过程使用受校验的工具参数,结束时再返回独立的结构化结果。

相关工具

相关术语

相关文章