首页/AI/大模型部署与运维速查/受约束解码:JSON/Schema/正则
推理参数与优化50 条

受约束解码:JSON/Schema/正则

受约束解码让输出在生成时就符合目标语法:OpenAI 兼容的 response_format(JSON 模式)与 vLLM 的 guided decoding(底层 xgrammar/outlines 等后端)是常见入口,可降低解析失败率。

受约束解码是什么

受约束解码(guided decoding / structured outputs)在生成过程中就限制输出符合目标语法,而不是先自由生成、失败后再重试。常见入口有两类:OpenAI 兼容接口的 response_format(JSON 模式与 JSON Schema),以及 vLLM 的 guided_decoding 参数,底层由语法编译类实现支撑。它显著降低解析失败率,但对内容正确性不做任何保证。

基本信息

入口一OpenAI 兼容:response_format(json_object / json_schema)
入口二vLLM:SamplingParams 的 guided_decoding
支持的约束JSON、JSON Schema、正则、有限选项,支持矩阵随引擎版本而异
约束范围只约束语法结构,不约束字段值的真实性
代价每步都要做约束校验,首字延迟会上升

典型使用场景

  • 字段抽取:从文本里取姓名、金额、日期,要求稳定可解析的结构
  • 工具调用参数生成:函数名与参数必须严格匹配签名,否则下游直接报错
  • 分类与打标:把输出限定在给定的标签集合内,避免模型自创类别
  • 格式约束:用正则限定 IP、时间戳、编号等文本形态
  • 减少重试:下游解析失败率下降,整体调用次数与延迟随之降低

两种入口

两种入口
# 入口一:OpenAI 兼容的 JSON 模式
r = client.chat.completions.create(
    model="<模型名>",
    messages=[{"role": "user", "content": "输出包含 name 与 age 的 JSON"}],
    response_format={"type": "json_object"},
)

# 入口二:vLLM 引导解码(类名与字段随版本演进,以所用版本文档为准)
from vllm import SamplingParams
from vllm.sampling_params import GuidedDecodingParams
sp = SamplingParams(guided_decoding=GuidedDecodingParams(
    json={"type": "object", "properties": {"name": {"type": "string"}}, "required": ["name"]}))

约束类型与适用

类型典型用法注意
JSON 模式只要合法 JSON,字段不限结构合法但字段可能缺失
JSON Schema强制字段名、类型与必填项schema 越复杂,每步开销越大
正则限定文本形态(编号、IP、时间)写错正则会导致生成异常
有限选项输出限定在枚举值内选项描述要与提示词一致
约束校验有每步开销:首字延迟会上升,schema 越复杂越明显。对延迟敏感的场景优先用简单 schema,而不是把整个业务模型塞进去。
即使开启约束,也要保留解析兜底:输出被长度截断、模型服务异常、schema 与提示词冲突时,仍会出现解析失败,下游不能假设一定成功。

易错点

  • 把 JSON 模式当内容正确性保证:它只约束语法结构,字段值仍可能编造,业务校验不能省
  • schema 写成多层嵌套加大量可选字段:首字延迟明显上升,收益却不匹配
  • 约束与提示词互相打架(提示要中文、schema 只允许英文枚举):输出内容混乱或退化
  • 不做异常兜底:截断、超时与冲突场景下解析仍然失败,缺少降级路径

数据来源与参考

  • vLLM 官方文档:Structured Outputs(docs.vllm.ai)
  • OpenAI API 参考:response_format(platform.openai.com/docs)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌