Отчёт

Как сжать русский эмбеддер до 24 млн параметров и не соврать себе

Короткий ответ по мотивам нашего лонгрида: какой рецепт сжатия сработал для strizh-ru-retriever, какой красиво провалился, сколько качества стоили четыре слоя — и почему одна забытая строка конфига чуть не обнулила всю работу.

lab_single_run internal research 21 августа 2026 г. · Финансирование: Собственное финансирование, внутреннее исследование

Короткий ответ: сжать — можно, не соврать себе — сложнее. Итог называется strizh-ru-retriever: четыре слоя, 24,4 млн параметров, один 384-мерный вектор на текст, без префиксов , Apache-2.0, рядом лежат GGUF-сборки. Это страница-конспект: рецепт, цена и главный урок. Полный разбор — со всеми итерациями, методикой оценки и оговорками — на Хабре; все числа ниже — цитаты оттуда, не клеймы нашего реестра.

Зачем вообще сжимать то, что и так помещается

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

Рецепт, который сработал

База — deepvk/RuModernBERT-small: 12 слоёв, около 35 млн параметров . Дальше три шага: сначала контрастивно доучить полный 12-слойный донор до ретривера; затем выбрать из него четыре слоя — [0, 5, 9, 11] — как тёплый старт ; наконец, переобучить четырёхслойного студента на смешанном русско-английском наборе в 220 тыс. пар с жёсткими негативами от более крупного ретривера.

Рецепт, который провалился красиво

Очевидный путь — MSE-регрессия эмбеддингов студента на эмбеддинги крупного учителя — дал идеальную кривую обучения и мёртвый поиск: loss около 0.00062 при Recall@10 = 0.029 . Прокси-метрика сошлась к чему угодно, кроме задачи. Урок переживёт эту модель: измерять надо задачу, а не суррогат.

Сколько это стоило в качестве

На фильтрованном срезе MIRACL-ru у модели Recall@10 = 0.751 против 0.831 у bge-m3 и 0.633 у rubert-tiny2 . То есть маленькая модель крупным не ровня, и врать себе тут нечего: отданный кусок полноты куплен обратно скоростью. На Strix Halo под llama.cpp/Vulkan она обрабатывала около четырёх тысяч коротких запросов в секунду против примерно 448 у bge-m3 , а сосед-LLM при онлайн-нагрузке терял с ней около 2% генерации против 7% с bge-m3 . Файл Q8_0 весит 29 МБ .

Одна цифра, которая чуть всё не испортила

В tokenizer_config.json осталась строка model_max_length: 256 — след обучающего конфига при архитектуре на 8192 токена . Обвязки читают это поле и молча режут вход; ни ошибки, ни предупреждения. Всплыло на собственной RAG-обкатке: тот же чекпоинт давал Recall@10 = 0.589 без бага и 0.448 с ним — минус 14,1 процентного пункта , уровень rubert-tiny2. Одна цифра в конфиге против недель обучения — и короткие запросы в бенчмарках никогда бы её не поймали. Это наш главный тезис в новой позе: качество без конфигурации — переодетый конфиг.

Куда идти дальше

За полной историей — итерации донора, отбор слоёв, ко-резидентные замеры, чек-лист релиза — на Хабр. Идентичность артефакта — на странице артефактов. Числа здесь — авторские измерения одной лаборатории на одной машине; что наш протокол потребовал бы от них для реестра — отдельный отчёт.

Как цитировать

AGmind Systems Lab (2026-08-21). Как сжать русский эмбеддер до 24 млн параметров и не соврать себе. Evidence level: lab_single_run. https://agmind.ai/ru/reports/russian-embedder-24m-params/
← Отчёты