Успешность задач (Task Success Rate)¶
Метрика Task Success Rate оценивает, успешно ли AI-ассистент помог пользователю достичь его цели. Работает как с одноходовыми, так и с многоходовыми диалогами, автоматически определяя цель пользователя и генерируя критерии успеха.
Как это работает¶
Оценка проходит в четыре этапа:
- Определение цели (Goal Inference) -- анализирует диалог, чтобы понять, чего хотел пользователь (пропускается, если передан
task_description) - Генерация критериев (Criteria Generation) -- формирует конкретные критерии успеха (пропускается, если передан
success_criteria) - Вынесение вердиктов (Verdict Generation) -- оценивает каждый критерий по 5-уровневой шкале
- Агрегация оценок (Score Aggregation) -- объединяет вердикты с помощью температурно-управляемого softmax
Этот многоступенчатый процесс обеспечивает более объективную и детальную оценку, чем простое бинарное "выполнено/не выполнено".
Если вы передаёте одновременно task_description и success_criteria, метрика делает всего 2 вызова LLM вместо 4, а понятие "успеха" становится полностью детерминированным -- вы сами его задаёте.
Параметры¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
model | str | обязательный | Любая модель: "gpt-4o", "anthropic:claude-3-5-sonnet-latest", "google:gemini-2.0-flash", "ollama:llama3" или CustomLLMClient |
threshold | float | 0.7 | Минимальная оценка для прохождения |
temperature | float | 0.5 | Строгость агрегации (меньше = строже) |
verbose | bool | False | Вывод промптов и ответов LLM для отладки |
task_description | str \| None | None | Описание задачи, заданное разработчиком. Если указано, пропускается LLM-этап определения цели и это значение используется как цель пользователя. |
success_criteria | list[str] \| None | None | Явный список критериев успеха. Если указан, пропускается LLM-этап генерации критериев. |
Обязательные поля¶
| Поле | Обязательно |
|---|---|
input | Да |
actual_output | Да |
Использование¶
Одноходовой сценарий¶
В простейшем случае вы оцениваете один обмен репликами между пользователем и ассистентом:
from eval_lib import TaskSuccessRateMetric, EvalTestCase, evaluate
import asyncio
test_case = EvalTestCase(
input="Help me write a regex to match email addresses.",
actual_output="Here's a regex for email matching: `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}`. This handles most standard email formats."
)
metric = TaskSuccessRateMetric(model="gpt-4o", threshold=0.7)
results = asyncio.run(evaluate([test_case], [metric]))
Многоходовой (диалоговый) сценарий¶
Для оценки многоходовых диалогов используется ConversationalEvalTestCase. Метрика учитывает всю траекторию диалога, включая то, как ассистент уточнял требования и постепенно выполнял задачу:
from eval_lib import (
ConversationalEvalTestCase,
EvalTestCase,
evaluate_conversations,
TaskSuccessRateMetric,
)
conversation = ConversationalEvalTestCase(
turns=[
EvalTestCase(
input="I need to set up a CI/CD pipeline for my Node.js project.",
actual_output="I can help with that! Are you using GitHub Actions, GitLab CI, or another platform?"
),
EvalTestCase(
input="GitHub Actions.",
actual_output="Here's a workflow file for your Node.js project: [provides complete .github/workflows/ci.yml with test, lint, and deploy steps]"
),
EvalTestCase(
input="Can you add caching for node_modules?",
actual_output="Sure! Add this caching step: [provides cache action configuration with hash-based key]"
),
]
)
metric = TaskSuccessRateMetric(model="gpt-4o", threshold=0.7)
results = asyncio.run(evaluate_conversations([conversation], [metric]))
Собственное описание задачи и критериев¶
Если вы заранее знаете, в чём состоит задача и что считать успехом, передайте их напрямую -- это пропустит LLM-этапы определения цели и генерации критериев. Такая оценка дешевле, быстрее и детерминированнее:
from eval_lib import TaskSuccessRateMetric, ConversationalEvalTestCase, EvalTestCase, evaluate_conversations
import asyncio
metric = TaskSuccessRateMetric(
model="gpt-4o",
threshold=0.7,
task_description="Забронировать рейс в Париж туда-обратно на следующий понедельник",
success_criteria=[
"Ассистент показал доступные рейсы с ценами",
"Ассистент подтвердил бронирование с датами",
],
)
conversation = ConversationalEvalTestCase(
turns=[
EvalTestCase(
input="Забронируй мне рейс в Париж на следующий понедельник",
actual_output="Вот три варианта: [список рейсов с ценами]",
),
EvalTestCase(
input="Беру тот, что в 9 утра",
actual_output="Забронировано. Номер подтверждения #AB123, вылет в следующий понедельник в 9:00.",
),
]
)
results = asyncio.run(evaluate_conversations([conversation], [metric]))
В evaluation_log появятся поля task_description_source и success_criteria_source ("user_provided" или "llm_inferred"), чтобы было видно, какой именно путь был выбран.
Стоимость¶
- По умолчанию: 4 вызова LLM API за одну оценку (определение цели, генерация критериев, вердикты, саммари).
- Только с
task_description: 3 вызова LLM (определение цели пропущено). - С
task_descriptionиsuccess_criteria: 2 вызова LLM (только вердикты и саммари).
Рекомендации¶
- Используйте совместно с Tool Correctness для агентов, которые решают задачи с помощью инструментов -- это позволит оценить и результат, и процесс
- Для многоходовых диалогов метрика учитывает всю траекторию разговора, а не только последний ход
- Установите более низкий порог (0.5) для сложных, открытых задач, где идеальное выполнение маловероятно
- Параметр
temperatureконтролирует строгость агрегации: значение 0.1 сильно штрафует за невыполненные критерии, а 1.0 -- более снисходительно