Кастомные метрики (Custom Metrics)¶
Custom Evaluation Metric позволяет определять собственные критерии оценки без написания кода метрики. Метрика использует LLM для генерации вердиктов на основе ваших критериев с тем же механизмом temperature-controlled агрегации, что и встроенные метрики.
Кастомные метрики идеально подходят для случаев, когда встроенные метрики не покрывают ваши специфические требования. Например, вы можете оценивать тон ответа, соответствие стилю компании, техническую глубину объяснения или качество обслуживания клиентов.
Как это работает¶
Алгоритм работает в три этапа:
- Обработка критериев (Criteria Processing) -- если вы предоставляете высокоуровневое описание, LLM автоматически генерирует из него конкретные шаги оценки. Это позволяет задавать критерии на естественном языке без необходимости продумывать каждый шаг.
- Генерация вердиктов (Verdict Generation) -- оценивает ответ по каждому критерию, используя 5-уровневую шкалу вердиктов.
- Агрегация оценок (Score Aggregation) -- объединяет вердикты с помощью temperature-controlled softmax.
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
model | str | обязательный | Любая модель: "gpt-4o", "anthropic:claude-3-5-sonnet-latest", "google:gemini-2.0-flash", "ollama:llama3" или CustomLLMClient |
threshold | float | обязательный | Минимальный балл для прохождения теста |
name | str | обязательный | Название метрики |
criteria | str | обязательный | Что оценивать (высокоуровневое описание) |
evaluation_steps | list[str] | None | Конкретные шаги оценки (автогенерируются, если не указаны) |
temperature | float | 0.8 | Строгость агрегации |
Ключевое решение при создании кастомной метрики -- предоставлять evaluation_steps самостоятельно или позволить LLM их сгенерировать. Автогенерация подходит для прототипирования; для продакшна рекомендуется задавать шаги явно, чтобы гарантировать стабильность оценки.
Использование¶
Простой вариант -- автоматическая генерация шагов¶
from eval_lib import CustomEvalMetric, EvalTestCase, evaluate
import asyncio
metric = CustomEvalMetric(
model="gpt-4o",
threshold=0.7,
name="TechnicalAccuracy",
criteria="Evaluate the technical accuracy and depth of the AI's explanation of programming concepts."
)
test_case = EvalTestCase(
input="Explain how garbage collection works in Python.",
actual_output="Python uses reference counting as its primary garbage collection mechanism. Each object maintains a count of references pointing to it. When the count drops to zero, the memory is freed. Python also has a generational garbage collector to handle circular references."
)
results = asyncio.run(evaluate([test_case], [metric]))
В этом варианте LLM самостоятельно разбивает высокоуровневый критерий "техническая точность и глубина объяснения" на конкретные шаги оценки. Это удобно для быстрого прототипирования, но шаги могут варьироваться между запусками.
Продвинутый вариант -- явные шаги оценки¶
metric = CustomEvalMetric(
model="gpt-4o",
threshold=0.7,
name="CustomerServiceQuality",
criteria="Evaluate the quality of customer service responses",
evaluation_steps=[
"Check if the response acknowledges the customer's issue",
"Verify that a solution or next step is provided",
"Assess the tone for empathy and professionalism",
"Check if the response is clear and free of jargon",
"Verify the response is concise but complete"
],
temperature=0.5
)
Здесь шаги оценки заданы явно. Это даёт полный контроль над тем, что именно оценивается, и обеспечивает стабильность результатов между запусками. Рекомендуется для продакшн-систем.
Примеры для разных доменов¶
# Medical Information Quality
medical_metric = CustomEvalMetric(
model="gpt-4o",
threshold=0.8,
name="MedicalInfoQuality",
criteria="Evaluate the accuracy, safety, and appropriateness of medical information. Check for disclaimers about consulting healthcare professionals.",
temperature=0.2 # Strict for safety
)
# Code Review Quality
code_review_metric = CustomEvalMetric(
model="gpt-4o",
threshold=0.7,
name="CodeReviewQuality",
criteria="Evaluate the quality of code review feedback: completeness, actionability, and identification of potential bugs or improvements."
)
# Educational Content
education_metric = CustomEvalMetric(
model="anthropic:claude-3-5-sonnet-latest",
threshold=0.7,
name="EducationalClarity",
criteria="Evaluate educational content for clarity, progressive complexity, use of examples, and engagement."
)
Обратите внимание на использование разных параметров для разных доменов:
- Медицина -- низкая температура (0.2) для максимальной строгости, высокий порог (0.8). Любое неточное медицинское утверждение должно быть выявлено.
- Код-ревью -- стандартные параметры, фокус на практической полезности обратной связи.
- Образование -- стандартный порог, фокус на ясности и вовлечённости. Обратите внимание на использование другой модели (Claude).
Оценка¶
Стандартная 5-уровневая система вердиктов применяется к каждому критерию оценки:
| Вердикт | Вес |
|---|---|
fully | 1.0 |
mostly | 0.9 |
partial | 0.7 |
minor | 0.3 |
none | 0.0 |
Стоимость¶
1-2 вызова LLM API на одну оценку (1, если шаги заданы явно; 2, если шаги автогенерируются).
Практические советы¶
- Начните с автогенерации шагов, чтобы понять, какие критерии LLM считает важными. Затем скорректируйте и зафиксируйте шаги для продакшна.
- Пишите конкретные критерии. "Оцените качество ответа" -- слишком абстрактно. "Оцените техническую точность объяснения алгоритмов, наличие примеров кода и правильность терминологии" -- гораздо лучше.
- Используйте низкую температуру (0.2-0.3) для критичных оценок (безопасность, медицина, юриспруденция).
- Тестируйте метрику на эталонных примерах, прежде чем запускать на реальных данных. Убедитесь, что она выдаёт ожидаемые оценки для заведомо хороших и плохих ответов.
- Комбинируйте кастомные метрики со встроенными. Например, используйте Faithfulness для проверки фактов, а кастомную метрику -- для оценки стиля и тона.