Два часа ночи. Я пытаюсь впихнуть документацию проекта в контекст 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 думают, или просто притворяются.
Комментарии (10)

Zara6502
02.02.2026 11:41я вообще не понимаю ни LLM ни работу с ними, имею чисто пользовательский опыт, да и тот небольшой, но мне кажется всё очевидно было и без практических тестов чисто по своей сути.

ScriptShaper Автор
02.02.2026 11:41Задним числом да, очевидно. Но в 2 ночи с красивой метафорой в голове критическое мышление отключается. Статья про это: как влюбиться в идею и потратить две недели вместо одного вечера.

ihouser
02.02.2026 11:41Воспользуюсь вашей аналогией с картой. Если задача проехать из точки А в Б, то человек знающий карту, сделает краткую, правильную инструкцию. Т.е. задача не восстановить карту, а добраться до Б без карты. Справится ли ИИ?
Вы дали задачу восстановить карту по нескольким точкам.
Далее, сколько раз ИИ даст правильных инструкций из ста? Если почти 100, то она способна вычленять смысл.
Другой вопрос, сможет ли ИИ сама выявить на карте ключевые точки? Если сможет, то SemanticZip будет состоять из двух шагов: создать список достопримечательностей и создать список маршрутов. Все ненужное будет потеряно.
Карту не восстановить, но задача в другом. Можно ли предположить, что вы неправильно поставили задачу, т.е. пытались восстановить карту (документ полностью) а нужен был список маршрутов (только суть)?

ScriptShaper Автор
02.02.2026 11:41Точно. Если задача "добраться до Б", а не "восстановить карту", подход может работать.
Проблема: я не знаю заранее, какие маршруты понадобятся. Выбросил "неважный" перекрёсток, а завтра он нужен. Для узких задач можно сжимать агрессивно. Для "база знаний, используй как хочешь" нет.

Stingray42
02.02.2026 11:41Это вы еще про автоэнкодер не слышали.

ScriptShaper Автор
02.02.2026 11:41Думал про это. Автоэнкодер честный: latent space фиксированный, декодер детерминированный. Моя ошибка была использовать LLM как декодер, а она стохастическая.

neodavinchi
02.02.2026 11:41Я попросил модель извлечь ядро из одного документа пять раз. Получил пять разных ядер
Ну так это процесс надо делать с нулевой "температурой креативности" в параметрах.
Если она выше нуля, это явная команда для lmm: "добавь немного креатива", а если ноль, то одинаковые запросы дадут предсказуемо одинаковый ответ.

ScriptShaper Автор
02.02.2026 11:41Пробовал t=0. Стабильнее, но не идентично. OpenAI/Anthropic не гарантируют детерминизм даже при нулевой температуре из-за batching и floating point. Плюс само понятие "что важно" субъективное. Два запуска, два мнения.
divin_dmitry
Не так давно, наткнулся на анност от DeepSeek по компресси конекста с помощью "context optical compression engine".
Суть этого метода заключается в том, что если текст хранить как картинку, то тот же объем информации будет занимать меньше места в контексте.
Чтобы это работало у модели, со слов разработчиков должен быть встроен OCR в visual encoder https://github.com/deepseek-ai/DeepSeek-OCR.
ScriptShaper Автор
Интересный хак. Текст как картинка может обходить токенизацию эффективнее. Но OCR не lossless, шрифт мелкий или качество низкое = снова галлюцинации. Покопаю, спасибо за ссылку.