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

Успешность задач (Task Success Rate)

Метрика Task Success Rate оценивает, успешно ли AI-ассистент помог пользователю достичь его цели. Работает как с одноходовыми, так и с многоходовыми диалогами, автоматически определяя цель пользователя и генерируя критерии успеха.

Как это работает

Оценка проходит в четыре этапа:

  1. Определение цели (Goal Inference) -- анализирует диалог, чтобы понять, чего хотел пользователь (пропускается, если передан task_description)
  2. Генерация критериев (Criteria Generation) -- формирует конкретные критерии успеха (пропускается, если передан success_criteria)
  3. Вынесение вердиктов (Verdict Generation) -- оценивает каждый критерий по 5-уровневой шкале
  4. Агрегация оценок (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 -- более снисходительно