vLLM 0.6.3 开 guided_json,先用 schema A 请求,改成 B 后同一进程仍按 A 的字段输出,重启服务才生效,日志里没有任何 schema 相关记录。

真正麻烦的地方在于,几个原因的现象几乎一样。guided decoding 的缓存键没有带上 schema 版本;客户端复用了旧的请求体对象;structured outputs 后端在进程内复用编译结果;schema 序列化顺序不稳定,缓存判断失效。

上来先把每次实际发送的 schema 打印并比对

curl -s localhost:8000/v1/chat/completions -H 'Content-Type: application/json' -d @req_b.json

再往下换到 xgrammar 后端重新加载模型

python -m vllm.entrypoints.openai.api_server --model Qwen2.5-7B-Instruct --guided-decoding-backend xgrammar

接着清掉客户端缓存并重启服务复测

python smoke_guided.py --schema b.json --no-cache

给 schema 加显式版本号便于排查

python -c "print('schema_version: 2026-11-15-b')"

同一份数据我导出了两份,一份留底,一份拿来试。

这类问题以前遇到过,但这次的触发条件和上次不一样。

改完先别撤,确认这几项。换成 B 后第一次请求就返回新字段,连续切换 A 和 B 十次结果都正确,服务日志里能看到 schema 版本。

补一句。guided decoding 的编译结果会常驻显存,热更新 schema 在部分版本上并不可靠,线上切换结构化模板后最好滚动重启一次。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189