<!-- title: 严格模式质量税：四栈语义塌方 -->

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

一条工单抽取流水线在 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 这类强基模只付小税；弱基模则坍缩到"任何合法、最低困惑度"的续写。

```mermaid
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](https://futureagi.com/blog/evaluating-llm-structured-output-modes-2026/) — 四模式横评、质量税区间、故障目录四分类、`schema_validity × semantic_quality` 度量方法与 99.4%/11% 真实案例
2. [JSON Schemas + Structured Outputs on OpenAI and Anthropic (2026) — CallSphere](https://callsphere.ai/blog/vw9g-json-schemas-structured-outputs-openai-anthropic-2026) — strict 的 FSM 机制、Anthropic 工具即 schema 模式、37 Agent/90 工具生产实践与 `additionalProperties:false` 等 gotchas
3. [Claude API Structured Output: Complete Guide — Thomas Wiegold](https://thomas-wiegold.com/blog/claude-api-structured-output/) — Claude 双模式（JSON 输出 / strict 工具用）、beta 头、100–300ms 文法编译与 24h 缓存、安全拒绝凌驾 schema 的计费陷阱
4. [Writing effective tools for AI agents — Anthropic Engineering](https://www.anthropic.com/engineering/writing-tools-for-agents) — "工具是确定性系统与非确定性 Agent 之间的契约"、工具评估与自优化方法论
5. [Function Calling Guide: GPT, Claude & Gemini (2026) — ofox.ai](https://ofox.ai/blog/function-calling-tool-use-complete-guide-2026/) — 三厂商函数调用/工具使用 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学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
