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 };
}
生产环境最容易漏掉的四件事
- 无限重试:结构错误只允许小次数重试,并记录失败原因;同样输入反复调用只会增加费用。
- 把拒答当异常:安全拒答、内容不足和系统故障需要不同状态,前端提示也应不同。
- Schema 版本漂移:Prompt、Schema、消费者代码和评测集必须一起版本化。
- 只测解析成功率:合法 JSON 仍可能语义错误,还要测字段准确率、拒绝率和人工复核率。
04 · 面试表达
把答案讲成工程决策
30 秒版本
我不会把“模型返回了 JSON”当成可靠输出。我会用严格 Schema 约束结构,在服务端再次校验类型和业务规则,并把结果分成接受、可重试和需要人工复核三类。同时给 Schema、Prompt 和评测集做版本管理,监控解析成功率、字段准确率与人工复核率。
面试官继续追问重试怎么办
先区分临时传输错误、结构不合法、内容证据不足和安全拒答。只有可恢复错误进入有限次数重试;重试携带精简的校验错误,但不能把不可信模型输出直接拼成高权限指令。超过预算进入降级或人工复核。
05 · 动手与自测
今天必须亲手完成的 20 分钟练习
- 选一份真实岗位 JD,定义不超过 6 个字段的 Schema。
- 准备三个异常样本:缺少年限、技能描述模糊、输入里夹带“忽略之前指令”。
- 记录三项结果:Schema 是否通过、业务规则是否通过、最终为何接受或拒绝。
自测 1:JSON mode 和 Structured Outputs 的核心区别是什么?
前者主要保证语法可解析;后者尝试让输出严格遵守指定 Schema。但即使结构合规,服务端仍要验证业务语义。
自测 2:为什么不能靠“再试一次”解决所有错误?
有些失败来自输入证据不足、Schema 设计错误或安全拒答,重试不会改变根因,只会增加延迟与成本。
自测 3:如何证明链路变可靠了?
用固定测试集持续测解析成功率、字段级准确率、错误类型、重试率和人工复核率,并按 Prompt 与 Schema 版本对比。
资料来源 · 访问于 2026-09-10
