一条工单抽取流水线在 OpenAI strict 模式下跑出了 99.4% 的 schema 合法率,每个 JSON 都能 parse,每个字段约束都成立。三周后客服复盘发现:约 11% 的进线工单里 priority 字段被填成了 urgent,而正确答案本应是 normal 或 high——模型为了让"语法编译器"高兴,悄悄坍缩到了一个更"安全"的默认值。schema 校验从头到尾没抓到这件事,因为输出完全合法,只是答错了。
这是 2026 年 Agent 工具使用(Tool Use / Function Calling)领域最被低估的断层:结构化输出模式保证的是 schema,不是质量。本文基于 Future AGI、CallSphere、Anthropic 工程团队 2026 年上半年的真实生产数据与故障目录,对四大主流结构化输出栈(OpenAI strict、Anthropic 工具即 schema、Gemini responseSchema、Outlines/JSONFormer 语法约束)做一次横评,揭示 strict 开启后"反而崩了"的三类语义塌方、四种故障形态,以及唯一值得跑的度量公式。
四栈在 schema 合法率这一轴上几乎全部逼近 100%——这是 2026 年的工程常态。但语义质量这一轴并不收敛,而两者之间的差,才是整篇文章。
| 模式栈 | 约束机制 | schema 保证 | 质量税(易例) | 质量税(难例) |
|---|---|---|---|---|
| OpenAI strict | Token 级受限解码(FSM) | 强(返回即合法) | 0–3% | 10–15% |
| Anthropic JSON / 工具用 | 提示词 + 校验层 | 中(尽力)/ 强(工具用) | 0–2% | 4–8% |
| Gemini responseSchema | 服务端校验 | 强(校验或拒绝) | 0–3% | 8–12% |
| Outlines / JSONFormer | logit 掩码(FSM) | 最强(仅合法 token) | 随基模能力 | 5–20% |
上述区间来自 2026 上半年客户真实负载(200 行黄金集量级),非受控基准,仅作数量级参考。
关键反直觉点:约束越"硬"的栈,难例质量税往往越高。OpenAI strict 在硬提示上可达 10–15%,Outlines 在弱基模上可塌到 20%。原因在于——strict 把 JSON Schema 编译成有限状态机,在解码层逐 token 过滤;当遇到难题时,模型本该输出的那个 token 被 mask 掉了,于是答案坍缩到"任何合法的、最低困惑度的续写",而那几乎从不是正确答案。
把四个模式读作同一接口的四种实现,而非同一东西的四种口味。
OpenAI strict(response_format={"type":"json_schema","strict":true})把你给的 JSON Schema 编译成推理层的受限解码文法,每个被采样的 token 都经过一层只保留"部分输出仍合法"的掩码。保证是绝对的:只要调用返回,JSON 必然能 parse。代价是若干硬性限制——additionalProperties:false、每个 property 都必须进 required(可选字段用 type:["string","null"] 并集表达)、根级不能用 oneOf、不能有 $ref。支持 gpt-4o 系列、gpt-4o-mini 与 o 系列。
Anthropic 是双面体。简版是"提示词形":在 system prompt 里要求返回 JSON 再解析,无 token 级约束,故障形态是"近 JSON"(尾随注释、缺花括号、夹带自然语言)。富版才是 2026 的正解——把输出本身定义成一个工具,用 tool_choice:{type:"tool",name:"emit"} 强制调用,input_schema 即你的输出 schema,工具调用通道是 JSON 校验过的,等于变相拿到 strict 保证。Anthropic 不暴露 strict 单开关,工具即 schema 是它的地道写法。2025-11-13 的 beta 头 structured-outputs-2025-11-13 现已在 Sonnet 4.5 / Opus 4.1 落地,Haiku 4.5 跟进。
Gemini responseSchema 介于两者之间:接受 JSON Schema 的一个子集,推理层服务端校验,违反时返回错误信封而非生成字符串。保证是"要么合法,要么显式拒绝"。坑在于——多成员 union 类型会静默失败,嵌套超过三层错误率上升,且可表达子集比 OpenAI 窄,在 gpt-4o 上能跑的 schema 在 gemini 上未必表达得了。
Outlines / JSONFormer 跑在开源权重模型上,从 schema(或更丰富的正则/CFG/自定义 FSM)构建状态机,每步解码掩码 logits,保证最强:只要生成 token,就必然文法合法。质量税与基模能力强相关——Llama-3-70B、Mistral-Large 这类强基模只付小税;弱基模则坍缩到"任何合法、最低困惑度"的续写。
flowchart TD
U[用户 Prompt] --> M{结构化输出模式}
M -->|OpenAI strict| A1[FSM 编译 · token 级约束解码]
M -->|Anthropic 工具即 schema| A2[tool_choice 强制 + 校验层]
M -->|Gemini responseSchema| A3[服务端校验 / 拒绝信封]
M -->|Outlines · JSONFormer| A4[logit 掩码 FSM]
A1 --> J1{G1 schema 合法性<br/>确定性 · 免费}
A2 --> J1
A3 --> J1
A4 --> J1
J1 -->|失败| R1[refused / truncated → 错误日志]
J1 -->|通过| J2{G2 跨字段断言<br/>范围 · 求和 · 日期 · 免费}
J2 -->|通过| J3{G3 逐字段语义裁判<br/>LLM judge · 昂贵}
J3 -->|enum 坍缩 / 数值漂移 / 字段丢弃| SEM[语义塌方 · 合法却答错]
J3 -->|语义正确| PROD[✅ 生产]
SEM --> ROUTE[按模板重路由模式]
这是 strict 开启后最危险、也最隐蔽的新型故障。回忆开头的工单案例:99.4% 合法率让团队误以为系统是绿的,11% 的 urgent 坍缩却埋在里面三周没被发现。这种"合法却答错"在四类故障中是唯一看起来像成功、最终却上了生产的那一类——前三种(拒绝、残缺、截断)都像错误,唯独它像正确。
原因在于 strict 的解码哲学:约束解码器优化的是"最廉价的合法续写"。当一个可选字段不确定时,"省略它"是最廉价的合法选择;当一个 enum 字段拿不准时,"返回最常见的那一项"是最低困惑度的合法续写。模型不是在"猜",它是在有限合法集合里挑了困惑度最低的,而困惑度最低 ≠ 语义正确。
一个值得记住的基准对比:2024 年代的模型靠"请返回 JSON"提示词约 3% 的时候会破坏格式;2026 年前沿模型在负载下仍约 0.4% 破坏。strict 把这 0.4% 压到接近 0,但代价是把语义错误率推高了一个量级。你用 schema 合法性换掉了格式错误,却买进了一批更难发现的语义错误——这是一笔很多团队没意识到的交易。
质量税最响地出现在三个地方,每一类都有可识别的指纹:
枚举坍缩(Enum collapse):Literal["low","normal","high","urgent"] 这类字段,模型在约束下比自由形式更频繁地默认到 "normal"。开头的 priority→urgent 是它的极端表现,但更常见的是温和版——一个本该是 high 的工单被判成 normal。诊断靠逐字段裁判而非整体裁判。
数值漂移(Numeric drift):Field(ge=0, le=120) 的 age 字段,当输入里从未提到年龄时,受限模型会返回语料均值(比如 35),而不是空或拒绝。因为它必须产出一个 0–120 的数,均值是最低困惑度的合法选择。自由形式下模型会老实说"未提及",strict 下它编了一个看起来合理的数。这类在 KYC、医疗、保险抽取里是合规雷区。
字段丢弃(Field dropping):strict 模式下可选字段被静默省略,因为约束解码器把"缺省"当作零成本合法路径。模型在自由形式下本会返回的字段,在 strict 下消失了。Eval 信号是 Completeness——对每个模式统计可选字段的填充率,差距立刻浮现。这是 OpenAI strict 和 Gemini 上最常见的静默故障。
四栈共享一个故障目录,按伤害从可见到隐蔽排列:
Refused(拒绝):模型返回拒绝或错误信封。OpenAI strict 在解码器无法编译的 schema 上抛 400;Gemini 在 responseSchema 违规时返回错误;Outlines 在 max_tokens 预算内找不到合法续写时失败。这类最可见——错误日志会抓到,修法通常是简化 schema(去掉递归类型、动态属性名)。
Partial(残缺):必填字段填了,可选字段——模型在自由形式下会返回的——被丢了。strict 和 Gemini 最常见,因为约束优化的是最廉价的合法续写,缺省一个可选字段很"便宜"。Eval 信号:Completeness。
Truncated(截断):深层嵌套对象或长数组在 emit 中途撞上 max_tokens,JSON 因此非法,schema 校验器拒绝,故障看起来像 schema 合法性未达标——但根因是 token 预算。诊断靠 parse-error 分析:长数组尾部的 JSONDecodeError 是截断,不是 schema 设计 bug。缓解:提高 max_tokens、把长输出分块到多次调用。
Schema-valid but semantically degraded(合法却语义退化):每个字段都能 parse,每个 Literal 都在允许集内,每个数值字段都在 Pydantic 范围内——答案却是错的。enum 坍缩到安全默认、数值返回先验均值、自由文本摘要没引用任何输入。前三种像错误,这一种像成功,且就是它会上了生产。诊断靠逐字段裁判 + 跨字段断言;schema 合法性对这第四种是盲的。
绝大多数团队只度量"schema 合法率",而那恰恰是最没信息量的一轴(2026 年它基本恒为 100)。唯一值得跑的度量是乘积:
有效正确率 = schema_validity_rate × semantic_quality_on_passes
并且要按模板、按模式分别测,而非按应用整体测。标准做法是头对头:同一模型、同一 prompt,一份自由形式、一份受约束,用同一个 LLM judge 评分,delta 就是该模式在该 prompt 上的质量税。
关键陷阱在于隐藏重试:Instructor 套在 OpenAI strict 之上会把合法率刷到 100%,但成本埋在重试那一行。正确的度量单位不是"单次调用合法率",而是"N 次重试后合法率,成本 C"——必须把重试分布和账单一起画出来。一个 100% 合法率的栈,可能是在背后偷偷重试了 1.4 次换来的。
Anthropic 不给 strict 单开关,2026 的地道写法是把输出定义成单个工具、强制调用。这招的好处是约束住在校验层而非解码层,因此能保留更多模型自由形式时的质量——这也是上表里 Anthropic 工具用模式难例质量税(4–8%)低于 OpenAI strict(10–15%)的根因。校验层的约束比解码层的约束"宽松",给模型留了喘息空间。
但代价是三处工程负担。其一,首次请求的文法编译开销 100–300ms,之后缓存 24 小时——生产系统要在部署时发一个 dummy 请求预热缓存,频繁改 schema 会反复编译、徒增延迟。其二,安全拒绝凌驾于 schema 合规:stop_reason:"refusal" 时你拿到 200 状态码、照常计费,但响应不匹配 schema——这是一个"账单到了、数据没到"的隐形坑。其三,长输入下模型会把嵌套子对象 stringify(把 JSON 塞进 JSON 字符串里省 token),解析器拿到的是字符串里的 JSON,需要二次反序列化。
CallSphere 的实践给出了规模样板:37 个 Agent、90+ 工具、115+ 张 DB 表、6 个垂直行业,每个跨 Agent 消息都用 Zod 对照同一份 JSON Schema 校验——schema drift 直接定义为生产事故。它的路由哲学是按模板、不按应用:抽取类(短、结构稳定)用 gpt-4o-mini + strict 省成本;医疗语音的结构化病历摘要用 Claude Sonnet 4.6 + 工具即 schema,因为难例质量税更低。
落地时把校验门按成本从低到高分层:schema 合法性是确定性地板(免费、fail fast);跨字段断言(范围收紧、行项求和、日期区间不变量)次之(确定性、免费);逐字段语义裁判最后跑,只对前两道门放行的行跑——judge 是最贵的一项,要把尽可能多的拦截推到免费层。黄金集 200–500 条、镜像生产的深度与广度,四栈同跑同评分,产出的"模式×评估轴"矩阵才是决定生产路由的产物。
这条线索的变现价值在于它是典型的"看着绿、实则亏"型知识——99.4% 合法率的系统在三周后才被发现有 11% 语义错误,这种"延迟暴露的损失"是企业最愿意付费排查的。可包装成两个产品形态:
训练营:以"schema_validity × semantic_quality 双轴度量 + 四栈头对头 + 故障目录四分类"为骨架,带学员在自己的黄金集上跑出质量税矩阵。差异化卖点在于——市面多数 Function Calling 课止步于"如何让 JSON 合法",而本主题直击"合法之后为什么仍答错",是中高级工程师的痛点。
产品化:一个"结构化输出质量税体检器"——输入 schema 与黄金集,自动跑四栈头对头、输出质量税矩阵与重试账单,定位 enum 坍缩/数值漂移/字段丢弃三类指纹。Future AGI 已开源(GitHub 986 star)底层 eval 栈,EvaluateFunctionCalling(eval_id 98)是确定性 schema 合规模板,可作起点。
| 场景 | 推荐模式 | 理由 |
|---|---|---|
| 短结构抽取、成本敏感 | OpenAI strict(gpt-4o-mini) | 合法率最高、单价低,易例质量税在噪声内 |
| 难例多、长输入、语义精度优先 | Anthropic 工具即 schema(Sonnet 4.6) | 校验层约束保留更多质量,难例税 4–8% 最低 |
| 需"要么合法要么显式拒绝"语义 | Gemini responseSchema | 服务端校验,拒绝信封可程序化处理 |
| 开源/私有化、强基模(Llama-3-70B+) | Outlines / JSONFormer | 最强语法保证,但弱基模会塌到 20% |
| 任意模式生产前 | 必跑双轴 eval | schema 合法率已无区分度,质量税矩阵才是路由依据 |
一句话结论:strict 解决的是"会不会 parse",没解决的是"该不该信"。2026 年的结构化输出工程,重心已经从"让 JSON 合法"迁移到"在 JSON 合法之后,抓住那个合法却答错的输出"。
schema_validity × semantic_quality 度量方法与 99.4%/11% 真实案例additionalProperties:false 等 gotchas[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
