问题出现得很突然,日志倒是留得挺全。本地 vLLM 0.6.3 起 Qwen2.5-7B-Instruct,启动带了 guided decoding 的配置,请求体里写了 guided_json 字段,返回仍是自由格式,偶尔还包一层 markdown 代码围栏,同一份 schema 在 OpenAI 的 strict 模式下是正常的,显卡 A10 24G,客户端用 openai 1.40 指到 8000 端口。

刚开始盯着「schema 里写了 default 与 format 关键字 后端不支持整段丢弃」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。guided_json 属于引擎扩展参数 放顶层会被 OpenAI 兼容层丢掉。也可能是镜像里没装 xgrammar 或 outlines 采样后端直接退回默认。

还有一种情况,请求先经过 chat template 模板里又要求了自然语言。

第一件事是确认服务启动日志里加载的是哪种后端

curl -s http://127.0.0.1:8000/metrics | grep -i guided

再往下用 SDK 把 schema 放进 extra_body 再请求一次

python -c "import json,urllib.request;b={'model':'qwen','messages':[{'role':'user','content':'给评分'}],'extra_body':{'guided_json':{'type':'object','properties':{'score':{'type':'integer'}},'required':['score']}}};r=urllib.request.Request('http://127.0.0.1:8000/v1/chat/completions',json.dumps(b).encode(),{'Content-Type':'application/json'});print(urllib.request.urlopen(r).read()[:200])"

随后把 schema 里的 default 与 format 去掉再试

python -c "import json;s=json.load(open('schema.json'));[p.pop('default',None) for p in s['properties'].values()];print(json.dumps(s))"

装 xgrammar 后重启并跑五十条冒烟

pip install xgrammar==0.1.11 && python smoke_schema.py --n 50

改完先别撤,确认这几项。五十条请求的 content 全部能被 json.loads 解析,score 都是整数,没有一条带代码围栏。

这里还有个坑。guided_json 是服务端的采样约束,没有进 extra_body 等于没传,改 schema 之前先确认后端到底装了没有。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189