受约束解码是什么
受约束解码(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 与提示词冲突时,仍会出现解析失败,下游不能假设一定成功。