← 小课堂

为什么 AI 会弄坏我的 JSON?5 分钟理解结构化输出

为什么 AI 会弄坏我的 JSON?5 分钟理解结构化输出

为什么它会弄坏我的 JSON?

结构化输出(约束解码)· Builder · 5 分钟 · sampling, llm · 前置:[下一 token 预测](/explain/next-token/),[温度与采样](/explain/temperature/)

模型逐 token 生成 JSON,因此无法阻止某个 token 破坏格式。结构化输出模式把你的 schema 交给 API,并屏蔽所有不符合的 token;值仍需要校验。

开始前:你能向朋友解释这个吗?1 2 3 4 5

1 = 完全不能 · 5 = 轻松做到

  • 1 先猜

你要求返回 JSON,回复却以“Sure! Here is your JSON:”开头。为什么?

  • A 它故意忽略你的指令
  • B 它选择可能的 token,而没有任何规则禁止那个 token
  • C API 破坏了响应
  • 2 看

一次一个 token

提示:“以 JSON 返回用户,包含 name 和 age。”

Sure! Here is the JSON:

json

{"name": "Ada", "age": thirty-six}

JSON.parse → SyntaxError

示意性失败,不是录制的输出

要求返回 JSON,它却加了一句友好说明,并写了 thirty-six。解析器放弃。

每个 token 都是在可能选项中的一次选择,其中一些会破坏 JSON;有了 schema,API 会在选择前移除这些选项,因此格式能保持,但值仍需要检查。

  • 约束解码意味着 API 知道你的 schema,并在每一步只允许仍能导向有效输出的 token。Anthropic 和 Gemini 这样描述它们的结构化输出。OpenAI 将 JSON 模式(有效 JSON,任意形状)与 Structured Outputs 区分开,后者遵循你的 schema。
  • 4 你是模型

你是过滤器。schema 固定;每一步,选出它允许的唯一下一个 token。

schema: {name: string, age: integer, plan: "free" | "pro"} · 没有额外键

(empty) ▍

你是过滤器:schema 允许哪个下一个 token?

  • 5 检查

schema 说 age 是整数。约束解码会阻止哪个下一个 token?

  • A "36" 带引号
  • B 36
  • C 不阻止;它只在最后检查
  • 6 复述

向朋友解释为什么结构化输出能阻止损坏的 JSON。

  • 7 任务 · 5 分钟

用免费的 Gemini API key,让 Gemini 3.8 Flash 提取一个食谱两次:一次在 response_format 中使用 JSON schema(如 Gemini 的结构化输出文档所示),一次只在提示中要求 JSON。解析两者。然后给一个字段添加 maxLength,检查它是否被执行。

[获取免费 Gemini API key](/learn/free-gemini-api-key/)

三个小问题

从本课题库中随机抽取;下次会不同。

完成?

现在:你能向朋友解释这个吗?1 2 3 4 5

1 = 完全不能 · 5 = 轻松做到

深入阅读

来源

  • https://ai.google.dev/gemini-api/docs/structured-output(更新于 2026-10-20,检查于 2026-10-21):response_format 使用 mime_type application/json 和 schema;示例使用 gemini-3.8-flash;“虽然输出是语法正确的 JSON,但始终要在应用中验证值”;minLength、maxLength、minProperties、maxProperties“在约束解码期间不强制执行,会被服务器忽略”
  • https://developers.openai.com/api/docs/guides/structured-outputs(检查于 2026-10-21;无更新日期):“只有 Structured Outputs 确保遵循 schema”(不是 JSON 模式);text.format json_schema 使用 strict: true;从“GPT-4o 开始”可用;拒绝信息放在单独字段
  • https://platform.claude.com/docs/en/build-with-claude/structured-outputs(检查于 2026-10-21;无更新日期):output_config.format json_schema;所列模型上的约束解码(例如 claude-sonnet-4-6、claude-haiku-4-5);拒绝和 max_tokens 停止可能不符合 schema;枚举值的大小写可能不同
  • https://ai.google.dev/gemini-api/docs/pricing(更新于 2026-10-19,检查于 2026-10-21):Gemini 3.8 Flash 在免费层级输入免费
  • 损坏的答案和图中的 token 概率为示意,并已标注。发布于 2026 年 10 月 21 日 · 更新于 2026 年 10 月 21 日

译自 aifree.dev 教程栏目 · 信息以原文为准