JUST · AI инженерные заметки Внедрение под ключ
Главная / Статьи / Разбор
Разбораудит памятиdifflibметрикаsoft-delete 2 минуты2026-09-28

Ложный флаг аудита памяти: 3483 пары против 9 дублей

Ночной аудит выдал 3483 пары почти-одинакового текста по теме path. Настоящих дублей было 9. Разбираю, почему difflib врёт и как я починил метрику.

3483пары, помеченные как дубли
9настоящих дублей
106живых записей path.*

Ночной аудит памяти выдал по теме path вердикт «ПОДТВЕРЖДЕНО: 3483 пары почти-одинакового текста, схожесть 0.988». Это ложный флаг: настоящих дублей было 9. Метрика сравнивала первые 400 символов, а в теме path лежат автозаписи архиватора одного шаблона — совпадал шаблон и общий каталог, а не записи. Из 6555 «пар» 3465 оказались мусором.

Что именно мерила метрика

Источник числа — функция literal_overlap() в guard/mem_audit.py. Она берёт первые 400 символов факта и считает схожесть через difflib. В теме path все записи начинаются одинаково: шаблон автозаписи архиватора плюс общий каталог. Первые 400 символов у них совпадают почти дословно, поэтому схожесть выходит 0.988 независимо от того, о каком пути идёт речь.

Независимый пересчёт это подтвердил. Я выбрал topic и fact из knowledge по маске path.* с условием deleted_at IS NULL, разбил fact по разделителю и посчитал Counter по пути: 115 фактов, 106 уникальных путей, 9 повторов.

пересчёт
SELECT topic, fact FROM knowledge
WHERE topic LIKE 'path.%' AND deleted_at IS NULL;

Лечение метрики

Первая попытка — маска всех цифр — не годилась: она склеивала разные логи и дала ложные 6 повторов. Правильнее маскировать только даты. Так появилась функция detemplate().

Одного снятия общего префикса мало: один проход снимал лишь первый префикс, и оставалось 1075 «пар». Нужен цикл — максимум 6 раз, префикс не короче 12 символов, срез по последнему пробелу.

Отдельно я считаю настоящие повторы: совпадение после снятия шаблона, то есть exact, а не схожесть выше порога. На коротких хвостах схожесть 0.947 даёт ложняк, хотя записи разные.

проверка
python3 guard/mem_audit.py --selfcheck

Двенадцать проверок, ALL_OK.

Что осталось в теме path

Реальные 9 дублей — один путь, два разных topic — вычищены. Осталось 106 живых записей path.*, ровно столько же уникальных путей. Остальные темы по этому флагу чистые: там 0 настоящих повторов.

Не удаляй старые записи физически. В knowledge поле topic уникальное. Если архиватор снова придёт с тем же topic, ON DUPLICATE KEY UPDATE обновит мёртвую строку и факт пропадёт. Правильно — soft-delete через deleted_at=NOW(), а вставку в архиваторе перевязать на поиск живого пути.

Вывод

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

Читайте дальше