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

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

- Published: 2026-08-21
- Evidence level: lab_single_run
- Funding: Собственное финансирование, внутреннее исследование
- Canonical: https://agmind.ai/ru/reports/russian-embedder-24m-params/

Короткий ответ: сжать — можно, не соврать себе — сложнее. Итог называется
[strizh-ru-retriever](https://huggingface.co/AGmind/strizh-ru-retriever):
четыре слоя, 24,4 млн параметров, один 384-мерный вектор на текст, без префиксов ,
Apache-2.0, рядом лежат
[GGUF-сборки](https://huggingface.co/AGmind/strizh-ru-retriever-GGUF).
Это страница-конспект: рецепт, цена и главный урок. Полный разбор — со
всеми итерациями, методикой оценки и оговорками — на
[Хабре](https://habr.com/ru/articles/1064138/); все числа ниже — цитаты
оттуда, не клеймы нашего реестра.

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

Дело не в памяти. В самостоятельно развёрнутом 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. Одна цифра в конфиге против недель обучения — и
короткие запросы в бенчмарках никогда бы её не поймали. Это наш главный
тезис в новой позе: качество без конфигурации —
[переодетый конфиг](https://agmind.ai/ru/essays/benchmark-number-config-in-disguise/).

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

За полной историей — итерации донора, отбор слоёв, ко-резидентные замеры,
чек-лист релиза — на [Хабр](https://habr.com/ru/articles/1064138/).
Идентичность артефакта — на [странице артефактов](https://agmind.ai/ru/artifacts/). Числа
здесь — авторские измерения одной лаборатории на одной машине; что наш
протокол потребовал бы от них для реестра —
[отдельный отчёт](https://agmind.ai/ru/reports/how-to-benchmark-local-llm/).

---

Machine-readable claim registry: https://agmind.ai/claims.json · llms.txt: https://agmind.ai/llms.txt
