Достижение цели (Goal Achievement Rate)¶
Метрика Goal Achievement Rate оценивает, действительно ли пользователь получил то, что хотел от разговора. В отличие от Task Success Rate, которая проверяет формальный чек-лист задачи, эта метрика смотрит на результат через призму удовлетворённости -- ушёл ли пользователь с тем, за чем пришёл?
Метрика анализирует положительные и отрицательные сигналы (благодарность, фрустрация, повторные уточнения, неудовлетворённые запросы) и выносит вердикт об исходе разговора.
Как это работает¶
- Определение цели -- если передан
user_goal, используется он, иначе LLM извлекает желаемый результат из диалога - Извлечение сигналов -- из диалога извлекаются
positive_signals,negative_signalsиunmet_requests - Вердикт об исходе -- оценка результата относительно цели по 5-уровневой шкале (
fully/mostly/partial/minor/none) - Саммари -- краткое итоговое заключение (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.