跳到主要内容

结构化输出与约束解码:消除生产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"步骤,你正在支付结构化输出完全消除的复杂性税。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates