SGLang 结构化输出:让 JSON 先过语法门
自由生成再做
JSON.parse,格式错了只能重试。SGLang 把输出约束放进生成过程,支持 JSON Schema、正则表达式和 EBNF;同一请求只能指定其中一种。1图 3 给的是 OpenAI 兼容接口:JSON Schema 放在
response_format,其中要带 name 和 schema。如果你选 regex 或 EBNF,则通过 extra_body 传入。1图 5 往源码里再走一层:
GrammarManager 接收约束,grammar backend 编译它,再在采样前用 vocabulary mask 把非法 token 的 logit 置为负无穷。这个链路解释了它和「生成完成后再校验」的区别。2 3实际部署时,先确认 grammar backend。官方文档列出 XGrammar、Outlines 和 Llguidance 的能力差异,并建议优先使用 XGrammar;启动参数见 Server Arguments。Prompt 里仍要明确告诉模型希望的格式,Schema 不是提示词的替代品。1
如果你服务的是 reasoning 模型,再看 Structured Outputs for Reasoning Models:
<think> 段可以保持自由文本,结束后才应用约束;Native API 需要设置 require_reasoning=True,Chat Completions API 不需要。4读完后可以直接做一次小实验:先用图 3 的 JSON Schema 请求跑通,再把同一个任务改成 regex,对比两种约束适合表达什么。拿到 JSON 后,业务字段仍要由你的应用层校验。




コメント
ログインするとコメントできます。