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

Достижение цели (Goal Achievement Rate)

Метрика Goal Achievement Rate оценивает, действительно ли пользователь получил то, что хотел от разговора. В отличие от Task Success Rate, которая проверяет формальный чек-лист задачи, эта метрика смотрит на результат через призму удовлетворённости -- ушёл ли пользователь с тем, за чем пришёл?

Метрика анализирует положительные и отрицательные сигналы (благодарность, фрустрация, повторные уточнения, неудовлетворённые запросы) и выносит вердикт об исходе разговора.

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

  1. Определение цели -- если передан user_goal, используется он, иначе LLM извлекает желаемый результат из диалога
  2. Извлечение сигналов -- из диалога извлекаются positive_signals, negative_signals и unmet_requests
  3. Вердикт об исходе -- оценка результата относительно цели по 5-уровневой шкале (fully/mostly/partial/minor/none)
  4. Саммари -- краткое итоговое заключение (1-2 предложения)

Итоговая оценка -- это вес вердикта с штрафом 0.1 × количество отрицательных сигналов, но не ниже 0.

Параметры

Параметр Тип По умолчанию Описание
model str обязательный LLM модель: "gpt-4o", "anthropic:claude-3-5-sonnet-latest", "google:gemini-2.0-flash", "ollama:llama3" или CustomLLMClient
threshold float 0.7 Минимальная оценка для прохождения
verbose bool False Цветной вывод в консоль
user_goal str \| None None Желаемый результат, заданный разработчиком. Если указан, пропускается LLM-этап определения цели.

Обязательные поля

Работает только с ConversationalEvalTestCase.

Поле Обязательно
turns (каждый ход с input и actual_output) Да

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

from eval_lib import (
    GoalAchievementRateMetric,
    ConversationalEvalTestCase,
    EvalTestCase,
    evaluate_conversations,
)
import asyncio

metric = GoalAchievementRateMetric(
    model="gpt-4o",
    threshold=0.7,
    user_goal="Получить рабочее решение ошибки импорта в Python",
)

conversation = ConversationalEvalTestCase(
    turns=[
        EvalTestCase(
            input="Мой скрипт падает с ModuleNotFoundError: requests",
            actual_output="Запустите `pip install requests` и попробуйте снова.",
        ),
        EvalTestCase(
            input="Сработало, спасибо!",
            actual_output="Рад был помочь.",
        ),
    ]
)

results = asyncio.run(evaluate_conversations([conversation], [metric]))

Стоимость

  • С переданным user_goal: 3 вызова LLM API (сигналы, вердикт, саммари).
  • Без user_goal: 4 вызова LLM API (первый вызов определяет цель).

Рекомендации

  • Используйте в паре с Task Success Rate, чтобы различать "задача формально выполнена" и "пользователь действительно получил желаемое".
  • Особенно полезна для диалогов в поддержке, где сигналы удовлетворённости играют ключевую роль.
  • Штраф за отрицательные сигналы (−0.1 за каждый) означает, что два маркера фрустрации могут опустить вердикт mostly (0.9) ниже стандартного порога 0.7.