直接回答:手段分三层。最弱的是 prompt 层:给出 JSON Schema 和示例、要求"只输出 JSON",多数情况有效但无保证。中间层是模型 API 的结构化输出能力(OpenAI 的 response_format/json_schema、各家的 function calling),最强的是推理框架层的约束解码:给定 schema 编译出状态机,解码时把不合法 token 的概率直接置零(logit mask),语法层面 100% 合法。vLLM、SGLang、Outlines、llama.cpp 的 GBNF 都支持。

展开解析:约束解码的原理:JSON Schema 可转成上下文无关文法,解码每一步根据当前文法状态算出允许的后继 token 集合,采样只在集合内进行——模型永远不会输出破坏语法的 token。注意它保证的是语法和 schema 形状合法(字段存在、类型正确),不保证语义正确(日期可以是 2 月 30 日之外的合法字符串但内容错误仍可能)。工程建议:schema 尽量扁平、字段加 description 帮助模型理解;嵌套过深时约束解码会显著拖慢速度(每步都要做文法状态计算);仍然要留后处理兜底——解析失败时重试或降级,并记录失败率。对可靠性要求极高的链路,约束解码加一次程序校验加失败重试是标准组合。

追问方向:约束解码为什么可能伤害生成质量?function calling 的 schema 和 response_format 有何异同?如何设计重试与降级策略?

(约 460 字)