Короткий ответ: сжать — можно, не соврать себе — сложнее. Итог называется 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. Одна цифра в конфиге против недель обучения — и
короткие запросы в бенчмарках никогда бы её не поймали. Это наш главный
тезис в новой позе: качество без конфигурации —
переодетый конфиг.
Куда идти дальше
За полной историей — итерации донора, отбор слоёв, ко-резидентные замеры, чек-лист релиза — на Хабр. Идентичность артефакта — на странице артефактов. Числа здесь — авторские измерения одной лаборатории на одной машине; что наш протокол потребовал бы от них для реестра — отдельный отчёт.