Два часа ночи. Я пытаюсь впихнуть документацию проекта в контекст Claude. 847 страниц. Где-то 1.2 миллиона токенов. Контекстное окно — 200 тысяч.
Делаю то, что делают все: режу, суммаризирую, выбрасываю «неважное». Каждый раз теряю что-то критичное. Это уже третий час, кофе кончился, и в голову приходит идея, которая кажется гениальной.
Спойлер: она такой не была.
Логика была такая. Шеннон придумал теорию информации для телеграфа. ZIP ищет повторяющиеся байты. Но LLM читает не байты — она читает смыслы. «Красный автомобиль едет по шоссе» и «алая машина мчится по трассе» — для ZIP это два совершенно разных набора символов. Для понимания — почти одно и то же.
И вот я думаю: а давайте сжимать смыслы. Выделяем «ядро» — уникальные факты, которые LLM сама не знает. Выбрасываем «воду» — всё, что она может додумать. При распаковке модель восстанавливает документ из ядра.
Я даже название придумал: SemanticZip. Написал прототип за выходные. Прогнал тесты. Сжатие 14x, верификация 94%. Красота.
А потом начал копать.
Первое, что я понял: когда 7-Zip распаковывает архив, он возвращает ровно те же байты. Бит в бит. Детерминированно.
Когда LLM «распаковывает» мой архив — она не восстанавливает документ. Она генерирует новый текст. Похожий на то, что могло бы быть в оригинале.
Я дал модели ядро из одного проекта и попросил распаковать. Потом ещё раз. Два разных докум��нта. Оба выглядят убедительно. Оба содержат факты из ядра. Но структура отличается, формулировки отличаются. В одном варианте появились детали, которых в оригинале не было.
В ядре было написано «используем PostgreSQL для пользователей». Модель добавила «с репликацией master-slave». В оригинале никакой репликации не было. Но звучит-то логично.
Это не сжатие. Это генерация с подсказками.
Второе. Я гордился своей верификацией. Генерирую 10 контрольных вопросов по оригиналу, проверяю, можно ли на них ответить по восстановленному тексту. 94% — отличный результат!
Потом я задал себе очевидный вопрос: а что с фактами, которые не попали в вопросы?
Взял документ с 50 фактами. Сгенерировал 10 вопросов. Сжал, распаковал. Верификация — 90%. Руками проверил все 50.
Из 40 фактов, которые не попали в тесты, 12 были искажены или потеряны. 30% ошибок на том, что я не проверял.
Но хуже другое. В распакованном документе появились 8 новых «фактов». Которых в оригинале не было. Модель их выдумала. И они выглядели настолько органично, что без сравнения с оригиналом я бы не заметил.
Верификация через QA проверяет, что сохранилось. Она не проверяет, что добавилось. А добавляется — всегда.
Третье. В теории всё красиво: ядро — это то, что нельзя вывести логически. На практике — это то, что LLM решила считать невыводимым.
Я попросил модель извлечь ядро из одного документа пять раз. Получил пять разных ядер. Где-то «SESSION_TTL=24h» попало в ядро, где-то нет — модель решила, что 24 часа это типичное значение по умолчанию. Где-то constraint про удаление пользователей был отмечен как важный, где-то нет.
Колмогоровская сложность — красивая аналогия, но ложная. Для фрактала Мандельброта есть формула. Из неё можно восстановить изображение точно. Для текста такой формулы нет. «Ядро» не порождает оригинал. Оно подсказывает направление генерации.
Это как сжать карту города до списка достопримечательностей и надеяться, что кто-то по нему нарисует ту же карту. Он нарисует какую-то карту. С этими достопримечательностями. Но не ту.
Четвёртое. Посчитал, сколько, в теории, стоило бы такое «сжатие».
Чтобы сжать документ, я прогоняю его через Claude для извлечения ядра. Потом ещё раз — для графа импликаций. Ещё раз — для подсказок. Ещё раз — для контрольных вопросов.
Чтобы распаковать: ещё прогон для восстановления. Ещё один для верификации. Может быть ещё один для патчинга.
Это 6-8 вызовов API на документ. По деньгам сопоставимо с тем, чтобы просто взять модель с большим контекстом.
И главное: я плачу сейчас, чтобы сэкономить токены потом. При том что «потом» я получу не оригинал, а галлюцинацию на тему оригинала.
Пятое. Когда я снял розовые очки и посмотрел на свой SemanticZip, я увидел:
Разбиение документа на части
Извлечение фактов
Суммаризация связей
Сохранение метаданных
Это RAG. Обычный RAG. Только я зачем-то назвал его «семантическим сжатием» и добавил красивых слов про Колмогорова.
Причём классический RAG работает лучше. Он хотя бы хранит оригинальные куски текста и возвращает их как есть. Мой подход заменяет оригинал пересказом и надеется, что пересказ достаточно точный.
Вот что я в итоге понял.
7-Zip — это функция и обратная функция. f(x) = y, f⁻¹(y) = x. Детерминированно, обратимо.
LLM — стохастический процесс. Она не восстанавливает. Она сочиняет. Сколько контекста ни дай — на выходе будет новый текст, похожий на то, что хотели.
Для некоторых задач это нормально. Если нужен черновик письма — пусть сочиняет. Если нужна техническая документация, по которой я буду строить систему — мне нужен оригинал. Не «что-то похожее».
После провала с SemanticZip я вернулся к скучным вещам.
Иерархическое разбиение. Делю документ на секции, для каждой храню оригинал плюс короткое описание. При запросе сначала ищу по описаниям, потом подгружаю нужные секции целиком.
Честная приоритизация. Не пытаюсь сжать всё. Решаю явно: эти 50 страниц важны, эти 200 справочные, эти 600 — легаси, можно игнорировать.
Вопросы вместо контекста. Не даю модели документ. Даю доступ к инструментам для поиска по документу. Пусть сама спрашивает, что ей нужно.
Ничего революционного. Никаких красивых аналогий. Зато работает.
Я потратил две недели на SemanticZip, потому что влюбился в метафору. Сжатие смыслов! Колмогоровская сложность для текста! Вавилонская библиотека наоборот!
Оказалось, что за метафорой нет инженерной основы. LLM не умеет распаковывать. Она умеет галлюцинировать. Иногда полезно. Но это не сжатие.
Если кто-то решит эту проблему по-настоящему — это будет прорыв. Мой подход её не решил. Он просто красиво назвал существующие ограничения.
P.S. Код не выкладываю. Он работает ровно так, как я описал — создаёт иллюзию сжатия, которая разваливается при внимательной проверке. Не хочу, чтобы кто-то использовал это в продакшене и потом ловил баги из-за выдуманных моделью «фактов».
Иногда пишу про такое в токены на ветер — иногда о том, как LLM думают, или просто притворяются.
