让大模型稳定输出 JSON:提示词、Schema 约束与程序校验
当大模型只用于聊天时,输出格式稍有变化无关紧要。但一旦要把模型输出交给程序处理,比如写入数据库、调用接口、渲染页面,格式稳定性就成了生死问题:多一句“好的,以下是结果”、少一个右括号、把数字写成字符串,都可能让程序崩溃。 让大模型稳定输出 JSON,需要提示词、接口能力和程序校验三管齐下。
第一层:提示词设计
明确给出结构
在提示中清楚描述需要的 JSON 结构,包括每个字段的名称、类型、含义和取值范围。最直接的方式是给出一个示例结构:
{
"sentiment": "positive | neutral | negative",
"topics": ["string"],
"summary": "string, 不超过 50 字",
"needs_followup": true
}
说明边界情况
- 某个字段没有信息时怎么办:填 null、空数组还是省略?
- 枚举字段遇到不属于任何类别的情况怎么处理?
- 数值的单位和精度是什么?
要求只输出 JSON
明确要求不输出任何解释性文字、不使用代码块标记,或者统一使用代码块以便程序提取。保持一致即可。
字段设计要简洁
- 字段名清晰、无歧义;
- 避免过深的嵌套;
- 不要让一个字段承担多种含义;
- 用枚举代替自由文本,降低不确定性。
第二层:利用结构化输出接口
主流大模型服务大多提供了专门的结构化输出能力:
- JSON 模式:保证输出是合法的 JSON,但不保证符合你的具体结构;
- Schema 约束输出:提供 JSON Schema,服务端在生成时约束输出严格符合该结构,这是目前最可靠的方式;
- 工具调用:把需要的结构定义为一个工具的参数,模型调用工具时输出的参数就是结构化数据,参见 Function Calling 详解。
对于自部署的开源模型,一些推理引擎支持基于语法的约束解码,在生成每个 Token 时只允许符合语法的候选,从而保证输出格式正确。
需要注意,格式正确不等于内容正确。约束解码能保证结构合法,但字段的值是否准确,仍然需要后续校验。
第三层:程序校验与容错
解析前的清理
即使要求只输出 JSON,模型偶尔仍会附带代码块标记或前后说明。在解析前,可以提取第一个完整的 JSON 对象。
Schema 校验
使用 JSON Schema 校验库或数据校验框架,检查字段是否齐全、类型是否正确、枚举值是否合法、数值是否在合理范围内。
业务规则校验
- 日期是否合法且在合理范围内;
- 金额之和是否等于总额;
- 引用的 ID 是否真实存在;
- 文本字段是否超过长度限制。
失败重试
校验失败时,把错误信息反馈给模型要求修正,例如“字段 sentiment 的值必须是 positive、neutral 或 negative 之一,你输出的是 good”。通常一到两次重试就能修正大部分问题。设置最大重试次数,避免无限循环。
降级处理
多次重试仍失败时,记录日志、返回默认值或转人工处理,确保整个系统不会因为一次失败而崩溃。
提升内容准确性的技巧
- 先推理后输出:对于需要判断的字段,可以在结构中增加一个“reasoning”字段放在前面,让模型先写出分析过程再给出结论,能提升判断准确率,参见思维链提示;
- 降低采样温度:结构化输出任务通常使用较低的温度,参见采样参数实用指南;
- 提供示例:对于复杂结构或判断标准,提供一两个完整的输入输出示例;
- 拆分复杂结构:一次抽取几十个字段容易出错,可以拆成多次调用,每次处理一组相关字段。
监控与评测
在生产环境中持续监控:格式校验失败率、重试率、各字段的空值率和异常值分布。建立包含典型和边界输入的测试集,在修改提示词或更换模型后进行回归测试,参见如何构建评测集。
小结
让大模型稳定输出 JSON,需要三层保障:提示词清晰描述结构和边界情况,优先使用 Schema 约束的结构化输出接口,程序层面做好解析、校验、重试和降级。格式稳定只是第一步,字段内容的准确性还需要业务规则校验和持续评测来保证。