跳到内容

Pydantic 依然是你所需的一切:结构化输出一年回顾

一年前,我发表了一个题为“Pydantic:你所需的一切”的演讲,开启了我的 Twitter 生涯。今天,我再次重申这一信息,并分享我在过去一年中使用语言模型进行结构化输出的经验。

观看 YouTube 视频

非结构化输出的问题

想象一下,你雇佣一个实习生来编写一个 API,它返回一个你必须通过 JSON 加载到字典中的字符串,然后还得祈祷数据仍在里面。你很可能会解雇他们,然后换成 GPT。然而,我们许多人却满足于以同样随意的方式使用 LLM。

不使用 schema 和结构化响应,我们在构建与外部系统交互的工具时,会失去兼容性、可组合性和可靠性。但有一个更好的方法。

Pydantic 的力量

Pydantic 结合函数调用,为结构化输出提供了一种更优越的替代方案。它使得以下成为可能:

  • 嵌套对象和模型,用于模块化结构
  • 校验器,提高系统可靠性
  • 更干净、更易于维护的代码

有关 Pydantic 如何增强数据验证的更多详细信息,请查看我们的 使用 Pydantic 进行数据验证 指南。

关键在于:在过去一年里,实际上并没有什么改变。核心 API 仍然只是

from instructor import from_openai

client = from_openai(OpenAI())

response = client.chat.completions.create(
    model="gpt-3.5-turbo", response_model=User, messages=[...]
)

Pydantic 有哪些新特性?

自去年以来

  • 我们发布了 1.0 版本
  • 支持 5 种语言(Python, TypeScript, Ruby, Go, Elixir)
  • 构建了 Rust 版本
  • Python 库实现月环比 40% 的增长

我们现在支持 Ollama, llama-cpp-python, Anthropic, Cohere, Google, Vertex AI 等更多平台。只要语言模型支持函数调用功能,这个 API 就将保持标准。

主要特点

  1. 带结构的流式传输:在对象返回时即时获取,提高延迟的同时保持结构化输出。在我们的 流式传输支持 指南中了解更多信息。

  2. 局部对象(Partials):验证整个对象,无需复杂的 JSON 解析即可实现生成式 UI 的实时渲染。查看我们的 局部对象 文档,了解实现细节。

  3. 校验器:添加自定义逻辑以确保输出正确,并具备在出错时重试的能力。在我们的 重试和验证 指南中深入探讨此主题。

实际应用

生成和提取

结构化输出在以下任务中表现出色:

  • 在 RAG 应用中生成后续问题
  • 验证生成内容中的 URL
  • 从文字记录或图像中提取结构化数据

有关实际示例,请参阅我们的 从图像中提取结构化数据 案例研究。

搜索查询

对于复杂的搜索场景

class Search(BaseModel):
    query: str
    start_date: Optional[datetime]
    end_date: Optional[datetime]
    limit: Optional[int]
    source: Literal["news", "social", "blog"]

这种结构使得更复杂的搜索成为可能,可以处理仅靠嵌入无法处理的查询,例如“X 的最新消息是什么?”

经验教训

  1. 验证错误对于提高系统性能至关重要。
  2. 并非所有语言模型都已有效地支持重试逻辑。
  3. 结构化输出同样有利于视觉、文本、RAG 和 agent 应用。

使用 LLM 进行编程的未来

我们不是在改变编程语言;我们是在重新学习如何使用数据结构进行编程。结构化输出使我们能够

  • 拥有我们定义的对象
  • 控制我们实现的函数
  • 管理控制流
  • 拥有 prompts

这种方法使得 Software 3.0 向后兼容现有软件,消除了语言模型的神秘感,并使我们回归到更经典的编程结构。

总结

Pydantic 仍然是您使用 LLM 实现有效结构化输出所需的一切。这不仅仅是关于生成准确的响应;更是关于以与我们现有编程范式和工具兼容的方式来实现这一点。

随着我们不断改进 AI 语言模型,牢记这些原则将带来更健壮、更易于维护和更强大的应用。AI 的未来不仅在于模型能做什么,还在于我们如何将它们无缝集成到现有的软件生态系统中。

有关更高级的用例和集成,请查看我们的 示例 部分,其中涵盖了各种 LLM 提供商和专业实现。