跳到主要内容

结构化输出与约束解码:消除生产LLM系统中的解析脆弱性

· 阅读需 11 分钟
Tian Pan
Software Engineer

每个上线LLM功能的团队都会在第一周内学到同样的教训:模型最终会返回格式错误的JSON。频率不高——起初大约2%的请求——但足以需要重试逻辑、输出验证器、基于正则表达式的修复器,以及越来越绝望的启发式方法。这种"解析脆弱性税"在模型输出的每个下游消费者中不断累积,将本应简单直接的集成变成了由try/catch块和字符串操作组成的脆弱混乱体。

结构化输出——保证语言模型产生符合特定schema的输出的能力——消除了这整类故障。不是减少,是消除。而其背后的机制——约束解码,被证明是自函数调用以来生产LLM系统中最具影响力的基础设施改进之一。

解析脆弱性的代价

在结构化输出广泛可用之前,生产团队通过一系列可预测的变通方法来处理JSON生成失败:

  1. 提示工程:"你必须返回有效的JSON。不要在JSON对象之外包含任何文本。"这在95-98%的情况下有效,但当你计算2-5%的失败率在规模化时意味着什么,就不那么可以接受了。
  2. 正则表达式提取:扫描响应中的类JSON模式,去除markdown代码围栏,尝试解析。这处理了模型将JSON包装在反引号中或添加前导文本的情况。
  3. 修复启发式:修复尾随逗号,添加缺失的括号,将单引号转换为双引号。每个修复处理一种失败模式,同时引入一个新的边缘情况。
  4. 重试循环:当所有方法都失败时,再次调用模型。以前沿模型每百万输出token 15美元的价格,重试率直接乘以你的推理成本。

真正的损害不是构建这些变通方法所花费的工程时间——而是它们施加的隐性可靠性上限。一个包含五次LLM调用、每次解析成功率为97%的流水线,端到端成功率为86%。对于包含数十个工具调用步骤的智能体工作流,这会累积成不可接受的失败率。一个团队报告说,仅通过添加schema验证就将解析错误从40%降低到2%,但当你的智能体需要链接十个顺序操作时,即使2%也太高了。

约束解码的实际工作原理

约束解码通过直接干预token生成过程来解决这个问题。它不是希望模型产生有效输出然后事后修复,而是限制模型在每个生成步骤中可以选择哪些token。其原理很简单:

  1. 将约束定义为形式语法——通常是JSON schema转换为上下文无关语法或正则表达式。
  2. 在每个解码步骤,计算词汇表中哪些token是给定当前输出和语法状态的有效延续。
  3. 屏蔽无效token,在采样或取argmax之前将它们的概率设为零。
  4. 推进语法状态,基于选定的token,然后重复。

结果是,每个生成的序列都保证在语法上符合schema。不是"几乎总是有效"——而是数学上保证的。

性能方面的故事更加有趣。朴素实现在每一步检查词汇表中的每个token(现代模型有128K+个token)与语法的匹配,会增加大量开销——早期方法看到了2-5倍的延迟增加。但现代引擎已经全面解决了这个问题。

XGrammar,由MLC-AI团队开发,现在是vLLM和SGLang的默认引擎,将词汇表分为上下文无关token(可以预计算一次)和上下文相关token(需要每步检查)。对于大多数生成步骤,只有一小部分token需要运行时验证,与早期的语法约束方法相比实现了最高100倍的加速,几乎零开销。

llguidance,微软基于Rust的引擎,采用不同的方法,对于128K token词汇表,每个token大约需要50微秒的CPU时间。开销如此之小,相对于GPU推理延迟而言实际上是不可见的。

反直觉的结果:约束解码可以比无约束生成更快。通过减少token空间,你简化了采样分布。在JSON生成中尤其如此,许多token是确定性的——在生成{"name": "之后,闭合引号和随后的冒号是固定的——因此引擎可以跳过这些位置的采样。

2026年的提供商格局

每个主要的API提供商现在都提供结构化输出保证,尽管实现方式存在有意义的差异:

OpenAI 率先推出API级别的功能,使用response_format: { type: "json_schema" },在服务器端使用约束解码。他们的实现处理递归schema和可选字段,约束是schema必须在请求时提供,并且对schema编译增加少量首次请求延迟。

Anthropic 在2025年底为Claude推出了结构化输出,支持通过output_format的JSON schema响应和带有验证参数的严格工具使用。他们的系统保证零JSON解析错误和完全schema合规。

Google Gemini 通过response_mime_type和JSON schema约束支持结构化输出,但有一个记录在案的注意事项,即在严格schema执行下,微调模型的质量可能会下降。

对于自托管模型,开源生态系统已经收敛于XGrammar作为标准引擎,集成到vLLM、SGLang和TensorRT-LLM中。如果你在运行本地推理,约束解码实际上是免费的——你只需在提示旁边传递一个JSON schema。

实际含义:不再有任何理由使用事后提取来将自由格式的LLM输出解析为结构化数据。如果你的流水线包含一个带有错误处理的"从模型响应中解析JSON"步骤,你正在支付结构化输出完全消除的复杂性税。

你需要理解的质量权衡

结构化输出不是普遍的改进。来自一篇匿名ACL提交的研究发现,强制结构化输出格式平均降低了17%的创造性任务性能,最严重的情况下降幅高达26%。一项涵盖十二个场景的更广泛研究发现,结构化格式在其中十个场景中降低了模型性能。

机制是直观的:模型将认知能力分配给维护格式合规性,减少了可用于推理和生成的能力。当语法迫使模型远离其首选token时——例如,将国家字段约束为小写选项,而模型在训练中使用大写国家名——语义准确性会受到影响。一个记录在案的案例显示,当约束为小写枚举值时,模型为巴黎输出了"spain",因为"France"(大写)被屏蔽了,而"france"在训练数据中从未出现过。

这创建了一个清晰的决策框架:

在以下情况下使用结构化输出:

  • 输出是数据提取、分类或结构化工具调用
  • Schema合规性比边际质量更有价值
  • 下游消费者需要机器可读数据
  • 你正在构建解析失败会级联的智能体工作流

在以下情况下避免结构化输出:

  • 任务需要创造性生成或开放式推理
  • 你需要模型的全部推理能力进行复杂分析
  • Schema如此严格以至于约束了模型表达细微差别的能力
  • 你正在生成长篇内容,格式次于实质

当你两者都需要时,使用两阶段"先生成后结构化"模式:

  1. 在第一步让模型自由推理和生成
  2. 使用第二个低成本的调用,配合结构化输出,从自由格式响应中提取结构化数据

这种两阶段方法已被验证为一种实用的解决方案,在保持schema合规性的同时减轻质量降级。第二次调用的成本通常是微不足道的——它是对已生成文本的简单提取任务。

生产架构模式

成功集成结构化输出的团队倾向于收敛于几种模式:

Schema版本控制。 你的JSON schema会随产品发展而演变。像对待API契约一样对待它们——版本化、验证向后兼容性、并规划迁移。结构化输出中的schema更改在下游影响方面相当于数据库迁移。

优雅的约束放松。 不是每个字段都需要是必需的。可选字段和联合类型让模型表达不确定性,而不是被迫给出一个编造的答案。一个对不确定字段返回null的模型,比一个因为schema要求非空字符串而自信地填入错误值的模型更有用。

超越语法的验证。 结构化输出保证语法有效性,而不是语义正确性。一个格式完美的JSON响应,其中sentiment字段对一个明显负面的评论说"positive",仍然是错误的。你仍然需要应用级别的验证——结构化输出只是确保你可以实际解析响应来运行该验证。

编译缓存。 Schema编译为语法/FSM不是即时的——XGrammar和类似引擎需要预处理每个schema。在高吞吐量系统中,缓存编译后的语法并在请求间重用。大多数推理引擎自动处理这一点,但请在你的部署中验证。

错误预算重新思考。 当你的解析失败率从2%降到0%时,你的错误预算数学就改变了。剩余的失败都是语义性的——错误的答案、编造的数据、遗漏的实体。这实际上是一种澄清:它让你将监控和评估完全集中在输出质量上,而不是输出格式上。

这对你的技术栈意味着什么

结构化输出最直接的影响是代码删除。如果你已经构建了JSON解析基础设施——重试逻辑、正则提取器、括号修复器、格式验证器——你可以移除它。这不是为了美观的重构;这是在移除一个bug和运维复杂性的来源。

第二层影响是架构性的。当你可以依赖模型的输出符合schema时,你可以将LLM调用更像类型化的函数调用。这使得你的LLM流水线能进行更强的静态分析、更好的测试(你只需要测试语义正确性,而不是格式处理),以及更简单的错误处理(每个失败都是质量失败,而不是基础设施失败)。

第三层影响是对智能体设计的影响。多步骤智能体系统中的主要瓶颈一直是步骤间通信的脆弱性——每个需要解析模型输出的工具调用都是一个潜在的故障点。结构化输出移除了这整类故障,使更长的智能体链变得可行。这不是理论上的改进——这是团队今天正在构建的智能体架构的使能基础设施。

如果你在2026年开始一个新的LLM集成却不默认使用结构化输出,你就是在选择解决一个基础设施已经为你解决的问题。唯一的问题是你的特定任务是否属于无约束生成确实产生更好结果的少数情况——即使在那种情况下,两阶段模式也为你提供了一条通往质量和结构兼得的清晰路径。

References:Let's stay in touch and Follow me for more thoughts and updates