为什么需要结构化输出
大模型默认输出自然语言,直接解析容易失败。例如让模型提取用户信息,它可能返回“姓名:张三,年龄:25”,也可能返回“张三今年25岁”。这种不确定性让下游程序难以处理。结构化输出(如 JSON)配合 JSON Schema 约束,能强制模型按固定格式返回,大幅提升稳定性。
核心方法:JSON Schema 约束
JSON Schema 是一套描述 JSON 数据结构的规范。你可以定义字段名、类型、是否必需、取值范围等。将 Schema 提供给模型,并明确要求“只返回符合此 Schema 的 JSON”,模型便会遵循。
步骤一:定义 Schema
假设要从一段文本中提取人物信息,Schema 可以这样写:
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer", "minimum": 0 },
"city": { "type": "string" }
},
"required": ["name", "age"],
"additionalProperties": false
}
关键点:
required确保必需字段一定出现。additionalProperties: false防止模型添加无关字段。- 用
enum限定取值范围,例如"gender": { "type": "string", "enum": ["男", "女"] }。
步骤二:构造提示词
将 Schema 嵌入提示词,并强调输出格式。示例:
请从以下文本中提取人物信息,并以 JSON 格式返回。
必须严格遵循以下 JSON Schema:
{上述 Schema}
只输出 JSON,不要包含任何其他文字。
文本:张三今年25岁,住在北京。
注意:不同模型对提示词的敏感度不同,建议把 Schema 放在显眼位置,并重复强调“只输出 JSON”。
步骤三:解析与校验
拿到输出后,先尝试 JSON.parse。如果失败,可能模型在 JSON 外包裹了说明文字。此时可以用正则提取第一个 { 到最后一个 } 之间的内容,再解析。解析成功后,用 JSON Schema 校验库(如 Python 的 jsonschema)验证数据是否符合定义。不符合则触发重试或降级处理。
提升稳定性的实用技巧
- 提供示例:在提示词中给一个输入输出示例(few-shot),模型模仿效果更好。
- 限制生成长度:设置
max_tokens避免模型“画蛇添足”。 - 温度调低:
temperature=0或接近 0,减少随机性。 - 使用模型原生支持:部分模型提供“JSON 模式”或“结构化输出”参数,开启后模型内部会约束输出格式,比纯提示词更可靠。具体参数名请查阅所用模型的官方文档。
- 重试机制:解析失败时,将错误信息反馈给模型,让它重新生成。例如:“你上次返回的不是合法 JSON,请重新输出,只包含 JSON。”
常见坑与规避
- 字段缺失:Schema 中标记
required,并在提示词中强调“必须包含所有必需字段”。 - 类型错误:如年龄返回字符串
"25",可在 Schema 中指定integer,模型通常能遵守;若仍出错,可在校验后做类型转换。 - 嵌套结构:复杂对象建议拆分为多个简单 Schema,或使用
$ref引用定义。 - 中文乱码:确保请求和响应使用 UTF-8 编码。
总结
用 JSON Schema 约束大模型输出,是让 AI 应用从“玩具”走向“生产”的关键一步。核心流程:定义 Schema → 构造提示词 → 解析校验 → 失败重试。结合低温度、示例和模型原生 JSON 模式,可以显著提升稳定性。动手试试,你会发现模型返回可解析结果的比例大幅上升。