Community & Governance

Сжатие LLM в npm: адаптация к домену, экономия в 12 раз

Контекстное окно вашей LLM опустошает бюджет? Новый инструмент с открытым исходным кодом, gni-compression, обещает радикально снизить затраты на токены с впечатляющей эффективностью. Разбираемся в деталях.

{# Always render the hero — falls back to the theme OG image when article.image_url is empty (e.g. after the audit's repair_hero_images cleared a blocked Unsplash hot-link). Without this fallback, evergreens with cleared image_url render no hero at all → the JSON-LD ImageObject loses its visual counterpart and LCP attrs go missing. #}
Скриншот страницы npm-пакета gni-compression с выделенной командой установки и описанием.

Key Takeaways

  • gni-compression достигает коэффициентов сжатия до 12.40x (91.9% экономии) на данных диалогов LLM, значительно превосходя brotli-6.
  • Адаптация к домену использует предобученный словарь для распознавания и сжатия распространённых лингвистических паттернов LLM, что особенно эффективно для коротких, повторяющихся сообщений.
  • Пакет разделяет данные на идентификаторы токенов и литералы для независимого сжатия, повышая эффективность. Теперь доступен в npm.
  • Разработанный для платформы ИИ-агентов NN Dash, gni-compression призван сделать долгосрочные взаимодействия с ИИ экономически целесообразными за счёт снижения затрат на токены.

Что, если секрет доступного, долгого взаимодействия с ИИ — это не больше VRAM, а более умная работа с данными? Мы годами боремся с растущими расходами на контекстные окна больших языковых моделей. Теперь новый игрок в реестре npm, gni-compression, заявляет о значительном прорыве, раздвигая границы сжатия без потерь специально для данных диалогов LLM.

Это не просто очередная вариация gzip или brotli. Пакет gni-compression, нативный бинарный файл на Rust, обёрнутый для JavaScript через napi-rs, построен на основе адаптации к домену. Его ключевое новшество — предварительно обученный словарь (gcdict.bin), который идёт прямо в комплекте. Этот словарь, обученный на обширных корпусах диалогов LLM, позволяет компрессору распознавать и эффективно кодировать распространённые лингвистические паттерны и токены, встречающиеся в таких взаимодействиях.

Действительно ли новый компрессор хорош?

Цифры, как говорится, не лгут. При тестировании на пяти разнообразных публичных корпусах — WildChat, ShareGPT, LMSYS, Ubuntu IRC и Claude conversations — gni-compression стабильно превосходит brotli-6. Результаты впечатляют:

Корпус Коэффициент GN Экономия brotli-6
WildChat 4.94x 79.8% ~2.1x
ShareGPT 8.65x 88.4% ~2.0x
LMSYS 10.38x 90.4% ~2.1x
Ubuntu IRC 8.40x 88.1% ~1.2x
Claude convos 12.40x 91.9% ~1.9x

Это коэффициент сжатия до 12.40x, что означает более 90% экономии на некоторых наборах данных. Неожиданным лидером здесь является Ubuntu IRC — корпус с очень короткими, часто повторяющимися сообщениями. В то время как brotli-6 с таким типом данных справляется плохо (коэффициент всего 1.2x), gni-compression демонстрирует блестящие результаты. Это подчёркивает сильную сторону пакета: его специализированный словарь превосходит общие алгоритмы там, где они терпят неудачу, особенно с короткими, высокоизбыточными последовательностями сообщений.

Как достигается такое высокое сжатие?

Техническая основа завораживает. gni-compression не просто упаковывает всё в один поток сжатия. Вместо этого он интеллектуально разделяет входные данные на два distinct потока: один для идентификаторов токенов и другой для литеральных байтов. Идентификаторы токенов — это компактные целые числа, ссылающиеся на предобученный словарь. Когда компрессор встречает известную последовательность или слово, он заменяет их соответствующим ID, радикально уменьшая размер данных. Литеральный поток захватывает оставшиеся данные, не соответствующие словарю — эти остаточные данные затем сжимаются с помощью deflate с применением GCdict.

Такой двойной подход — ключ к успеху. Поток идентификаторов токенов становится невероятно мал из-за высокой избыточности. Литеральный поток, хоть и менее предсказуем, выигрывает от семантического сжатия, уже выполненного для идентификаторов токенов. Это элегантное распределение задач, максимизирующее эффективность.

Анализ длины фраз выявляет интересное распределение. Автор отметил, что словарь демонстрирует бимодальное распределение со заметным разрывом. Короткие «заполнители» (минимальная длина 4-5 символов) показывают существенное снижение количества, а затем ещё более значительное снижение для более длинных фраз (10+ символов). Важно, что наблюдается относительное затишье в использовании словаря для фраз длиной от 5 до 9 символов. Это говорит о том, что gni-compression особенно эффективно отсекает «шум» диалога и распространённые короткие фразы, что может объяснить неофициальные сообщения об улучшении производительности downstream-моделей при использовании сжатого контекста — соотношение сигнал/шум улучшается.

Долгий путь к gni-compression

То, что было выпущено сегодня, — это кульминация целенаправленных усилий по разработке. Путь начался семь статей назад с создания надёжного слоя сериализации, обеспечивающего восстановление сообщений без потерь. Переход от этой фундаментальной работы к полноценному, высокопроизводительному npm-пакету потребовал преодоления нескольких препятствий. Изначально реализация на чистом JavaScript отставала от brotli-6. Прорыв произошёл с реализацией на Rust и эффективной интеграцией пайплайна GCdict. Ещё одной значительной проблемой стала целостность данных при прямом и обратном преобразовании: в исходном разделённом формате изначально отсутствовал прямой инверс без оригинального буфера. Реконструкция архитектуры вокруг чередующегося формата решила эту критическую проблему.

Обучение словаря, который эффективно обобщается на разнообразных корпусах, не переобучаясь на каком-либо одном, также было кропотливым процессом. История версий на npm сама по себе многое рассказывает: версии 3.x представляют ранний чередующийся пайплайн, а 4.x — окончательный API.

Зачем это создавать, если уже есть LLM?

Движущей силой gni-compression является разработка NN Dash — постоянной платформы для ИИ-агентов, предназначенной для обеспечения гладкого взаимодействия между Claude, GPT и локальными моделями Ollama. Конечная цель — сделать устойчивые, многосессионные ИИ-отношения экономически выгодными. Существенная стоимость контекстных окон на тысячи сообщений была серьёзным барьером для долгосрочных, экономически эффективных ИИ-взаимодействий. gni-compression — это двигатель, который делает эти расширенные контексты возможными, не вызывая непомерных счетов за токены.

Алгоритмическая строгость этого проекта достаточно высока, чтобы получить грант NLNet, что указывает на его потенциал для формальных академических публикаций.

Используйте:

npm install gni-compression

const { compress, decompress } = require('gni-compression');

const longContext = Buffer.from("Ваша очень длинная строка диалога LLM здесь...");

const compressed = await compress(longContext);
const restored = await decompress(compressed);

// restored будет идентичен longContext (без потерь)

Исходный код доступен под лицензией MIT на GitHub: github.com/atomsrkull/glasik-core. Мы активно приветствуем отзывы о цифрах, методологии или потенциальных сценариях использования.


🧬 Связанные инсайты

Sam O'Brien
Written by

Ecosystem and language reporter. Tracks package releases, runtime updates, and OSS maintainer news.

Worth sharing?

Get the best Open Source stories of the week in your inbox — no noise, no spam.

Originally reported by Dev.to