Детекция повторяющихся паттернов (Repetitive Pattern Detection)¶
Метрика Repetitive Pattern Detection обнаруживает, застрял ли агент в цикле -- повторяет ли он одни и те же фразы, вызовы инструментов или ответы, не продвигаясь вперёд.
Чем выше оценка, тем меньше повторов и тем лучше. Шкала вердиктов инвертирована по сравнению с другими метриками, чтобы сохранить семантику "больше -- лучше".
Как это работает¶
- Единый вердикт -- один вызов LLM анализирует весь диалог и возвращает
{verdict, repeated_segments, reason} - Саммари -- краткое заключение о степени повторяемости
Вердикт отображается в оценку через инвертированные веса:
| Вердикт | Оценка | Смысл |
|---|---|---|
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в вызовах инструментов часто проявляется и как цикл в этой метрике.