让 SGLang 按 JSON 回答,怎样少写一些补救代码

让 SGLang 按 JSON 回答,怎样少写一些补救代码

你让模型把客服工单分成"物流、退款、其他",后端等着读 JSON。它却先回一句"当然可以,分析如下",再给结果。有时外面包着代码块,有时把约定好的 refund 写成中文"退款"。

于是程序开始去代码块、找左大括号、修字段名。真正的分类还没开始,已经在清理模型的表达习惯。

SGLang 可以通过 JSON Schema 约束输出结构。下面用一份工单走完请求配置和返回验证,看看哪些补丁可以减少,哪些检查还得保留。示例依据公开接口改写,本文未部署模型实跑。

先固定字段,再接请求

图中是 SGLang 官方 Structured Outputs 文档的原始聚焦截图,检查于 2026-09-06。它支持 JSON Schema、正则或 EBNF 等约束入口,并要求每个请求只指定一种主要约束参数。具体特性依赖实际版本和 grammar backend。官方说明

提示词里的"只输出 JSON"会影响模型倾向;Schema 则描述允许的结构。我们先把工单接口收窄到 category 和 reason 两个字段:

json 复制代码
{
  "type": "object",
  "properties": {
    "category": {"type": "string", "enum": ["delivery", "refund", "other"]},
    "reason": {"type": "string"}
  },
  "required": ["category", "reason"],
  "additionalProperties": false
}

这里 enum 限制类别的三个可选值,required 要求两个字段都出现,additionalProperties 限制额外字段。后端不再需要同时兼容 type、label、category 三种随意命名。

将上面的对象放进兼容请求的 response_format.json_schema.schema,字段外层如下。它只是请求的一部分,还需要模型名、消息和足够的输出长度:

python 复制代码
# schema = 上面的 JSON 对象转成 Python dict
response_format = {
    "type": "json_schema",
    "json_schema": {
        "name": "ticket_category",
        "schema": schema,
    },
}

提示词仍要写清楚业务类别怎么区分,尤其是同一工单包含多个诉求时按什么口径分。Schema 限制可选项,不能替你定义"物流问题归哪个团队"。复杂 Schema 也不能直接假定受支持,先用所选版本和后端验证。

只选三个类别,枚举就够了;固定编号可以考虑正则,更复杂的语言结构才考虑文法。约束越复杂,后端支持和生成停止条件越值得单独验证。

合法 JSON,也会把工单分错

约束解码会根据已生成的内容和结构规则,排除会破坏格式的下一步选择;模型在剩下的合法选项中继续生成。三个类别都在允许范围内,并不意味着它一定选对。

例如,工单写着:"已经退款,快递什么时候来取件?"假设我们的标签口径是按当前待处理诉求归类,这条应该进入 delivery。下面的结果却同样符合 Schema:

json 复制代码
{"category":"refund","reason":"用户提到了退款"}

这是一份作者构造的反例,不是模型实测输出。字段齐全、类型正确、类别也在枚举中,但它只盯着"退款"两个字,忽略了用户现在问的是取件。

所以验收至少要分开看:结构是否合格,类别是否符合人工标注。格式错误变少值得保留,但只报 JSON 能解析,还不足以说明分类可以进入业务。

收到完整结果后,再验一次

SGLang 官方示例在拿到完整返回内容后,仍调用 Pydantic 的 model_validate_json 验证对象。图中保留的是该代码末段的原始像素,检查于 2026-09-06。官方 JSON 示例

如果使用流式传输,一个片段通常还不是完整 JSON。输出被长度限制截断、连接中断或服务报错时,不能因为前面已经出现 category,就把半份结果提交给业务。

接收端应等完整响应结束,检查结束原因,再解析并做 Schema 校验。这样,生成配置、网络返回和客户端预期不一致时,错误也有明确位置。

如果分类之后要调用退款工具,还要检查订单状态、用户权限和金额范围。金额是合法数字,也不能证明这次退款允许执行。

对带推理过程的模型,还需确认推理文本在哪里结束、格式约束从哪里生效;不要把普通模型的配置原样推广过去。推理模型说明

从错误样本里挑掉补丁

从已有工单里挑出空内容、多个诉求、类别边界和信息不足的样本。对同一批输入比较"只有提示词"和"提示词加 Schema",分别记录解析失败、缺字段、类别错误和超长截断。

如果结构错误确实减少,再逐步移除猜括号、改字段名之类的补救。错分类继续留在评测里,信息不够的工单保留人工处理分支。

你最终要保留的是一条可解释的处理顺序:收齐对象,验证格式,再检查分类和业务条件。补丁能删多少,由这些错误样本决定。

相关推荐
染指11101 小时前
111.Agent-LangChain核心组件-Tools工具
人工智能·langchain·agents
小唔w1 小时前
文字一键生成播客音频,2026年几款AI工具功能梳理
人工智能·音视频
醍醐实验室1 小时前
分布式梯度累加(Gradient Accumulation):通信与计算的交错隐藏
人工智能
vivo互联网技术1 小时前
SmartPhotoCrafter: 先思考后修图,统一理解-生成的图像优化新范式
人工智能·算法·计算机视觉
沈管家AI数字员工1 小时前
对话式数据分析实操:从自然语言到可视化图表的全流程
数据库·人工智能·ai·oracle·数据分析
日常筹谋记1 小时前
深度评论:光模块固晶机精度跃迁中的三菱电机伺服与控制
人工智能
legendary_1631 小时前
PD‑SINK芯片在无协议后端负载中的工程应用
c语言·开发语言·人工智能·智能手机·计算机外设
代码柏拉图1 小时前
article
人工智能
必须会一定会1 小时前
DeepSeek-V4.1-Flash 内测 API 接入:模型 ID、OpenAI 兼容调用、图片格式与价格边界
人工智能·ai编程