问题

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。