2026.09.10 · AI 后端 · 18 分钟

结构化输出:
从“像 JSON”到“可用数据”

模型说“我已经返回 JSON”并不代表后端可以放心入库。今天把概率生成变成一条可以校验、重试、拒绝和监控的数据管道。

不确定数据通过校验闸门变为整齐结构化数据
模型给出候选结果,程序通过规则决定哪些数据可以进入业务系统。
学完你能做到独立设计一条可靠的 LLM 结构化输出链路,并讲清它为什么可靠。

01 · 心智模型

JSON 是外形,Schema 才是合同

普通 JSON 模式通常只是在提示模型“请输出 JSON”。它最多保证文本可以被解析,却不保证字段齐全、类型正确、枚举合法,更不保证内容符合业务规则。生产系统真正需要的是三层约束:

语法层是不是合法 JSON
结构层是否符合 JSON Schema
业务层字段组合是否真的可用
关键判断:模型只负责提出候选结果;你的程序负责决定这个结果能不能进入系统。

02 · Schema 设计

先设计失败,再设计字段

假设我们要把一段招聘 JD 提炼为结构化岗位信息。不要一上来追求“大而全”,先只保留后续流程真正会使用的字段,并把不确定性显式建模。

{
  "type": "object",
  "additionalProperties": false,
  "required": ["role", "level", "skills", "confidence"],
  "properties": {
    "role": { "type": "string", "minLength": 2 },
    "level": {
      "type": "string",
      "enum": ["junior", "middle", "senior", "unknown"]
    },
    "skills": {
      "type": "array",
      "items": { "type": "string" },
      "maxItems": 12
    },
    "confidence": { "type": "number", "minimum": 0, "maximum": 1 }
  }
}

为什么要有 unknown

缺少证据时允许模型明确说“不知道”,比逼它从枚举里猜一个答案更可靠。

为什么禁止额外字段

避免模型临时创造字段,让消费者只能处理一份稳定契约。

03 · 生产链路

可靠性来自链路,不来自一句 Prompt

输入清洗→Schema 约束生成→程序校验→业务规则→接受 / 重试 / 拒绝
async function extractJob(text) {
  const raw = await callModel({ schema: jobSchema, input: text });
  const parsed = jobSchema.safeParse(raw);

  if (!parsed.success) {
    throw new RetryableOutputError(parsed.error.issues);
  }
  if (parsed.data.confidence < 0.65) {
    return { status: "needs_review", data: parsed.data };
  }
  return { status: "accepted", data: parsed.data };
}

生产环境最容易漏掉的四件事

  1. 无限重试:结构错误只允许小次数重试,并记录失败原因;同样输入反复调用只会增加费用。
  2. 把拒答当异常:安全拒答、内容不足和系统故障需要不同状态,前端提示也应不同。
  3. Schema 版本漂移:Prompt、Schema、消费者代码和评测集必须一起版本化。
  4. 只测解析成功率:合法 JSON 仍可能语义错误,还要测字段准确率、拒绝率和人工复核率。

04 · 面试表达

把答案讲成工程决策

30 秒版本

我不会把“模型返回了 JSON”当成可靠输出。我会用严格 Schema 约束结构,在服务端再次校验类型和业务规则,并把结果分成接受、可重试和需要人工复核三类。同时给 Schema、Prompt 和评测集做版本管理,监控解析成功率、字段准确率与人工复核率。

面试官继续追问重试怎么办

先区分临时传输错误、结构不合法、内容证据不足和安全拒答。只有可恢复错误进入有限次数重试;重试携带精简的校验错误,但不能把不可信模型输出直接拼成高权限指令。超过预算进入降级或人工复核。

05 · 动手与自测

今天必须亲手完成的 20 分钟练习

  1. 选一份真实岗位 JD,定义不超过 6 个字段的 Schema。
  2. 准备三个异常样本:缺少年限、技能描述模糊、输入里夹带“忽略之前指令”。
  3. 记录三项结果:Schema 是否通过、业务规则是否通过、最终为何接受或拒绝。
自测 1:JSON mode 和 Structured Outputs 的核心区别是什么?

前者主要保证语法可解析;后者尝试让输出严格遵守指定 Schema。但即使结构合规,服务端仍要验证业务语义。

自测 2:为什么不能靠“再试一次”解决所有错误?

有些失败来自输入证据不足、Schema 设计错误或安全拒答,重试不会改变根因,只会增加延迟与成本。

自测 3:如何证明链路变可靠了?

用固定测试集持续测解析成功率、字段级准确率、错误类型、重试率和人工复核率,并按 Prompt 与 Schema 版本对比。

资料来源 · 访问于 2026-09-10

继续深挖

OpenAI · Structured Outputs ↗ JSON Schema · Understanding JSON Schema ↗ Anthropic · Increase output consistency ↗