Instructor 现在提供了一种简化的方式,可以使用一个统一的接口初始化任何支持的 LLM 提供商。这种方法使得在不同 LLM 提供商之间切换比以往任何时候都更容易,同时保持您所依赖的结构化输出功能。
随着 LLM 提供商数量的增长,初始化和使用不同客户端库的复杂性也随之增加。每个提供商都有自己的初始化模式、API 结构和特性。这导致代码在提供商之间不可移植,并且在您想尝试新模型时需要进行大量重构。
我们引入了一个新的统一接口,允许您使用简单的字符串格式初始化任何受支持的提供商
import instructor
from pydantic import BaseModel
class UserInfo(BaseModel):
name: str
age: int
# Initialize any provider with a single consistent interface
client = instructor.from_provider("openai/gpt-4")
client = instructor.from_provider("anthropic/claude-3-sonnet")
client = instructor.from_provider("google/gemini-pro")
client = instructor.from_provider("mistral/mistral-large")
from_provider
函数接受 "provider/model-name"
格式的字符串,并处理使用正确的模型设置相应客户端的所有细节。这提供了几个关键优势
- 简化初始化:无需手动创建特定于提供商的客户端
- 统一接口:相同的语法适用于所有提供商
- 减少依赖暴露:您无需在应用程序代码中导入特定的提供商库
- 轻松实验:只需更改一行代码即可在提供商之间切换
基于字符串的初始化目前支持生态系统中的所有主要提供商
- OpenAI:
"openai/gpt-4"
, "openai/gpt-4o"
, "openai/gpt-3.5-turbo"
- Anthropic:
"anthropic/claude-3-opus-20240229"
, "anthropic/claude-3-sonnet-20240229"
, "anthropic/claude-3-haiku-20240307"
- Google Gemini:
"google/gemini-pro"
, "google/gemini-pro-vision"
- Mistral:
"mistral/mistral-small-latest"
, "mistral/mistral-medium-latest"
, "mistral/mistral-large-latest"
- Cohere:
"cohere/command"
, "cohere/command-r"
, "cohere/command-light"
- Perplexity:
"perplexity/sonar-small-online"
, "perplexity/sonar-medium-online"
- Groq:
"groq/llama2-70b-4096"
, "groq/mixtral-8x7b-32768"
, "groq/gemma-7b-it"
- Writer:
"writer/palmyra-instruct"
, "writer/palmyra-instruct-v2"
- AWS Bedrock:
"bedrock/anthropic.claude-v2"
, "bedrock/amazon.titan-text-express-v1"
- Cerebras:
"cerebras/cerebras-gpt"
, "cerebras/cerebras-gpt-2.7b"
- Fireworks:
"fireworks/llama-v2-70b"
, "fireworks/firellama-13b"
- Vertex AI:
"vertexai/gemini-pro"
, "vertexai/text-bison"
- Google GenAI:
"genai/gemini-pro"
, "genai/gemini-pro-vision"
每个提供商将使用合理的默认值进行初始化,但您也可以传递额外的关键字参数来自定义配置。有关模型特定细节,请查阅各提供商的文档。
统一接口完全支持同步和异步客户端
# Synchronous client (default)
client = instructor.from_provider("openai/gpt-4")
# Asynchronous client
async_client = instructor.from_provider("anthropic/claude-3-sonnet", async_client=True)
# Use like any other async client
response = await async_client.chat.completions.create(
response_model=UserInfo,
messages=[{"role": "user", "content": "Extract information about John who is 30 years old"}]
)
您还可以指定与提供商一起使用的结构化输出模式
import instructor
from instructor import Mode
# Override the default mode for a provider
client = instructor.from_provider(
"anthropic/claude-3-sonnet",
mode=Mode.ANTHROPIC_TOOLS
)
# Use JSON mode instead of the default tools mode
client = instructor.from_provider(
"mistral/mistral-large",
mode=Mode.MISTRAL_STRUCTURED_OUTPUTS
)
# Use reasoning tools instead of regular tools for Anthropic
client = instructor.from_provider(
"anthropic/claude-3-opus",
mode=Mode.ANTHROPIC_REASONING_TOOLS
)
如果未指定,每个提供商将使用其推荐的默认模式
- OpenAI:
Mode.OPENAI_FUNCTIONS
- Anthropic:
Mode.ANTHROPIC_TOOLS
- Google Gemini:
Mode.GEMINI_JSON
- Mistral:
Mode.MISTRAL_TOOLS
- Cohere:
Mode.COHERE_TOOLS
- Perplexity:
Mode.JSON
- Groq:
Mode.GROQ_TOOLS
- Writer:
Mode.WRITER_JSON
- Bedrock:
Mode.ANTHROPIC_TOOLS
(适用于 Bedrock 上的 Claude) - Vertex AI:
Mode.VERTEXAI_TOOLS
您可以根据您的特定需求和模型功能随时自定义此设置。
from_provider
函数包含健壮的错误处理,帮助您快速识别和解决问题
# Missing dependency
try:
client = instructor.from_provider("anthropic/claude-3-sonnet")
except ImportError as e:
print("Error: Install the anthropic package first")
# pip install anthropic
# Invalid provider format
try:
client = instructor.from_provider("invalid-format")
except ValueError as e:
print(e) # Model string must be in format "provider/model-name"
# Unsupported provider
try:
client = instructor.from_provider("unknown/model")
except ValueError as e:
print(e) # Unsupported provider: unknown. Supported providers are: ...
该函数验证提供商字符串格式,检查提供商是否受支持,并确保安装了必要的软件包。
与原生客户端库一样,from_provider
遵循为每个提供商设置的环境变量
# Set environment variables
import os
os.environ["OPENAI_API_KEY"] = "your-openai-key"
os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-key"
os.environ["MISTRAL_API_KEY"] = "your-mistral-key"
# No need to pass API keys directly
client = instructor.from_provider("openai/gpt-4")
以下是使用统一提供商接口时的一些常见问题和解决方案
如果您收到 404 错误,请检查您是否使用了正确的模型名称格式
Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', 'message': 'model: claude-3-haiku'}}
对于 Anthropic 模型,始终包含版本日期:- ✅ 正确:anthropic/claude-3-haiku-20240307
- ❌ 错误:anthropic/claude-3-haiku
某些提供商的 API 调用需要特定参数
# Anthropic requires max_tokens
anthropic_client = instructor.from_provider(
"anthropic/claude-3-haiku-20240307",
max_tokens=400 # Required for Anthropic
)
# Use models with vision capabilities for multimodal content
gemini_client = instructor.from_provider(
"google/gemini-pro-vision" # Required for image processing
)
这是一个完整的示例,演示了使用多个提供商的 automodel 功能
import os
import asyncio
import instructor
from pydantic import BaseModel, Field
class UserInfo(BaseModel):
"""User information extraction model."""
name: str = Field(description="The user's full name")
age: int = Field(description="The user's age in years")
occupation: str = Field(description="The user's job or profession")
async def main():
# Test OpenAI
openai_client = instructor.from_provider("openai/gpt-3.5-turbo")
openai_result = openai_client.chat.completions.create(
response_model=UserInfo,
messages=[{"role": "user", "content": "Jane Doe is a 28-year-old data scientist."}]
)
print(f"OpenAI result: {openai_result.model_dump()}")
# Test Anthropic with async client
if os.environ.get("ANTHROPIC_API_KEY"):
anthropic_client = instructor.from_provider(
model="anthropic/claude-3-haiku-20240307",
async_client=True,
max_tokens=400 # Required for Anthropic
)
anthropic_result = await anthropic_client.chat.completions.create(
response_model=UserInfo,
messages=[{"role": "user", "content": "John Smith is a 35-year-old software engineer."}]
)
print(f"Anthropic result: {anthropic_result.model_dump()}")
if __name__ == "__main__":
asyncio.run(main())
基于字符串的初始化是使 Instructor 更加用户友好和灵活的重要一步。它降低了使用多个提供商的学习曲线,并使得尝试不同模型比以往任何时候都更容易。
优点包括:- 统一接口简化初始化 - 自动选择合适的默认模式 - 支持同步和异步客户端 - 清晰的错误消息,快速识别问题 - 遵循特定于提供商的环境变量 - 涵盖整个 LLM 生态系统的全面模型选择
无论您是构建新应用程序还是迁移现有应用程序,统一提供商接口都提供了一种更清晰、更易于维护的方式来处理整个 LLM 生态系统中的结构化输出。
立即使用 instructor.from_provider()
尝试吧,并在我们的仓库中查看完整示例代码!