常见问题¶
本页面解答了关于如何将 Instructor 与各种 LLM 提供商一起使用的常见问题。
常见问题¶
什么是 Instructor?¶
Instructor 是一个库,可以轻松地从大型语言模型 (LLM) 中获取结构化数据。它使用 Pydantic 定义输出模式,并为不同的 LLM 提供商提供一致的接口。
Instructor 是如何工作的?¶
Instructor “修补” LLM 客户端,以添加接受 Pydantic 模型的 response_model
参数。当您发出请求时,Instructor 会
- 将您的 Pydantic 模型转换为 LLM 可以理解的模式
- 根据提供商格式化提示
- 根据您的模型验证 LLM 的响应
- 如果验证失败,则自动重试
- 返回一个类型正确的 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
- 指示模型直接返回 JSONMode.ANTHROPIC_TOOLS
- 使用 Anthropic 的工具调用功能Mode.GEMINI_TOOLS
- 使用 Gemini 的函数调用
最佳模式取决于您的提供商和使用案例。详情请参阅修补。
安装与设置¶
如何安装 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
每个提供商都有其集成指南中记录的特定要求。
常见问题¶
为什么我的模型没有返回结构化数据?¶
常见原因包括
- 为您的提供商使用了错误的模式
- 复杂的模式让模型感到困惑
- 您的提示中上下文不足
- 使用不支持函数/工具调用的模型
尝试简化您的模式或在提示中提供更清晰的说明。
如何处理验证错误?¶
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 使用量?¶
- 使用简洁的提示
- 对于简单的任务,使用更小的模型
- 对于简单的模式,使用
MD_JSON
或JSON
模式 - 缓存重复查询的响应
如何处理速率限制?¶
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())