问题
LLM 擅长生成文本,但应用通常需要结构化数据——JSON 对象、数组、类型化值。获取可靠的结构化输出需要特定技术。
方法 1:提示词工程
要求模型以 JSON 格式回复:
- 在提示中指定确切 schema。
- 包含示例输入/输出对。
方法 2:函数调用/工具使用
主要 API 现在支持函数调用:
- 定义预期输出的 JSON schema。
- 模型被约束为输出匹配 schema。
方法 3:约束解码
Outlines 和 LMQL 等库强制模型产生有效输出:
- 定义 Pydantic 模型或 JSON schema。
- 解码过程逐 token 强制执行 schema。
方法 4:Instructor 库
Instructor 库用 Pydantic 验证包装任何 LLM API:
- 用 Pydantic 定义数据模型。
- Instructor 自动处理重试和验证。
最佳实践
- 始终对照 schema 验证输出。
- 对有限选项使用枚举类型。
- 包含重试逻辑。
- 保持 schema 简单。
实用模式
获取结构化输出最可靠的方式是在系统提示词中结合清晰的 schema 定义和少样本示例。展示 2–3 个你想要格式的输入/输出对。OpenAI 模型使用 response_format 参数配合 JSON schema。Claude 使用 tool_use API 强制结构化响应。
常见坑
- Schema 复杂度:保持 schema 扁平简单。深层嵌套对象增加错误率。
- 验证:使用前始终验证输出是否符合 schema。LLM 偶尔产生无效 JSON。
- 枚举处理:使用枚举时在提示词中包含所有有效值。模型有时会编造不存在的值。
- 转义:JSON 字符串内的 JSON 是常见 bug 来源。使用正确转义或外层改用 YAML。