Конфигурация¶
В этом разделе подробно описаны все аспекты конфигурации Eval AI Library: от переменных окружения для аутентификации до тонкой настройки метрик и параметров оценки. Правильная конфигурация позволяет адаптировать библиотеку под ваши конкретные задачи и требования.
Переменные окружения¶
Eval AI Library использует переменные окружения для аутентификации с LLM-провайдерами. Это стандартный и безопасный способ управления секретами, совместимый с CI/CD-системами, контейнерами Docker и облачными платформами. Установите переменные для тех провайдеров, которые вы планируете использовать.
LLM-провайдеры¶
В таблице ниже перечислены все поддерживаемые переменные окружения. Вам нужно установить переменные только для тех провайдеров, которыми вы пользуетесь. Библиотека проверяет наличие ключа в момент создания метрики и выдаёт понятное сообщение об ошибке, если ключ не установлен.
| Переменная | Провайдер | Обязательность |
|---|---|---|
OPENAI_API_KEY | OpenAI | Для моделей OpenAI |
ANTHROPIC_API_KEY | Anthropic | Для моделей Claude |
GOOGLE_API_KEY | Для моделей Gemini | |
AZURE_OPENAI_API_KEY | Azure OpenAI | Для деплоев Azure |
AZURE_OPENAI_ENDPOINT | Azure OpenAI | Для деплоев Azure |
AZURE_OPENAI_DEPLOYMENT | Azure OpenAI | Для деплоев Azure |
OLLAMA_API_BASE_URL | Ollama | Опционально (по умолчанию: http://localhost:11434/v1) |
OLLAMA_API_KEY | Ollama | Опционально |
Безопасность API-ключей
Никогда не храните API-ключи в коде или в системе контроля версий. Используйте переменные окружения, .env файлы (добавленные в .gitignore) или менеджеры секретов вашей платформы (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault и т.д.).
Использование .env файлов¶
Для удобства локальной разработки можно хранить API-ключи в файле .env и загружать их с помощью библиотеки python-dotenv. Это позволяет не экспортировать переменные вручную при каждом запуске терминала.
Создайте файл .env в корне вашего проекта:
Загрузите переменные в начале вашего скрипта перед импортом Eval AI Library:
from dotenv import load_dotenv
load_dotenv()
from eval_lib import evaluate, AnswerRelevancyMetric
# Теперь API-ключи доступны через os.environ
Совет
Обязательно добавьте .env в ваш .gitignore, чтобы случайно не зафиксировать API-ключи в репозитории. Также рекомендуется создать файл .env.example с пустыми значениями в качестве шаблона для других разработчиков.
Если вы используете несколько окружений (разработка, тестирование, продакшен), можно создать отдельные файлы .env.development, .env.testing, .env.production и загружать нужный:
from dotenv import load_dotenv
import os
env = os.getenv("APP_ENV", "development")
load_dotenv(f".env.{env}")
Спецификация моделей¶
Модели указываются в формате провайдер:имя_модели. Этот простой формат позволяет переключаться между провайдерами без изменения остального кода. Библиотека автоматически определяет провайдера по префиксу и использует соответствующий API-клиент для отправки запросов.
# OpenAI (провайдер по умолчанию, если префикс не указан)
model = "gpt-4o"
model = "openai:gpt-4o"
# Anthropic
model = "anthropic:claude-3-5-sonnet-latest"
# Google Gemini
model = "google:gemini-2.0-flash"
# Ollama (локальная модель)
model = "ollama:llama3"
# Azure OpenAI
model = "azure:gpt-4o"
Если префикс провайдера не указан, по умолчанию используется OpenAI. Таким образом, "gpt-4o" и "openai:gpt-4o" эквивалентны.
Явная конфигурация через LLMDescriptor¶
Для более явного и типобезопасного указания модели можно использовать класс LLMDescriptor с перечислением Provider. Это особенно полезно в сценариях, где модель определяется динамически на основе конфигурации:
from eval_lib import LLMDescriptor, Provider
model = LLMDescriptor(provider=Provider.OPENAI, model="gpt-4o")
model = LLMDescriptor(provider=Provider.ANTHROPIC, model="claude-3-5-sonnet-latest")
LLMDescriptor обеспечивает валидацию провайдера на этапе создания объекта и предоставляет автодополнение в IDE. Это предпочтительный вариант для больших проектов, где важна явность и предсказуемость.
Выбор модели-судьи¶
Качество оценки напрямую зависит от выбранной модели-судьи. Более мощные модели (GPT-4o, Claude 3.5 Sonnet) обеспечивают более точные и стабильные оценки, но стоят дороже. Для экономии на этапе разработки можно использовать бюджетные модели, а для финальной оценки -- полноразмерные.
| Модель | Качество оценки | Стоимость | Рекомендация |
|---|---|---|---|
gpt-4o | Высокое | Среднее | Оптимальный выбор для большинства задач |
gpt-4o-mini | Хорошее | Низкое | Разработка и тестирование |
anthropic:claude-3-5-sonnet-latest | Высокое | Среднее | Альтернатива GPT-4o |
google:gemini-2.0-flash | Хорошее | Низкое | Бюджетный вариант с хорошим качеством |
ollama:llama3 | Среднее | Бесплатно | Локальная разработка без API-ключей |
Конфигурация метрик¶
Каждая метрика в Eval AI Library принимает набор общих параметров, определяющих её поведение. Эти параметры позволяют настроить модель-судью, порог прохождения и уровень детализации вывода.
Общие параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
model | str | -- | LLM-модель, используемая для оценки. Указывается в формате провайдер:имя_модели. Обязателен для метрик, использующих LLM-судью. |
threshold | float | зависит от метрики | Минимальный score для прохождения теста (от 0.0 до 1.0). Если score метрики ниже порога, тест-кейс считается непройденным. |
verbose | bool | False | Включение подробного логирования. При True выводит детали промптов, ответов модели и промежуточных вычислений. Полезно для отладки. |
Пороговые значения по умолчанию¶
В таблице ниже указаны пороговые значения по умолчанию для каждой метрики. Эти значения подобраны на основе практического опыта и обеспечивают разумный баланс между строгостью и допустимостью. Вы можете переопределить их при создании метрики в зависимости от ваших требований к качеству.
| Метрика | Порог по умолчанию | Описание |
|---|---|---|
| Answer Relevancy | 0.6 | Релевантность ответа вопросу |
| Answer Precision | 0.6 | Точность ответа относительно эталона |
| Faithfulness | 0.7 | Верность ответа контексту (защита от галлюцинаций) |
| Contextual Relevancy | 0.6 | Релевантность извлечённого контекста вопросу |
| Contextual Precision | 0.7 | Точность ранжирования контекстных фрагментов |
| Contextual Recall | 0.7 | Полнота покрытия эталонного ответа контекстом |
| Bias Detection | 0.8 | Обнаружение предвзятости (повышенный порог для строгости) |
| Toxicity Detection | 0.7 | Обнаружение токсичного контента |
| Tool Correctness | 0.5 | Корректность выбора инструментов агентом |
| Task Success Rate | 0.7 | Процент успешного выполнения задач агентом |
| Role Adherence | 0.7 | Соблюдение заданной роли агентом |
| Knowledge Retention | 0.7 | Сохранение знаний между ходами диалога |
| Tool Error Detection | 0.7 | Обнаружение ошибок в работе инструментов |
| Все метрики безопасности | 0.7 | Единый порог для всех метрик безопасности |
Рекомендации по настройке порогов
Для критичных продакшен-систем рекомендуется повысить пороги (0.8-0.9) для метрик Faithfulness и безопасности. Для экспериментальных и исследовательских задач пороги можно понизить (0.4-0.5), чтобы сосредоточиться на общих тенденциях.
Параметр температуры¶
Метрики, использующие агрегацию вердиктов, принимают параметр temperature, который контролирует строгость скоринга. Температура определяет, как именно множество отдельных вердиктов (бинарных оценок отдельных аспектов) объединяются в итоговый score метрики.
# Строгая оценка — сильно штрафует за плохие вердикты
# Подходит для систем, критичных к безопасности
metric = AnswerRelevancyMetric(model="gpt-4o", threshold=0.7, temperature=0.1)
# Сбалансированная оценка (по умолчанию для большинства метрик)
# Подходит для общей оценки качества
metric = AnswerRelevancyMetric(model="gpt-4o", threshold=0.7, temperature=0.5)
# Мягкая оценка — снисходительна к слабым вердиктам
# Подходит для креативных задач и генерации контента
metric = AnswerRelevancyMetric(model="gpt-4o", threshold=0.7, temperature=1.0)
При температуре 0.1 даже одно низкое значение вердикта значительно снижает итоговый score, что делает оценку максимально строгой. При температуре 1.0 итоговый score ближе к среднему арифметическому, что делает оценку более мягкой. Подробнее о математике агрегации читайте в разделе Агрегация оценок.
Параметры функции evaluate()¶
Функция evaluate() является основной точкой входа для запуска оценки. Она принимает список тест-кейсов и метрик, а также дополнительные параметры для управления процессом оценки. Функция является асинхронной (корутиной), поэтому её нужно вызывать через asyncio.run() или из другой асинхронной функции.
results = await evaluate(
test_cases=test_cases, # List[EvalTestCase]
metrics=metrics, # List[MetricPattern]
verbose=True, # Показывать прогресс в консоли
show_dashboard=False, # Открыть дашборд после оценки
session_name="my-run" # Имя сессии для дашборда
)
Подробное описание параметров¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
test_cases | List[EvalTestCase] | обязательный | Список тест-кейсов для оценки. Каждый тест-кейс должен содержать как минимум поля input и actual_output. Остальные поля зависят от выбранных метрик. |
metrics | List[MetricPattern] | обязательный | Список метрик, которые будут применены к каждому тест-кейсу. Все метрики выполняются параллельно для каждого тест-кейса. |
verbose | bool | True | Управляет выводом прогресса и результатов в консоль. При True отображает прогресс-бар, промежуточные результаты и итоговую таблицу. При False выполняет оценку без вывода. |
show_dashboard | bool | False | Автоматически открывает интерактивный дашборд в браузере после завершения оценки. Дашборд позволяет визуально анализировать результаты, фильтровать и сравнивать метрики. |
session_name | str | None | Имя сессии для идентификации запуска оценки в дашборде и системе кэширования. Если не указано, генерируется автоматически на основе временной метки. |
Возвращаемое значение¶
Функция evaluate() возвращает список кортежей, где каждый кортеж содержит метрику и список результатов для всех тест-кейсов. Структура результата позволяет гибко обрабатывать данные как по метрикам, так и по тест-кейсам.
results = asyncio.run(evaluate(test_cases, metrics))
for metric, test_results in results:
print(f"Метрика: {metric.__class__.__name__}")
for result in test_results:
print(f" Input: {result.input}")
print(f" Score: {result.score}")
print(f" Success: {result.success}")
Схемы тест-кейсов¶
Eval AI Library предоставляет два типа тест-кейсов: EvalTestCase для единичных запросов и ConversationalEvalTestCase для мультитёрновых диалогов. Правильное заполнение полей тест-кейса критически важно для корректной работы метрик.
EvalTestCase¶
EvalTestCase -- это основной тип тест-кейса, используемый для оценки одиночных пар "вопрос-ответ". Он содержит все данные, необходимые для работы RAG-метрик, метрик агентов и метрик безопасности.
from eval_lib import EvalTestCase
test_case = EvalTestCase(
input="User's question", # Обязательное. Входной запрос пользователя.
actual_output="AI's response", # Обязательное. Фактический ответ AI-системы.
expected_output="Reference answer", # Опционально. Эталонный ответ для сравнения.
retrieval_context=["context chunk 1", ...], # Опционально. Контекст из RAG-пайплайна.
tools_called=["tool1", "tool2"], # Опционально. Вызванные инструменты (для агентов).
expected_tools=["tool1", "tool2"], # Опционально. Ожидаемые инструменты (для агентов).
reasoning="Chain of thought", # Опционально. Цепочка рассуждений модели.
name="Test case label", # Опционально. Метка для идентификации.
)
Описание полей:
input(обязательное) -- исходный запрос пользователя. Используется всеми метриками как входные данные для оценки.actual_output(обязательное) -- реальный ответ вашей AI-системы. Именно этот ответ оценивается метриками.expected_output(опциональное) -- эталонный (референсный) ответ. Используется метриками Answer Precision и Contextual Recall для сравнения с фактическим ответом. Не требуется для метрик Faithfulness и AnswerRelevancy.retrieval_context(опциональное) -- список строк с фрагментами контекста, извлечёнными вашей RAG-системой. Необходимо для метрик Faithfulness, Contextual Relevancy, Contextual Precision и Contextual Recall.tools_called(опциональное) -- список инструментов, фактически вызванных агентом. Используется метрикой Tool Correctness.expected_tools(опциональное) -- список инструментов, которые должны были быть вызваны. Используется совместно сtools_calledдля оценки корректности выбора инструментов.reasoning(опциональное) -- цепочка рассуждений модели (chain of thought). Может использоваться пользовательскими метриками и G-Eval.name(опциональное) -- человекочитаемая метка для идентификации тест-кейса в отчётах и дашборде. Если не указана, используется начало поляinput.
ConversationalEvalTestCase¶
ConversationalEvalTestCase используется для оценки многоходовых диалогов. Он содержит описание роли чат-бота и последовательность ходов, каждый из которых является стандартным EvalTestCase.
from eval_lib import ConversationalEvalTestCase, EvalTestCase
conversation = ConversationalEvalTestCase(
chatbot_role="System prompt / role description", # Опционально. Системный промпт.
name="Conversation label", # Опционально. Метка диалога.
turns=[
EvalTestCase(input="...", actual_output="..."),
EvalTestCase(input="...", actual_output="..."),
]
)
Описание полей:
chatbot_role(опциональное) -- описание роли или системный промпт чат-бота. Используется метриками Role Adherence и Task Success Rate для оценки соответствия поведения агента заданной роли.name(опциональное) -- метка для идентификации диалога в отчётах.turns(обязательное) -- список ходов диалога. Каждый ход является объектомEvalTestCaseс как минимум полямиinputиactual_output. Ходы обрабатываются последовательно, при этом модель-судья учитывает весь предшествующий контекст беседы.
Какие поля нужны для каждой метрики?
Разные метрики требуют разных полей тест-кейса. Например, метрике Faithfulness необходимо поле retrieval_context, а метрике Tool Correctness -- поля tools_called и expected_tools. Подробные требования к полям указаны в документации каждой конкретной метрики.
Примеры заполнения для различных сценариев¶
RAG-оценка (Faithfulness + Answer Relevancy):
test_case = EvalTestCase(
input="Какова столица Франции?",
actual_output="Столица Франции — Париж.",
retrieval_context=[
"Париж — столица и крупнейший город Франции.",
"Франция — государство в Западной Европе."
]
)
Оценка агента (Tool Correctness):
test_case = EvalTestCase(
input="Переведи 100 долларов в евро",
actual_output="100 USD = 92.50 EUR по текущему курсу.",
tools_called=["currency_converter"],
expected_tools=["currency_converter"],
)
Тестирование безопасности (Prompt Injection Detection):