Перейти к содержанию

LLM-провайдеры

Eval AI Library направляет все вызовы LLM через LiteLLM, а значит любой провайдер и модель, которые поддерживает LiteLLM, работают из коробки -- никакого захардкоженного списка провайдеров, никаких обёрток писать не нужно. Обновили litellm -- новые интеграции появляются автоматически.

Все метрики работают с любым провайдером через единый интерфейс -- достаточно указать нужную строку модели.

Провайдеры первого класса

У этих провайдеров есть свои "дружественные" настройки и отдельные страницы документации:

Провайдер Префикс Пример Переменная окружения
OpenAI openai: (по умолчанию) gpt-4o OPENAI_API_KEY
Anthropic Claude anthropic: anthropic:claude-3-5-sonnet-latest ANTHROPIC_API_KEY
Google Gemini google: google:gemini-2.0-flash GOOGLE_API_KEY
Azure OpenAI azure: azure:gpt-4o AZURE_OPENAI_API_KEY
DeepSeek deepseek: deepseek:deepseek-chat DEEPSEEK_API_KEY
Qwen (Alibaba) qwen: qwen:qwen-max DASHSCOPE_API_KEY
Zhipu GLM zhipu: zhipu:glm-4 ZHIPU_API_KEY
Mistral AI mistral: mistral:mistral-large-latest MISTRAL_API_KEY
Groq groq: groq:llama-3.1-70b-versatile GROQ_API_KEY
Grok (xAI) grok: grok:grok-2-latest XAI_API_KEY
Ollama ollama: ollama:llama3 --
Кастомный -- Передайте экземпляр CustomLLMClient --

Любой провайдер LiteLLM -- без дополнительной настройки

Помимо списка выше, вы можете использовать любой провайдер, который поддерживает LiteLLM -- AWS Bedrock, Google Vertex AI, Cohere, Replicate, Together AI, Perplexity, OpenRouter, Fireworks, Cerebras, SambaNova, Hugging Face и т.д. Просто используйте строку модели в формате LiteLLM напрямую:

from eval_lib import TaskSuccessRateMetric

# AWS Bedrock
metric = TaskSuccessRateMetric(model="bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0")

# Google Vertex AI
metric = TaskSuccessRateMetric(model="vertex_ai/gemini-1.5-pro")

# OpenRouter (шлюз к 100+ моделям)
metric = TaskSuccessRateMetric(model="openrouter/meta-llama/llama-3.1-405b-instruct")

# Together AI
metric = TaskSuccessRateMetric(model="together_ai/meta-llama/Llama-3-70b-chat-hf")

# Cohere
metric = TaskSuccessRateMetric(model="cohere/command-r-plus")

# Perplexity
metric = TaskSuccessRateMetric(model="perplexity/llama-3.1-sonar-large-128k-online")

Учётные данные берутся из переменных окружения, которые LiteLLM ожидает для каждого провайдера (AWS_ACCESS_KEY_ID, VERTEX_PROJECT, OPENROUTER_API_KEY, TOGETHERAI_API_KEY, COHERE_API_KEY, PERPLEXITYAI_API_KEY и т.д.). Полный список провайдеров и переменных окружения -- в документации LiteLLM.

Для специфичных флагов провайдеров, которые не являются env vars (например, aws_region_name, vertex_project, vertex_location), передавайте их через extra_kwargs при вызове chat_complete() напрямую -- см. секцию "Переопределение учётных данных для отдельного запроса" ниже.

Формат указания модели

Модель указывается строкой в формате провайдер:имя_модели. OpenAI является провайдером по умолчанию, поэтому для него префикс можно опустить:

# Short form (OpenAI is default)
model = "gpt-4o"

# Full form with provider prefix
model = "provider:model_name"

# Examples
model = "openai:gpt-4o"
model = "anthropic:claude-3-5-sonnet-latest"
model = "google:gemini-2.0-flash"
model = "ollama:llama3"
model = "azure:gpt-4o"

Использование LLMDescriptor

Для программного выбора провайдера можно использовать класс LLMDescriptor. Идентификатор провайдера передаётся обычной строкой -- LiteLLM сам выберет нужный бэкенд:

from eval_lib import LLMDescriptor

model = LLMDescriptor(provider="openai", model="gpt-4o")
model = LLMDescriptor(provider="anthropic", model="claude-3-5-sonnet-latest")
model = LLMDescriptor(provider="google", model="gemini-2.0-flash")

Enum Provider намеренно маленький и содержит только провайдеров с нативными (не-LiteLLM) кодовыми путями: OLLAMA, MLX, ZHIPU, CUSTOM. Всё остальное (OpenAI, Anthropic, Google, Azure, Bedrock, Vertex AI, Cohere, Together, OpenRouter, Fireworks, Perplexity, DeepInfra, Cerebras, Databricks, Watsonx, Groq, Mistral, DeepSeek, xAI/Grok, Qwen/DashScope, …) передаётся строкой и маршрутизируется через LiteLLM.

Комбинирование провайдеров в одной оценке

Вы можете использовать разных провайдеров для разных метрик в рамках одного запуска оценки. Это позволяет, например, использовать более дешёвую модель для простых метрик и более мощную -- для сложных:

from eval_lib import (
    AnswerRelevancyMetric,
    FaithfulnessMetric,
    CustomEvalMetric,
)

metrics = [
    # OpenAI for answer relevancy
    AnswerRelevancyMetric(model="gpt-4o", threshold=0.7),

    # Claude for faithfulness
    FaithfulnessMetric(model="anthropic:claude-3-5-sonnet-latest", threshold=0.7),

    # Gemini for custom evaluation
    CustomEvalMetric(
        model="google:gemini-2.0-flash",
        threshold=0.7,
        name="Quality",
        evaluation_criteria=[
            "{{actual_output}} прямо отвечает на {{input}}",
            "{{actual_output}} ясен и без филлеров",
        ],
    ),
]

Прямые вызовы LLM

Помимо использования в метриках, вы можете делать прямые вызовы к LLM через клиент библиотеки:

from eval_lib import chat_complete, get_embeddings

# Chat completion
response, cost = await chat_complete(
    llm="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
    temperature=0.7
)

# Embeddings
embeddings, cost = await get_embeddings(
    model="openai:text-embedding-3-small",
    texts=["Hello world", "How are you?"]
)

Переопределение учётных данных для отдельного запроса

chat_complete() принимает необязательные ключевые аргументы api_key, api_base и extra_kwargs, которые передаются напрямую в нижележащий вызов LiteLLM. Они перекрывают значения, которые иначе были бы взяты из переменных окружения или из LLMDescriptor, -- это рекомендуемый способ подставлять учётные данные конкретного пользователя в мульти-арендных сервисах без изменения общего os.environ.

from eval_lib import chat_complete

# Передать учётные данные на один запрос, не трогая env vars
response, cost = await chat_complete(
    llm="openai:gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
    api_key=user_api_key,          # перекрывает OPENAI_API_KEY
    api_base="https://proxy.example.com/v1",  # прокси или Azure endpoint
    extra_kwargs={"aws_region_name": "us-east-1"},  # специфичные флаги провайдера
)

Приоритет (выше -- побеждает):

  1. Явные api_key / api_base / extra_kwargs, переданные в chat_complete()
  2. Значения, зашитые в LLMDescriptor (например, api_key у Zhipu)
  3. Переменные окружения

Область поддержки:

  • Хелпер на базе LiteLLM (OpenAI, Anthropic, Google, Azure, DeepSeek, Qwen, Mistral, Groq, Grok, Zhipu и др.) принимает все три аргумента.
  • Нативные хелперы (Ollama, MLX) и CustomLLMClient игнорируют их -- учётные данные там задаются в конструкторе.
  • Ошибки аутентификации выбрасываются как LLMConfigurationError с именем провайдера в сообщении, так что в мульти-арендной среде можно показать корректную ошибку нужному пользователю.

Отслеживание стоимости

Все вызовы API возвращают стоимость в долларах США, когда она доступна. Движок оценки агрегирует стоимость по всем метрикам и тестовым кейсам:

Total evaluation cost: $0.0342

Подробнее о ценах моделей см. Стоимость моделей.