跳到内容

常见问题

本页面解答了关于如何将 Instructor 与各种 LLM 提供商一起使用的常见问题。

常见问题

什么是 Instructor?

Instructor 是一个库,可以轻松地从大型语言模型 (LLM) 中获取结构化数据。它使用 Pydantic 定义输出模式,并为不同的 LLM 提供商提供一致的接口。

Instructor 是如何工作的?

Instructor “修补” LLM 客户端,以添加接受 Pydantic 模型的 response_model 参数。当您发出请求时,Instructor 会

  1. 将您的 Pydantic 模型转换为 LLM 可以理解的模式
  2. 根据提供商格式化提示
  3. 根据您的模型验证 LLM 的响应
  4. 如果验证失败,则自动重试
  5. 返回一个类型正确的 Pydantic 对象

Instructor 支持哪些 LLM 提供商?

Instructor 支持许多提供商,包括

  • OpenAI (GPT 模型)
  • Anthropic (Claude 模型)
  • Google (Gemini 模型)
  • Cohere
  • Mistral AI
  • Groq
  • LiteLLM (元提供商)
  • 通过 Ollama、llama.cpp 等支持各种开源模型

请参阅集成部分以获取完整列表。

不同模式之间有什么区别?

Instructor 为不同的提供商支持不同的模式

  • Mode.TOOLS - 使用 OpenAI 函数调用 API(推荐用于 OpenAI)
  • Mode.JSON - 指示模型直接返回 JSON
  • Mode.ANTHROPIC_TOOLS - 使用 Anthropic 的工具调用功能
  • Mode.GEMINI_TOOLS - 使用 Gemini 的函数调用

最佳模式取决于您的提供商和使用案例。详情请参阅修补

安装与设置

如何安装 Instructor?

基本安装

pip install instructor

针对特定提供商

pip install "instructor[anthropic]"  # For Anthropic
pip install "instructor[google-generativeai]"  # For Google/Gemini

我需要哪些环境变量?

这取决于您的提供商

  • OpenAI: OPENAI_API_KEY
  • Anthropic: ANTHROPIC_API_KEY
  • Google: GOOGLE_API_KEY

每个提供商都有其集成指南中记录的特定要求。

常见问题

为什么我的模型没有返回结构化数据?

常见原因包括

  1. 为您的提供商使用了错误的模式
  2. 复杂的模式让模型感到困惑
  3. 您的提示中上下文不足
  4. 使用不支持函数/工具调用的模型

尝试简化您的模式或在提示中提供更清晰的说明。

如何处理验证错误?

Instructor 在验证失败时自动重试。您可以自定义此行为

from tenacity import stop_after_attempt

result = client.chat.completions.create(
    response_model=MyModel,
    max_retries=stop_after_attempt(5),  # Retry up to 5 times
    messages=[...]
)

我可以看到 LLM 的原始响应吗?

是的,使用 create_with_completion

result, completion = client.chat.completions.create_with_completion(
    response_model=MyModel,
    messages=[...]
)

result 是您的 Pydantic 模型,而 completion 是原始响应。

如何流式处理大型响应?

在生成响应时,使用 create_partial 获取部分更新

stream = client.chat.completions.create_partial(
    response_model=MyModel,
    messages=[...]
)

for partial in stream:
    print(partial)  # Partial model with fields filled in as they're generated

性能与成本

如何优化 token 使用量?

  1. 使用简洁的提示
  2. 对于简单的任务,使用更小的模型
  3. 对于简单的模式,使用 MD_JSONJSON 模式
  4. 缓存重复查询的响应

如何处理速率限制?

Instructor 使用 tenacity 库进行重试,您可以对其进行配置

from tenacity import retry_if_exception_type, wait_exponential
from openai.error import RateLimitError

result = client.chat.completions.create(
    response_model=MyModel,
    max_retries=retry_if_exception_type(RateLimitError),
    messages=[...],
)

高级用法

如何将 Instructor 与 FastAPI 一起使用?

Instructor 与 FastAPI 无缝协作

from fastapi import FastAPI
from pydantic import BaseModel
import instructor
from openai import OpenAI

app = FastAPI()
client = instructor.from_openai(OpenAI())

class UserInfo(BaseModel):
    name: str
    age: int

@app.post("/extract")
async def extract_user_info(text: str) -> UserInfo:
    return client.chat.completions.create(
        model="gpt-3.5-turbo",
        response_model=UserInfo,
        messages=[{"role": "user", "content": text}]
    )

如何在异步代码中使用 Instructor?

使用异步客户端

import instructor
import asyncio
from openai import AsyncOpenAI

client = instructor.from_openai(AsyncOpenAI())

async def extract_data():
    result = await client.chat.completions.create(
        response_model=MyModel,
        messages=[...]
    )
    return result

asyncio.run(extract_data())

在哪里可以获得更多帮助?