Как вы детектируете Distribution Collapse у агента?

Краткий тезис

Distribution Collapse — это состояние, при котором агент (LLM-агент, multi‑step RAG) перестаёт генерировать разнообразные ответы и начинает повторять одни и те же паттерны, теряя способность адаптироваться к новым запросам. Детекция строится на измерении энтропии выходов, внутрисессионного разнообразия и частоты повторений (repeat rate). Если энтропия падает более чем на 30% от baseline — система должна выдавать алерт и запускать механизмы коррекции (например, сброс контекста, увеличение temperature, переключение стратегии поиска).


1. Термин: Distribution Collapse (коллапс распределения)

Distribution Collapse — это явление, когда распределение выходных последовательностей агента со временем сжимается в узкую область. В контексте LLM-агентов это проявляется как:

  • Однотипные формулировки ответов на разные запросы.
  • Циклическое повторение одних и тех же действий (например, агент застревает в одном и том же поисковом запросе).
  • Потеря способности к exploration (исследованию) в пользу exploitation (эксплуатации известного паттерна).

Почему это критично для Agentic RAG?
Агент, который должен динамически выбирать инструменты, переформулировать запросы и адаптироваться к контексту, при коллапсе перестаёт выполнять свою основную функцию — давать релевантные и разнообразные ответы. Это ведёт к ухудшению пользовательского опыта и снижению качества системы.


2. Почему Distribution Collapse возникает у агентов?

Основные причины:

ПричинаОписание
Слишком низкая температура (temperature)При temperature → 0 модель всегда выбирает наиболее вероятный токен, что приводит к детерминированным, повторяющимся выходам.
Переобучение на узком доменеЕсли fine‑tuning проводился на однотипных данных, агент теряет способность к обобщению.
Контекстное загрязнениеВ длинных сессиях агент «зацикливается» на предыдущих своих ответах, подкрепляя собственные паттерны.
Отсутствие exploration в RLЕсли агент обучается с подкреплением без достаточного exploration, он быстро сходится к субоптимальной политике.

В Agentic RAG коллапс особенно опасен, потому что агент может начать игнорировать новые документы, полагаясь на «заученные» шаблоны.


3. Метрика 1: Энтропия выходов (Entropy measurement)

Энтропия — мера неопределённости распределения. Для последовательности токенов можно считать энтропию на уровне лог‑вероятностей модели или на уровне частот n‑грамм.

Формула для эмпирической энтропии выходов

H = - Σ p(x) * log₂ p(x)

где p(x) — частота появления конкретного ответа (или n‑граммы) среди всех ответов агента за окно наблюдения.

Как измерять на практике

  • Собираем все ответы агента за последние N запросов (например, 100).
  • Разбиваем ответы на токены или n‑граммы (обычно unigrams или bigrams).
  • Считаем частоту каждой уникальной n‑граммы.
  • Вычисляем энтропию по формуле.

Интерпретация

  • Высокая энтропия → ответы разнообразны.
  • Низкая энтропия → ответы однообразны, возможен коллапс.

Baseline энтропия на старте работы агента (первые 50–100 запросов) или на валидационном наборе разнообразных запросов.


4. Метрика 2: Intra‑session diversity (внутрисессионное разнообразие)

Intra‑session diversity — мера того, насколько ответы внутри одной сессии (диалога) отличаются друг от друга.

Метод расчёта

  • Для каждой пары ответов в сессии считаем косинусное расстояние между их эмбеддингами (например, sentence‑transformers).
  • Усредняем по всем парам.
  • Можно также использовать Self‑BLEU — среднюю BLEU‑оценку каждого ответа относительно остальных в сессии.

Формула Self‑BLEU

Self‑BLEU = (1 / N) * Σ BLEU(answer_i, остальные ответы)

Низкий Self‑BLEU → высокое разнообразие. Высокий Self‑BLEU → ответы похожи друг на друга.

Порог если среднее косинусное расстояние падает ниже 0.3 (или Self‑BLEU > 0.7) — подозрение на коллапс.


5. Метрика 3: Repeat rate (частота повторений)

Repeat rate — доля exact или near‑exact повторений среди последних K ответов.

Exact repeat ответ полностью совпадает с предыдущим (после нормализации: lowercasing, удаление пунктуации).

Near‑exact repeat ответ совпадает с предыдущим с точностью до синонимов или незначительных перестановок (можно детектировать через edit distance < 10% длины).

Формула

RepeatRate@K = (число ответов, являющихся повторением любого из предыдущих K ответов) / K

Пример:
За последние 20 ответов 5 являются точными копиями предыдущих → RepeatRate@20 = 5/20 = 0.25.

Alert при RepeatRate > 0.3 (30%) — высокая вероятность коллапса.


6. Baseline и пороги срабатывания (Alert)

Для надёжной детекции необходимо установить baseline — нормальные значения метрик на этапе, когда агент работает корректно.

Процедура

  1. Запускаем агента на репрезентативном наборе запросов (например, 500 запросов из продакшена).
  2. Считаем энтропию, intra‑session diversity, repeat rate.
  3. Запоминаем средние значения и стандартные отклонения.

Порог алерта

  • Энтропия падение на 30% от baseline (например, baseline 5.2 бит, алерт при < 3.64 бит).
  • Intra‑session diversity падение среднего косинусного расстояния на 40% от baseline.
  • Repeat rate превышение 0.3 или рост в 2 раза относительно baseline.

Комбинированное правило алерт, если хотя бы две из трёх метрик выходят за порог.


7. Инструменты и реализация (пример на Python)

import numpy as np
from collections import Counter
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

class DistributionCollapseDetector:
    def __init__(self, baseline_entropy, baseline_diversity, baseline_repeat_rate):
        self.baseline_entropy = baseline_entropy
        self.baseline_diversity = baseline_diversity
        self.baseline_repeat_rate = baseline_repeat_rate
        self.answers_window = []  # скользящее окно последних N ответов
        self.window_size = 100
        self.embedder = SentenceTransformer('all-MiniLM-L6-v2')
    
    def add_answer(self, answer: str):
        self.answers_window.append(answer)
        if len(self.answers_window) > self.window_size:
            self.answers_window.pop(0)
    
    def compute_entropy(self):
        # unigram entropy
        all_tokens = ' '.join(self.answers_window).split()
        freq = Counter(all_tokens)
        probs = np.array(list(freq.values())) / len(all_tokens)
        entropy = -np.sum(probs * np.log2(probs + 1e-10))
        return entropy
    
    def compute_diversity(self):
        if len(self.answers_window) < 2:
            return 1.0
        embeddings = self.embedder.encode(self.answers_window)
        sim_matrix = cosine_similarity(embeddings)
        # среднее косинусное расстояние (1 - сходство)
        diversity = 1 - np.mean(sim_matrix[np.triu_indices_from(sim_matrix, k=1)])
        return diversity
    
    def compute_repeat_rate(self):
        if len(self.answers_window) < 2:
            return 0.0
        normalized = [a.lower().strip() for a in self.answers_window]
        repeats = 0
        for i in range(1, len(normalized)):
            if normalized[i] == normalized[i-1]:
                repeats += 1
        return repeats / (len(normalized) - 1)
    
    def detect(self):
        entropy = self.compute_entropy()
        diversity = self.compute_diversity()
        repeat_rate = self.compute_repeat_rate()
        
        alerts = []
        if entropy < 0.7 * self.baseline_entropy:
            alerts.append(f"Entropy collapse: {entropy:.2f} (baseline {self.baseline_entropy:.2f})")
        if diversity < 0.6 * self.baseline_diversity:
            alerts.append(f"Diversity collapse: {diversity:.2f} (baseline {self.baseline_diversity:.2f})")
        if repeat_rate > 0.3 or repeat_rate > 2 * self.baseline_repeat_rate:
            alerts.append(f"Repeat rate spike: {repeat_rate:.2f} (baseline {self.baseline_repeat_rate:.2f})")
        
        return alerts

Применение детектор запускается после каждого ответа агента. При появлении алертов система может:

  • Увеличить temperature на 0.1–0.2.
  • Очистить историю диалога (сбросить контекст).
  • Переключить стратегию retrieval (например, добавить случайный шум в запрос).

8. Дополнительные методы детекции

МетодСутьКогда полезен
KL‑divergenceСравниваем распределение ответов агента с эталонным распределением (например, на валидационном наборе). Рост KL → коллапс.Если есть эталонный датасет.
N‑gram diversityДоля уникальных n‑грамм среди всех n‑грамм в окне. Падение доли → коллапс.Простая альтернатива энтропии.
PerplexityСредняя перплексия модели на своих же выходах. При коллапсе перплексия может резко упасть (модель «уверена» в повторяющихся паттернах).Если есть доступ к логам вероятностей.
Action diversityДля агентов с инструментами — разнообразие вызываемых функций. Если агент перестаёт использовать часть инструментов — признак коллапса.Специфично для Agentic RAG.

9. Что делать при обнаружении Distribution Collapse?

Краткий чек‑лист

  1. Проверить temperature — если стоит < 0.5, поднять до 0.7–0.9.
  2. Очистить контекст — удалить историю диалога, оставив только последний запрос.
  3. Увеличить exploration — добавить случайные вариации в промпт (например, «попробуй другой подход»).
  4. Переключить модель — временно использовать более «креативную» модель (больше параметров, выше temperature).
  5. Анализировать данные — проверить, не произошло ли смещение в распределении входящих запросов (data drift).
  6. Запланировать переобучение — если коллапс систематический, возможно, требуется fine‑tuning с регуляризацией разнообразия.

Пет-проект для закрепления

Задача Разработать систему мониторинга Distribution Collapse для простого RAG‑агента, который отвечает на вопросы по документации.

Инструменты

  • Python, LangChain (или простой агент на OpenAI API).
  • Sentence‑Transformers для эмбеддингов.
  • Streamlit для визуализации метрик в реальном времени.

Шаги:

  1. Реализуйте агента, который делает retrieval из векторной БД (Chroma) и генерирует ответ через LLM (GPT‑4o mini).
  2. Создайте класс CollapseDetector с методами add_answer, compute_entropy, compute_diversity, compute_repeat_rate.
  3. Запустите агента на 200 разнообразных вопросов. Зафиксируйте baseline.
  4. Сымитируйте коллапс: установите temperature=0 и подайте 50 однотипных вопросов.
  5. Убедитесь, что детектор выдаёт алерт.
  6. Добавьте автоматическую коррекцию: при алерте увеличивать temperature на 0.1 и логировать событие.

Ожидаемый результат

  • Работающий прототип, который в реальном времени показывает графики энтропии, diversity и repeat rate.
  • При коллапсе система автоматически меняет параметры генерации и уведомляет оператора.

Связь с другими вопросами

ВопросТема
166Как вы проектируете систему мониторинга для Agentic RAG?
168Какие стратегии exploration вы используете для агента?
169Как вы боретесь с зацикливанием (looping) агента?
170Как оценивать качество агента в production?
165Что такое Agentic RAG и чем отличается от обычного RAG?
160Как вы детектируете дрейф данных в RAG?

Навигация