为什么大模型输出结构化数据不稳定?
大语言模型本质是生成自然语言的概率模型,默认输出自由文本。当要求它输出 JSON、XML 等结构化格式时,常出现字段缺失、类型错误、多余解释、格式漂移等问题。要稳定获得结构化数据,需要从提示词约束和输出校验两方面入手。
一、提示词约束:明确格式与规则
1. 提供精确的格式描述
不要只说“输出 JSON”,而要给出字段名、类型、是否必填、取值范围。例如:
请以 JSON 格式输出,包含以下字段:
- name: 字符串,姓名
- age: 整数,年龄
- city: 字符串,城市
只输出 JSON,不要任何其他文字。
2. 使用示例(Few-shot)
提供 1~2 个输入输出示例,能显著提升格式遵循度。示例应覆盖典型情况,并保持格式一致。
3. 分步引导
对于复杂结构,可要求模型“先思考再输出”,但最终只保留结构化部分。例如:“请先列出字段,再输出 JSON。”
4. 利用模型原生能力
部分模型(如 OpenAI 的 GPT-4 系列)支持 JSON 模式或函数调用,能强制输出合法 JSON。使用时需在请求中设置 response_format: { type: "json_object" } 并确保提示中包含“JSON”字样。
二、输出校验:确保数据可用
即使提示词完善,模型仍可能出错。必须对输出进行程序化校验。
1. 语法校验
使用 JSON 解析器(如 Python 的 json.loads)检查是否为合法 JSON。若失败,可尝试提取代码块内容或修复常见错误(如尾随逗号)。
2. 模式校验
定义 JSON Schema,用库(如 jsonschema)验证字段类型、必填项、枚举值。示例:
import json
from jsonschema import validate
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer", "minimum": 0}
},
"required": ["name", "age"]
}
data = json.loads(model_output)
validate(instance=data, schema=schema)
3. 业务逻辑校验
检查字段间关系(如结束日期晚于开始日期)、数据合理性(如年龄不超过 150)。
4. 失败重试与降级
校验失败时,可重新请求模型,并在提示中加入错误信息(如“上次输出缺少 age 字段,请修正”)。设置最大重试次数,避免无限循环。
三、工程实践建议
- 统一接口:封装
generate_structured(prompt, schema)函数,内部完成提示构建、调用、校验、重试。 - 日志记录:保存原始输出和错误信息,便于分析模型弱点。
- 温度调低:生成结构化数据时,将
temperature设为 0 或接近 0,减少随机性。 - 版本控制:提示词和 schema 应纳入版本管理,变更时评估影响。
总结
稳定输出结构化数据 = 清晰的提示词约束 + 严格的输出校验 + 合理的重试机制。三者结合,才能让大模型在真实系统中可靠地提供数据。