首页 › ai-agents › 严格模式质量税:四栈语义塌方

严格模式质量税:四栈语义塌方

一条工单抽取流水线在 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 开启后"反而崩了"的三类语义塌方、四种故障形态,以及唯一值得跑的度量公式。

核心发现:parse 率收敛于 100,语义质量不收敛

四栈在 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 掉了,于是答案坍缩到"任何合法的、最低困惑度的续写",而那几乎从不是正确答案。

深度分析

一、四模式的约束层级:从"请返回JSON"到"物理锁死资金"

把四个模式读作同一接口的四种实现,而非同一东西的四种口味。

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[按模板重路由模式]

二、parse 率 99% 的陷阱:合法却答错

这是 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 上最常见的静默故障。

四、四种故障形态:按"伤害程度"排序

四栈共享一个故障目录,按伤害从可见到隐蔽排列:

  1. Refused(拒绝):模型返回拒绝或错误信封。OpenAI strict 在解码器无法编译的 schema 上抛 400;Gemini 在 responseSchema 违规时返回错误;Outlines 在 max_tokens 预算内找不到合法续写时失败。这类最可见——错误日志会抓到,修法通常是简化 schema(去掉递归类型、动态属性名)。

  2. Partial(残缺):必填字段填了,可选字段——模型在自由形式下会返回的——被丢了。strict 和 Gemini 最常见,因为约束优化的是最廉价的合法续写,缺省一个可选字段很"便宜"。Eval 信号:Completeness。

  3. Truncated(截断):深层嵌套对象或长数组在 emit 中途撞上 max_tokens,JSON 因此非法,schema 校验器拒绝,故障看起来像 schema 合法性未达标——但根因是 token 预算。诊断靠 parse-error 分析:长数组尾部的 JSONDecodeError 是截断,不是 schema 设计 bug。缓解:提高 max_tokens、把长输出分块到多次调用。

  4. Schema-valid but semantically degraded(合法却语义退化):每个字段都能 parse,每个 Literal 都在允许集内,每个数值字段都在 Pydantic 范围内——答案却是错的。enum 坍缩到安全默认、数值返回先验均值、自由文本摘要没引用任何输入。前三种像错误,这一种像成功,且就是它会上了生产。诊断靠逐字段裁判 + 跨字段断言;schema 合法性对这第四种是盲的。

五、正确度量:schema_validity × semantic_quality

绝大多数团队只度量"schema 合法率",而那恰恰是最没信息量的一轴(2026 年它基本恒为 100)。唯一值得跑的度量是乘积:

有效正确率 = schema_validity_rate × semantic_quality_on_passes

并且要按模板、按模式分别测,而非按应用整体测。标准做法是头对头:同一模型、同一 prompt,一份自由形式、一份受约束,用同一个 LLM judge 评分,delta 就是该模式在该 prompt 上的质量税。

关键陷阱在于隐藏重试:Instructor 套在 OpenAI strict 之上会把合法率刷到 100%,但成本埋在重试那一行。正确的度量单位不是"单次调用合法率",而是"N 次重试后合法率,成本 C"——必须把重试分布和账单一起画出来。一个 100% 合法率的栈,可能是在背后偷偷重试了 1.4 次换来的。

六、Claude 的取巧与代价:工具即 schema

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 合法之后,抓住那个合法却答错的输出"。

参考来源

  1. Evaluating LLM Structured Output Modes (2026) — Future AGI — 四模式横评、质量税区间、故障目录四分类、schema_validity × semantic_quality 度量方法与 99.4%/11% 真实案例
  2. JSON Schemas + Structured Outputs on OpenAI and Anthropic (2026) — CallSphere — strict 的 FSM 机制、Anthropic 工具即 schema 模式、37 Agent/90 工具生产实践与 additionalProperties:false 等 gotchas
  3. Claude API Structured Output: Complete Guide — Thomas Wiegold — Claude 双模式(JSON 输出 / strict 工具用)、beta 头、100–300ms 文法编译与 24h 缓存、安全拒绝凌驾 schema 的计费陷阱
  4. Writing effective tools for AI agents — Anthropic Engineering — "工具是确定性系统与非确定性 Agent 之间的契约"、工具评估与自优化方法论
  5. Function Calling Guide: GPT, Claude & Gemini (2026) — ofox.ai — 三厂商函数调用/工具使用 2026 综合指南与差异对比

[!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 等场景全覆盖。

51学通信知识星球海报-扫码加入