大模型结构化输出速通:从 JSON 模式到可校验的接口
先选对模式:合法 JSON 不等于字段正确
把大模型接入工单分类、信息抽取或自动化流程,最容易踩的坑是:返回内容看起来像 JSON,却无法稳定入库。不要只在提示词里写“请返回 JSON”,应优先使用接口提供的输出约束。
- JSON 模式:通常通过 response_format={"type":"json_object"} 启用,目标是生成合法 JSON,但不保证字段、类型或枚举值符合业务要求。
- 结构化输出:通过 JSON Schema 描述字段;支持严格模式的模型可进一步约束输出结构。它仍不保证事实正确,也不能替代权限检查。
需要执行工具时使用工具调用;只需要固定格式的数据时,优先考虑结构化响应。两者不要混为一谈。
第一步:确认模型支持,再配置接口
先查看服务商文档,确认所选模型、接口和路由支持 json_schema 及 strict。OpenAI SDK 兼容不代表每个 Claude、GPT 模型都支持相同参数;Claude 原生接口的参数也不能直接照搬。
59API 提供低价、按量付费的 Claude 与 GPT 接入,适合低成本验证不同模型。服务基地址为 https://api.59api.com;下例采用常见的 OpenAI 兼容路径 /v1,实际路径和模型标识请以控制台文档为准。
安装依赖:pip install openai jsonschema。将密钥保存为环境变量 API_KEY_59,将已确认支持结构化输出的模型标识保存为 MODEL_ID,不要把密钥写进源码。
第二步:用最小契约完成一次请求
以下示例把工单提取为摘要与优先级。所有字段均必填,并禁止额外字段,便于直接对接后续业务。复制到 Python 文件即可执行;分号用于让示例保持紧凑。
import os, json; from openai import OpenAI; from jsonschema import validate; client = OpenAI(api_key=os.environ["API_KEY_59"], base_url="https://api.59api.com/v1"); schema = {"type":"object","properties":{"summary":{"type":"string"},"priority":{"type":"string","enum":["普通","紧急"]}},"required":["summary","priority"],"additionalProperties":False}; result = client.chat.completions.create(model=os.environ["MODEL_ID"], messages=[{"role":"system","content":"提取工单摘要与优先级。只有明确影响核心业务时才标为紧急。"},{"role":"user","content":"生产环境支付接口持续报错,所有用户无法付款。"}], response_format={"type":"json_schema","json_schema":{"name":"ticket","strict":True,"schema":schema}}); print(result.choices[0].message.content)
预期得到类似 {"summary":"生产支付接口故障,用户无法付款","priority":"紧急"} 的对象。不同模型支持的 Schema 子集可能不同;首次接入先用简单对象、字符串和枚举,不要直接塞入复杂递归结构。
第三步:解析之前先检查响应状态
上面的代码只演示请求,生产环境不能直接打印后就入库。先检查是否存在拒答,以及 finish_reason 是否表明正常完成;具体拒答字段随接口而异。输出达到长度上限时,内容可能被截断,不能当作完整结果使用。
确认正常完成后,再执行 data = json.loads(result.choices[0].message.content),随后执行 validate(instance=data, schema=schema)。最后补充业务校验,例如摘要长度、订单编号是否存在,以及当前用户是否有访问权限。
第四步:为不支持严格模式的模型设置降级
若模型明确不支持 json_schema,可改用 response_format={"type":"json_object"},并在提示词中明确要求“仅返回 JSON 对象,包含 summary 和 priority”。此时仍必须执行相同的本地 Schema 校验。
参数不支持时,不要反复重试原请求;应切换已验证的模型或模式。校验失败可带上错误原因重试一次;遇到限流或临时服务错误,则使用带随机抖动的指数退避。始终设置超时和重试上限。
上线前:同时检查成本与可靠性
- 先用轻量模型完成固定字段抽取,再根据测试结果决定是否升级,避免默认使用最贵模型。
- 压缩提示词与 Schema,按样本记录校验通过率、延迟、重试次数和实际费用,而非只比较单价。
- 把用户输入视为不可信数据;结构合法的 JSON 仍可能包含恶意内容,不可直接拼接 SQL 或执行命令。
59API 主打原生官方品质模型、不以降级模型替代,兼容 OpenAI SDK、Claude Code 和 Codex,并提供推荐返佣;具体价格与规则以平台公布为准。如果你正准备验证这条数据处理链路,可以注册 59API,用一小组真实样本先测通,再决定是否扩大调用量。