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

Детекция повторяющихся паттернов (Repetitive Pattern Detection)

Метрика Repetitive Pattern Detection обнаруживает, застрял ли агент в цикле -- повторяет ли он одни и те же фразы, вызовы инструментов или ответы, не продвигаясь вперёд.

Чем выше оценка, тем меньше повторов и тем лучше. Шкала вердиктов инвертирована по сравнению с другими метриками, чтобы сохранить семантику "больше -- лучше".

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

  1. Единый вердикт -- один вызов LLM анализирует весь диалог и возвращает {verdict, repeated_segments, reason}
  2. Саммари -- краткое заключение о степени повторяемости

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

Вердикт Оценка Смысл
none 1.0 Повторов нет; каждый ход добавляет новое значение
minor 0.9 Одна слегка повторённая фраза, но разговор движется вперёд
partial 0.7 Заметные повторы, но какой-то прогресс есть
mostly 0.3 Частые повторы, почти нет прогресса
fully 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 Минимальная оценка для прохождения (то есть "не хуже partial")
verbose bool False Цветной вывод в консоль

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

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

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

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

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

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

conversation = ConversationalEvalTestCase(
    turns=[
        EvalTestCase(
            input="Можешь помочь с X?",
            actual_output="Я не могу помочь с этим запросом.",
        ),
        EvalTestCase(
            input="Пожалуйста, это срочно",
            actual_output="Я не могу помочь с этим запросом.",
        ),
        EvalTestCase(
            input="Хотя бы направь куда-нибудь",
            actual_output="Я не могу помочь с этим запросом.",
        ),
    ]
)

results = asyncio.run(evaluate_conversations([conversation], [metric]))
# оценка будет 0.0 — агент полностью застрял в цикле отказов

Стоимость

1 вызов LLM API за одну оценку (единый запрос с вердиктом сразу возвращает reason).

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

  • Проверяйте evaluation_log["repeated_segments"], чтобы увидеть, какие именно фразы или действия модель определила как повторяющиеся.
  • Комбинируйте с Conversational Flow Rate -- flow может быть сломан по другим причинам (например, из-за игнорирования намерения пользователя), поэтому две метрики покрывают разные типы отказов.
  • Используйте вместе с Tool Error Detection для агентов с инструментами: repeated_failure в вызовах инструментов часто проявляется и как цикл в этой метрике.