跳到内容

使用 Ollama 的结构化输出

开源大型语言模型 (LLM) 在 AI 社区中迅速普及。随着 Ollama 最近发布的 OpenAI 兼容层,现在可以利用这些开源模型通过 JSON schema 获取结构化输出。这一进展为开发者和研究人员带来了令人兴奋的可能性。

在这篇博客文章中,我们将探讨如何有效利用 Instructor 库和 Ollama,通过 Pydantic 模型 来驾驭结构化输出的力量。我们将涵盖从设置到实现的所有内容,为您提供实用的见解和代码示例。

为什么要使用 Instructor?

Instructor 提供了几个关键优势:

  • 简单的 API 和完整的提示控制:Instructor 提供了一个直接的 API,让您完全拥有和控制您的提示。这使得您可以对 LLM 交互进行精细的定制和优化。 探索概念

  • 重试和验证:当验证失败时自动要求模型重试,确保高质量的输出。利用 Pydantic 的验证功能实现强大的错误处理。 了解重试

  • 流式传输支持:轻松流式传输部分结果和可迭代对象,实现应用的实时处理和响应能力提升。 了解流式传输

  • 基于类型提示:利用 Pydantic 进行 schema 验证、提示控制、减少代码和 IDE 集成。 了解更多

  • 简化 LLM 交互:支持各种 LLM 提供商,包括 OpenAI、Anthropic、Google、Vertex AI、Mistral/Mixtral、Anyscale、Ollama、llama-cpp-python、Cohere 和 LiteLLM。 查看示例

有关这些功能的更多详细信息,请查看文档的概念部分。

Patching

Instructor 的 patch 使用以下功能增强了 OpenAI API:

  • create 调用中的 response_model,返回一个 Pydantic 模型。
  • create 调用中的 max_retries,通过指数退避策略在调用失败时进行重试。

了解更多

要了解更多信息,请参考文档。要理解将 Pydantic 与 Instructor 结合使用的优势,请访问为什么要使用 Pydantic页面的提示和技巧部分。

Ollama

首先下载 Ollama,然后拉取一个模型,例如 Llama 3 或 Mistral。

确保您的 ollama 已更新到最新版本!

ollama pull llama3
from openai import OpenAI
from pydantic import BaseModel, Field
from typing import List

import instructor


class Character(BaseModel):
    name: str
    age: int
    fact: List[str] = Field(..., description="A list of facts about the character")


# enables `response_model` in create call
client = instructor.from_openai(
    OpenAI(
        base_url="http://localhost:11434/v1",
        api_key="ollama",  # required, but unused
    ),
    mode=instructor.Mode.JSON,
)

resp = client.chat.completions.create(
    model="llama3",
    messages=[
        {
            "role": "user",
            "content": "Tell me about the Harry Potter",
        }
    ],
    response_model=Character,
)
print(resp.model_dump_json(indent=2))
"""
{
  "name": "Harry James Potter",
  "age": 37,
  "fact": [
    "He is the chosen one.",
    "He has a lightning-shaped scar on his forehead.",
    "He is the son of James and Lily Potter.",
    "He attended Hogwarts School of Witchcraft and Wizardry.",
    "He is a skilled wizard and sorcerer.",
    "He fought against Lord Voldemort and his followers.",
    "He has a pet owl named Snowy."
  ]
}
"""

本示例演示了如何将 Instructor 与 Ollama(一个本地 LLM 服务器)结合使用来生成结构化输出。通过利用 Instructor 的功能,我们可以轻松地从 LLM 的响应中提取结构化信息,从而更简单地在我们的应用程序中处理生成的数据。

进一步阅读

要了解更多关于 Instructor 及其各种应用的信息,请查看以下资源:

  1. 为什么要使用 Instructor? - 了解 Instructor 的优点和用例。

  2. 概念 - 深入了解 Instructor 的核心概念,包括模型、重试和验证。

  3. 示例 - 探索我们与各种 LLM 提供商集成的综合示例集合。

  4. 教程 - 循序渐进的教程,帮助您入门 Instructor。

  5. 学习提示 - 使用 Instructor 进行有效提示工程的技术和策略。

通过探索这些资源,您将全面了解 Instructor 的功能以及如何在您的项目中利用它们。