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

Естественность диалога (Conversational Flow Rate)

Метрика Conversational Flow Rate оценивает, насколько естественным и связным получается многоходовый диалог. Она штрафует за лишние уточнения, повторные вопросы, игнорирование сигналов пользователя и уходы в сторону от темы.

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

Один целостный (holistic) вызов LLM оценивает диалог как единое целое по few-shot рубрике и возвращает один вердикт по 5-уровневой шкале (fully/mostly/partial/minor/none).

Flow рассматривается как свойство всей последовательности, а не как среднее по ходам. Один сильно сломанный ход, который пускает под откос остальной разговор, опускает вердикт, даже если другие ходы в порядке. Поздние ходы весят больше ранних, если они расходятся, -- важнее всего итоговое состояние разговора.

Рубрика явно учитывает, насколько ассистент:

  • напрямую отвечает на сигналы пользователя,
  • избегает лишних уточнений,
  • сохраняет связность с предыдущими ходами,
  • и не уходит в неуместные отступления.

Вердикт отображается в оценку:

Вердикт Оценка
fully 1.0
mostly 0.9
partial 0.7
minor 0.3
none 0.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 Цветной вывод в консоль

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

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

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

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

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

metric = ConversationalFlowRateMetric(model="gpt-4o", threshold=0.7)

conversation = ConversationalEvalTestCase(
    turns=[
        EvalTestCase(
            input="Мне нужно сбросить пароль",
            actual_output="Помогу. Подтвердите, пожалуйста, email, привязанный к аккаунту.",
        ),
        EvalTestCase(
            input="user@example.com",
            actual_output="Ссылка для сброса пароля отправлена на user@example.com. Проверьте почту.",
        ),
    ]
)

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

Стоимость

1 вызов LLM API за одну оценку.

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

  • Используйте в паре с Repetitive Pattern Detection: циклы тоже ломают flow, но по другим причинам, и эти две метрики покрывают разные типы сбоев.
  • Смотрите evaluation_log["key_issues"] -- вместе с вердиктом возвращается список главных проблем, найденных LLM. Обычно фикс агента стоит начинать именно с них.
  • Поскольку вердикт целостный, одного сильно сломанного хода достаточно, чтобы опустить оценку до none. Используйте эту метрику, когда хотите ловить катастрофические сбои flow, а не измерять средний уровень качества ходов.