跳到内容

使用基于字符串的初始化的统一提供商接口

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() 尝试,并在我们的仓库中查看完整示例代码