[控场AI]
· 6 分钟阅读· 3,256 字

OpenAI、Claude、Gemini结构化输出对比:97/167模型支持

OpenAI、Claude、Gemini结构化输出对比:97/167模型支持

横向对比 OpenAI、Claude、Gemini、Mistral 结构化输出能力与选型建议。

文章系统对比了 OpenAI、Claude、Gemini 和 Mistral 四家平台的结构化输出能力。统计显示 167 个追踪模型中仅 97 个支持强制 JSON Schema,超四成尚未原生支持。请求形态上,OpenAI 通过 `response_format` 直接指定 schema,Claude 借工具调用间接实现,Gemini 在 `generationConfig` 中内嵌 `responseSchema`,Mistral 仅保证 JSON 语法正确。Schema 限制方面,各平台对 `oneOf`、`$ref` 等复杂关键字的支持差异显著,直接影响多态数据结构建模。拒绝处理机制也不统一:OpenAI 返回 `refusal` 字段,Claude 可能工具调用失败,Gemini 抛 API 错误。文章建议生产系统优先选择 OpenAI 或 Claude,并在架构中抽象 schema 适配层以降低供应商锁定风险。

结构化输出:AI API 的"合同"能力

在构建 AI 应用时,让模型稳定输出 JSON 往往比生成内容本身更棘手。结构化输出(Structured Outputs)通过强制模型遵循 JSON Schema,将这种不确定性转化为可预测的"合同"。根据最新统计,在我们追踪的 167 个模型中,有 97 个能够强制执行 JSON Schema。这意味着超过四成的模型尚未提供原生支持,开发者在选型时需要仔细甄别。

结构化输出对比概览

本文基于多平台 API 文档与实测数据,横向对比 OpenAI、Claude、Gemini 和 Mistral 在请求形态、Schema 限制以及拒绝处理上的差异,帮助你在不同场景下做出更合适的选择。

请求形态:四家各显神通

OpenAI:response_format 与 json_schema

OpenAI 采用 response_format 参数,其中 type: "json_schema" 指定严格模式。开发者需要提供 schema 名称、描述以及 strict: true 标志。这种设计将 schema 作为请求的一等公民,与函数调用(function calling)的 schema 复用同一套校验逻辑。

JSON Schema 是一种用于描述和验证 JSON 文档结构的声明式语言,本身是一份 JSON 文档,通过 type、properties、required、enum 等关键字定义数据的形状与约束。它由 IETF 标准化(最新草案为 2020-12 版),并不绑定任何编程语言或厂商。在结构化输出场景中,JSON Schema 充当模型与开发者之间的“数据契约”:开发者用 Schema 精确描述期望的输出格式,平台在解码阶段施加约束,使模型只能生成符合该 Schema 的 token 序列。需要注意的是,各 AI 厂商通常只实现 JSON Schema 的一个子集,并可能引入自己的扩展关键字,所以同一份 Schema 在不同平台上的行为可能存在差异。

Claude:工具调用即结构化

Anthropic 的 Claude 没有独立的"结构化输出"参数,而是通过工具调用(tool use)实现。开发者定义一个输入 schema,模型被要求调用该工具时,输出自然遵循 schema。这种方式灵活但需要额外的工具定义,且模型可能选择不调用工具,需要提示词配合。

工具调用(Tool Use / Function Calling) 是大模型的一种能力:开发者在请求中声明一组工具,每个工具包含名称、描述和输入参数的 JSON Schema;模型在推理时可以选择调用某个工具,并生成符合该 Schema 的调用参数。平台随后可对这些参数进行校验,从而间接实现结构化输出。与专用的结构化输出参数相比,工具调用路径的约束强度取决于平台是否强制执行 Schema 校验,以及模型是否被强制选择工具(例如通过 tool_choice 参数)。此外,工具描述本身会占用上下文 token,工具数量过多时可能影响模型的选择准确率。

Gemini:responseSchema 内嵌

Google Gemini 在 generationConfig 中提供 responseMimeType: "application/json" 和 responseSchema 字段,直接内嵌 schema。这种方式与 OpenAI 类似,但 schema 的表达能力受限于 Gemini 支持的 OpenAPI 子集。

OpenAPI 规范 是一种用于描述 REST API 的标准化格式,其 3.0 版本中的 Schema Object 基于 JSON Schema 的一个子集,并做了若干调整(如 nullable 关键字、不支持某些组合关键字)。Google 的 responseSchema 采用 OpenAPI 3.0 子集作为表达语言,因此其表达能力与标准 JSON Schema 并不完全对等:例如 $ref 外部引用、部分组合关键字(oneOf、anyOf、allOf)以及递归结构在 Gemini 中可能不被支持或行为受限。开发者在跨平台迁移 Schema 时,需要特别检查这些差异,避免因关键字不被识别而导致校验失败或输出不符合预期。

Mistral:轻量但有限

Mistral 同样支持 response_format,但仅支持 json_object 类型,不强制 schema。这意味着输出是合法 JSON,但字段结构需要模型自行推断,可靠性低于前两者。

Schema 限制:细节决定成败

结构化输出的实际可用性,往往取决于各平台对 JSON Schema 的支持范围。

  • OpenAI 支持大部分 JSON Schema 关键字,但对 oneOf、anyOf 等复杂组合限制较多,且要求所有字段必须为 required(可通过 nullable 模拟可选)。
  • Claude 的工具 schema 支持嵌套对象和数组,但对递归结构支持有限,且 schema 描述会消耗上下文 token。
  • Gemini 的 responseSchema 基于 OpenAPI 3.0 子集,不支持 $ref 外部引用,数组嵌套深度也有限制。
  • Mistral 几乎不校验 schema,仅保证 JSON 语法正确。

这些限制直接影响复杂数据结构的建模。例如,需要多态字段时,OpenAI 可能需要拆分为多个独立 schema,而 Claude 则可以通过工具描述引导。

拒绝处理:当模型说"不"

结构化输出并非万能。当输入无法满足 schema 时,模型可能拒绝生成。OpenAI 会返回 refusal 字段并附带原因;Claude 可能返回工具调用错误或文本拒绝;Gemini 则可能抛出 API 错误。开发者需要针对不同平台编写错误处理逻辑,而不是假设输出永远合法。

Mistral 由于不强制 schema,几乎不会因结构问题拒绝,但输出质量更依赖提示词。

拒绝(Refusal) 在结构化输出语境下指模型因安全策略、输入歧义或无法满足 Schema 约束而拒绝生成预期内容的行为。不同平台对拒绝的暴露方式不同:OpenAI 在响应中提供独立的 refusal 字段,与内容字段互斥,便于程序化判断;Claude 可能表现为工具调用缺失、返回文本解释或工具参数校验失败;Gemini 则可能直接返回 API 错误码。生产系统应将这些信号统一抽象为可重试、可降级、可告警的错误分类,而不是仅依赖 HTTP 状态码。对于不强制 Schema 的 Mistral,拒绝率虽低,但输出结构错误的概率更高,需要在应用层增加 JSON Schema 校验作为兜底。

选型建议与趋势

对于需要严格数据契约的生产系统,OpenAI 和 Claude 是更稳妥的选择,前者 schema 表达更直接,后者在工具生态中更自然。Gemini 适合已在使用 Google Cloud 且 schema 不复杂的场景。Mistral 则适用于对成本敏感、结构简单的轻量任务。

随着 97/167 的模型支持率逐步提升,结构化输出正从"高级特性"变为"基础能力"。但各平台的 schema 方言和错误语义仍不统一,跨平台迁移时需要重新验证。建议在架构中抽象一层 schema 适配器,以降低供应商锁定风险。

分享:

相关推荐