Разрабатывая AI-консультантов и ассистентов на базе RAG-архитектуры, работающих с корпоративными базами знаний на русском языке, мы столкнулись с вопросом: какие открытые эмбеддинг-модели дают лучший баланс качества семантического поиска на русском и скорости работы. Особенно это актуально, когда запросы и документы русскоязычные, но внутри часто попадаются фрагменты кода (например, SQL или Python) и англоязычной терминологии.

Мы прогнали 9 open-source эмбеддинг-моделей через несколько тестов, включающих проверки:

  • Умение распознать тематику близких по значению русских слов (омонимы);

  • Умение искать схожие тексты на русском языке;

  • Способность искать схожие тексты на русском языке вперемешку с примерами SQL-кода.

AI-консультант в корпорациях и зачем RAG

Интерес к AI со стороны корпоративного сектора растёт. Компании запускают пилоты и пытаются добиться экономически эффективных бизнес-кейсов применения LLM в разных сценариях. При этом любая крупная компания сразу поставит достаточно жёсткие требования к вопросам безопасности и персонализации (использование доменных и корпоративных знаний). Дообучение (fine-tuning) LLM — штука дорогая и долгая, поэтому архитектура RAG становится неплохим решением, когда LLM необходимо снабдить вашими данными, документами и знаниями. В RAG мы не вшиваем знания в веса модели, а «подкладываем» LLM нужные куски ваших документов перед генерацией ответа на запрос пользователя.

Выделю пару сценариев применения AI в архитектуре RAG, с которыми мы сталкивались:

  • AI-консультант по регламентам, нормативам и общим вопросам внутри компании (отпуск, больничный, закупки, командировки и прочее);

  • AI-ассистент для инженеров ИТ-поддержки и пользователей.

Почему от retrieval зависит всё

Одна из ключевых частей RAG-архитектуры — retrieval-процесс, векторный поиск по базе знаний, чтобы снабдить основную LLM подходящим контекстом из ваших корпоративных документов. Если retrieval подберёт нерелевантные или слишком общие фрагменты корпоративной информации, качество ответа значительно снизится. LLM «на выходе» будет ровно настолько полезна, насколько релевантный контекст ей принесёт retrieval.

В retrieval-процессе критичны три составляющих:

  1. Эмбеддинг-модель — создаёт векторы с определённой размерностью.

  2. Векторная БД (в наших тестах мы использовали Qdrant) — хранит векторы и обеспечивает быстрый поиск с большими возможностями для конфигурации.

  3. Стратегия извлечения: выборка top-k подходящих найденных документов, использование тегирования, rerank-процесс после поиска, дописывание запроса пользователя для повышения качества, применение hybrid (BM25+dense).

В нашем тестировании мы сконцентрировались на сравнении эмбеддинг-моделей при равных условиях по векторной БД и не погружаясь в вопросы стратегий извлечения.

Какие модели мы тестировали и почему именно они

Мы сознательно ограничились открытыми энкодерами, которые:

  • легко поднимаются on-premise;

  • поддерживаются в LangChain/LlamaIndex;

  • мультиязычные либо сильные в русском языке;

  • различаются по семействам и размерности (384–1024d), чтобы увидеть разницу «скорость и качество». Теоретически, чем выше размерность, тем богаче представление текста, но на практике всё иначе.

Для тестирования мы определили такой список эмбеддинг-моделей: 

Модель

Размерность

Объём

Краткое описание

1

sentence-transformers/all-MiniLM-L6-v2

384d

2.28 GB

Семейство MiniLM, созданное как лёгкая версия BERT от Microsoft и Hugging Face. Очень компактная, быстрая, часто используется как baseline для эмбеддингов.

2

intfloat/multilingual-e5-small

384d

2.10 GB

Семейство E5 от intfloat, обученное на задачах поиска (retrieval). Мультиязычная, оптимизирована под скорость и эффективность.

3

intfloat/multilingual-e5-base

768d

3.59 GB

Базовая версия E5, улучшенное качество по сравнению с small за счёт удвоенной размерности. Часто используется в open-source RAG-решениях как стандарт для dense-retrieval.

4

thenlper/gte-base

768d

3.01 GB

Модель из семейства GTE (General Text Embeddings), разработанного для широкого круга задач: retrieval, классификация, кластеризация. Основана на архитектуре BERT-типа, выбрана как представитель чисто англоязычных GTE-энкодеров для сравнения с мультиязычными.

5

Alibaba-NLP/gte-multilingual-base

768d

3.01 GB

Мультиязычная версия GTE от Alibaba NLP. Поддерживает русский язык и устойчиво работает на смешанных наборах (RU + EN + код). Выбрана как быстрая альтернатива E5-семейству и для оценки качества многоязычных embedding-моделей.

6

sentence-transformers/distiluse-base-multilingual-cased-v2

512d

2.42 GB

Классика семейства Sentence-Transformers, мультиязычная модель, обученная на данных из 50+ языков.

7

Snowflake/snowflake-arctic-embed-m

768d

2.21 GB

Новая модель от Snowflake AI, оптимизированная под поиск и генерацию embedding-ов в enterprise-среде. Интерес представляла как «корпоративная альтернатива» — хотелось проверить, насколько хорошо она справится с русскими текстами.

8

DeepPavlov/rubert-base-cased-sentence

768d

4.08 GB

Модель на основе RuBERT от DeepPavlov — специализирована на русском языке, классическая архитектура Transformer.

9

BAAI/bge-m3

1024d

10.22 GB

Семейство BGE (Beijing General Embeddings) от BAAI, одна из самых мощных открытых моделей. Поддерживает много языков, даёт сильные результаты в нюансных контекстах и задачах ранжирования. В тесте — как heavy-weight-вариант с приоритетом качества над скоростью.

Занимаемый объём модели (размер контейнера + кеш) указал для понимания и сравнения.

Коммерческие модели (OpenAI/Cohere и пр.) мы сознательно исключили (условие «open-source + on-prem»). А другие узкоспециализированные/тяжёлые энкодеры по опыту хуже по скорости/доступности в корпоративном контуре.

Разминочный тест на понимание богатого русского языка

Перед большими прогонами на датасетах мы сделали мини-проверку «на нюанс языка»: набор фраз про лук (овощ vs оружие) и команду (приказ vs бригада). Такой тест не про статистику — он про интуитивную «чуткость» к контексту на русском. Многие энкодеры в общем-то «сильны», но спотыкаются о слова-омонимы.

Мы создали векторы в Qdrant для следующих фраз:

  • «Лук был порезан на тонкие куски и залит уксусом»

  • «Срезал тонкую ветку и сделал лук и стрелы»

  • «Если тонко нарезать и кушать лук каждый день — будешь худым»

  • «Маринованный лук в рецепте добавляет тонкий вкус французской кухни»

  • «Он срезал мимо мишени, так как его лук был очень тонкий»

И каждую модель попросили найти близкие по векторам фразы (cosine similarity) на запросы:

  • «Что мне приготовить на завтрак?»

  • «Попасть в яблочко трясущейся рукой невозможно»

  • «Что надо для здорового образа жизни?»

То же самое проделали с фразами про «команду»:

  • «Необходимо выполнить команду reset и перезагрузить мастер-систему»

  • «Спортивная команда выполнила все необходимые нормативы и вышла на старт беговой дорожки»

  • «По требованию генерального директора наша команда выполнила проект в необходимые сроки»

  • «После перегрузки системы выполнить следующую команду start»

  • «Для выполнения генеральной уборки в самолёте приехала целая команда специалистов»

И далее получили результаты поиска близких векторов на запросы:

  • «Что делать, если система перезагрузилась?»

  • «Наша команда участвовала в забеге на 5 км?»

  • «Сколько человек нужно, чтобы здесь навести порядок и чистоту?»

  • «Кто в вашей команде отвечает за сроки?»

Результаты просматривали вручную по каждой модели, получили такой расклад:

Модель

"Лук"

"Команда"

Точность %

Результат

bge_m3

4/4

4/5

90.0%

✅ Отлично

distiluse

4/4

4/5

90.0%

✅ Отлично

gte_multilingual

4/4

3/5

80.0%

✅ Отлично

intfloat_base

3/4

4/5

77.5%

? Хорошо

rubert

4/4

2/5

70.0%

? Хорошо

intfloat_small

3/4

2/5

57.5%

? Удов-но

arctic

2/4

1/5

35.0%

❌ Плохо

gte_base

2/4

1/5

35.0%

❌ Плохо

minilm

1/4

1/5

22.5%

❌ Плохо

Итоги разминки:

  • «Отлично» — bge‑m3, distiluse, gte_multilingual (лучше других разводят значения векторов).

  • «Хорошо/Середнячок» — e5‑base, местами rubert.

  • «Слабо» — minilm, gte‑base, arctic (много ошибались, путали тематики).

Этот чек даёт предварительное ожидание перед «боевыми» наборами.

Методология тестирования

Мы собрали два датасета, эмулирующие корпоративные базы знаний:

  1. FAQ по возможностям Битрикс24. Мы собрали 120 вопросов-ответов с сайта вендора. Небольшие тексты по 300–500 символов, без технических деталей, все на русском языке с редкими терминами на английском.

  2. Справочник по SQL. Собрали 200 небольших статей по 500–1000 символов; каждая статья включает текст описания на русском языке и примеры SQL-запросов.

С получением эталонного результата нам сильно помог GPT-5. С его помощью мы подготовили:

  • По 100 запросов, наиболее подходящих для тестирования моделей в разрезе текстов наших баз знаний;

  • По 3 наиболее релевантных по cosine-схожести ответа из наших баз знаний, что мы приняли за эталонный результат от «наиболее умной» LLM.

Получив по 5 наиболее схожих текстов от каждой исследуемой эмбеддинг-модели по всем запросам, мы сравнили результаты с эталоном от GPT-5. Создали свою бальную систему, поощряющее наличие эталонных текстов в топ-3 результатов  и их правильное ранжирование. По итогу получили такие метрики:

  1. Recall@5 — доля 3х эталоных текстов, попавших в топ‑5 результатов от каждой модели.

  2. Сумма баллов за схожие тексты по всем запросам (своя бальная система).

  3. Среднее время формирования эмбеддинга запроса.

  4. Среднее время поиска по соответствующей коллекции в Qdrant .

Нюансы конфигурации коллекций векторов и поиска по ним

Подготовленные базы знаний были векторизованы каждой эмбеддинг-моделью и сохранены в виде коллекций в векторную базу данных Qdrant.

Из технических нюансов стоит отметить параметры HNSW (Hierarchical Navigable Small World), влияющие на построение индекса и поиск ближайших соседей:

  • m — количество рёбер (соседей), которые хранятся у каждой точки в графе. Чем больше m, тем выше recall и стабильнее ранжирование, но больше занимаемого места и дольше процесс индексации. Для всех коллекций мы указали m = 16.

  • ef_construct — управляет числом кандидатов, рассматриваемых при построении графа (качество связей и скорость построения). В наших тестах (≈200 векторов на коллекцию) влияние ef_construct не очень заметно, но мы выровняли параметры, чтобы сравнение моделей было в схожих условиях: MiniLM (96), intfloat-small (96), distiluse (100), intfloat-base (128), gte-base (128), gte-multilingual (128), rubert (128), arctic (140), bge-m3 (160).

  • full_scan_threshold — порог, ниже которого Qdrant делает полный перебор всех векторов в коллекции. Для всех коллекций мы указали full_scan_threshold = 2000.

  • normalize_embeddings — L2-нормализация эмбеддингов. Чтобы cosine и dot давали эквивалентное ранжирование.

О префиксах (query/document)

Префиксы нужны, чтобы сообщить модели контекст, в какой роли используется указанный текст — это запрос пользователя (query) или документ (document/passage). Часть retrieval-моделей обучалась на парах «запрос—документ», поэтому без префикса они могут «перепутать роли» и ухудшить точность поиска. Если модель обучалась не на query-document парах (например, на общих sentence-similarity задачах), префиксы обычно не требуются.

В нашем тестировании мы используем префиксы в следующих моделях:

  • E5 и Arctic: query: для запроса, passage: для документа;

  • GTE: query: для запроса, document: для документа;

  • MiniLM, Distiluse, RuBERT, BGE-m3: без префиксов.

Итоги теста №1 (поиск по русскоязычному FAQ)

База знаний: русскоязычный FAQ (вопросы-ответы о возможностях Битрикс24), русский язык с редким использованием терминов на английском.

Пример текста из базы знаний:
«Вопрос: Можно ли пригласить в задачу внешнего пользователя? Ответ: Да, работа с задачами в Битрикс24 доступна не только для команд внутри компании, но и для внешних пользователей. Приглашайте гостей по email — они могут отслеживать задачу и оставлять комментарии.»

Запросы: русский язык с возможными терминами на английском

Пример запроса:
«Как CRM реагирует, если один и тот же клиент создаёт лиды через сайт и мессенджер одновременно?».

Метрики оценки: баллы (основной), Recall@5, среднее время эмбеддинга и поиска (в секундах).

Место

Модель

Баллы

Recall@5

Embedding (сек)

Search (сек)

?

bge_m3

458

0.499

2.435

0.031

?

intfloat_base

455

0.530

1.321

0.022

?

intfloat_small

442

0.522

0.315

0.018

4️⃣

gte_multilingual

435

0.484

0.245

0.023

5️⃣

distiluse

429

0.522

0.607

0.017

6️⃣

gte_base

293

0.371

0.203

0.021

7️⃣

minilm

276

0.351

0.242

0.018

8️⃣

rubert

201

0.243

0.207

0.022

9️⃣

arctic

192

0.287

1.330

0.022

Выводы первого теста:

  • Для классической корпоративной FAQ-базы E5-семейство и BGE-m3 — безусловные фавориты.

  • Если нужна максимальная скорость и работа на CPU — e5-small почти не уступает по качеству, а время задержки существенно ниже.

  • Хорошо проявила себя Distiluse: на промежуточных замерах она показывала результат выше «тяжёлой» BGE-m3, и показатель Recall у неё по итогу на хорошем уровне.

Итоги теста №2 (поиск по русскоязычному SQL-учебнику)

База знаний: русский язык + фрагменты SQL-кода в каждом тексте.

Пример текста из базы знаний:
"Функция COUNT() позволяет подсчитывать количества строк, игнорируя значения NULL. Пример: SELECT COUNT(*) AS cnt FROM employees WHERE salary > 50000; Функция AVG() — вычисляет среднее значение по колонке. Пример: SELECT AVG(salary) FROM employees;”.

Запросы: русский язык с возможными терминами на английском,

Примеры запросов: 
«Чем отличается INNER JOIN от LEFT JOIN?»;
«Как объединить результаты из двух таблиц в один список?»

Метрики: баллы (основной), Recall@5, среднее время эмбеддинга и поиска (в секундах).

Место

Модель

Баллы

Recall@5

Embedding (сек)

Search (сек)

?

intfloat_base

425

0.435

1.163

0.019

?

gte_multilingual

416

0.408

0.219

0.026

?

intfloat_small

406

0.412

0.277

0.015

4️⃣

bge_m3

400

0.415

1.897

0.024

5️⃣

distiluse

315

0.343

0.595

0.016

6️⃣

gte_base

252

0.255

0.162

0.021

7️⃣

minilm

181

0.242

0.204

0.013

8️⃣

arctic

130

0.127

1.163

0.019

9️⃣

rubert

71

0.127

0.152

0.028

Выводы второго теста:

  • Когда в документах соседствуют русский текст и SQL-код, устойчивее всего ведёт себя e5-base; gte_multilingual и e5-small — топ по балансу качество/скорость;

  • Bge-m3 близко по качеству, но ощутимо медленнее по созданию эмбеддинга.

  • Остальные модели себя не проявили.

Итоги теста №3 (поиск по SQL-учебнику на сложные запросы)

Мы решили протестировать поиск по SQL-базе знаний, когда в самом запросе используется SQL-код.

Например такого запроса:
«Чем INNER JOIN отличается от LEFT JOIN в запросе SELECT o.id, u.email FROM orders o LEFT JOIN users u ON u.id = o.user_id; с точки зрения результатов и производительности?»

Место

Модель

Баллы

Recall@5

Embedding (сек)

Search (сек)

?

gte_multilingual

34

0.183

0.3985

0.0312

?

bge_m3

30

0.183

2.5892

0.0433

?

intfloat_base

29

0.167

1.7280

0.0195

4️⃣

arctic

26

0.167

1.5614

0.0258

5️⃣

minilm

25

0.117

0.3149

0.0184

6️⃣

distiluse

25

0.183

0.7433

0.0199

7️⃣

intfloat_small

23

0.133

0.3300

0.0160

8️⃣

gte_base

14

0.167

0.3454

0.0222

9️⃣

rubert

9

0.033

0.2713

0.0318

Вывод третьего теста:

  • Мы оценили небольшое количество подобных "сложных" запросов, но результаты отличаются от предыдущего теста.

  • Когда в самих запросах мы используем SQL-код, все модели проявили себя достаточно плохо, recall@5 низкий у всех. И для решения подобных задач одного векторного поиска для retrieval мало.

  • Но стоит отметить, что по нашей бальной системе e5‑base и gte_multilingual остались в топе. 

Итоги нашего сравнения моделей

  1. Универсальный выбор под RU‑FAQ и RU+SQL-код:
    Intfloat/multilingual‑e5‑base — лучший общий баланс: стабильно топ‑1/топ‑2 на двух больших тестах, высокий Recall@5, умеренные временные метрики поиска и формирования эмбединга.

  2. Если критична скорость и стоимость ресурсов:
    Intfloat/multilingual‑e5‑small — близкое качество, но время формирование эмбеддингов в разы быстрее; отлично для массовой индексации и дешёвого CPU.

  3. Если сложный поиск на русском языке, где нельзя упустить “игру смыслов”:
    BAAI/bge‑m3 и более легкая sentence-transformers/distiluse-base-multilingual-cased-v2 лучше различают смысловые оттенки и контекст; минус bge‑m3 — достаточно медленная во всем.

  4. Если нужен мультиязычный компромисс и хорошее поведение на «хардовых» SQL:
    Alibaba‑NLP/gte‑multilingual‑base — была топ‑1 в «hard SQL» и регулярно держится в верхней группе, при этом достаточно быстрая.

  5. Модели, которые в наших условиях себя не проявили: RuBERT, MiniLM, Arctic, GTE‑base — стабильно ниже по суммарным баллам/Recall@5 на всех тестах. Возможные причины:

  • RuBERT- на базе BERT, обучена не для retrieval

  • MiniLM - очень лёгкий, емкости часто не хватает для нюансов русского языка и для смешанных случаев RU+код.

  • Arctic - «enterprise-ориентированный» энкодер, который сильнее на англоязычных документах и деловых текстах.

  • GTE‑base - фактически англоязычный энкодер.

Что выбрать для retrieval?

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

Если не знаете, с чего начать, универсальным стартом для корпоративного RAG будет связка E5-base + база Qdrant. На уровне индексации базы знаний желательно настроить chunking (200–500 слов с overlap 10–20 % без потери смысла) и сохранять метаданные для фильтров, нормализовать эмбеддинги (L2) и использовать одну и ту же метрику (cosine) при индексации и при поиске, чтобы векторная база и эмбеддинг-модель были «согласованы».

Кроме базового векторного поиска, для повышения качества retrieval-процесса используются разные стратегии извлечения, которые мы упомянули в статье. Мы обязательно разберём их на практике и вернёмся с подробными результатами тестов в других публикациях.

Комментарии (5)


  1. DataDiver
    31.10.2025 10:10

    спасибо за проделанную работу, и что поделились результатом!


  1. Marwin
    31.10.2025 10:10

    Почему не пробовали фриду и Qwen3-Embedding? Просто руки не дошли или чем-то не нравятся? фрида для русского прям неплоха. Qwen3 вообще очень сильный эмбеддер, по крайней мере 4b. Я попробовал на нём посчитать близость для вопросов про лук и команды - на всё ответил правильно. Ну и они в принципе в топе лидербордов mteb


    1. VagDV Автор
      31.10.2025 10:10

      Спасибо за комментарий! Да, Qwen 3-Embedding и Frida действительно в топах MTEB-лидербордов — согласен, их стоило рассмотреть.

      Qwen 3-Embedding-4B мы не включали из-за её «тяжеловесности»: модель поддерживает до 2560-мерных эмбеддингов и содержит 4 млрд параметров. Для честного сравнения с «средними» энкодерами (384–1024 d, ≈3–4 GB) ей нужно отдельное окружение с GPU, иначе на CPU она бы сильно просела по временным метрикам.

      Frida-2 как раз ближе по классу к нашему «лёгкому» набору моделей, но "руки не дошли".

      Одна из задач теста — проверить, как в практических условиях справляются более компактные модели без заметной потери качества. Так как в RAG-архитектуре retrieval — только один из этапов многоступенчатого пайплайна, для нас было критично скорость генерации эмбеддингов и поиска.


      1. Shado_vi
        31.10.2025 10:10

        Qwen 3-Embedding 0.6b?

        есть квантованный версии.
        например список моделей из статьи в Q4_K_M в среднем весят в районе 500 мб.
        Qwen 3-Embedding 4b в Q4_K_M где то 2.5 гб.

        CPU или iGPU?
        в случаях CPU вроде так же разными способами можно ускорить работу, преобразовав модель.


        1. VagDV Автор
          31.10.2025 10:10

          При квантации Qwen 3-Embedding-4B (Q4_K_M или INT8) размер действительно падает, и такую версию уже можно было рассмотреть в сравнении. Но в нашем тесте все модели использовались в нативных весах (BF16/FP16) без квантизации, и без аппаратного ускорения (мы держались в рамках PyTorch + CPU (AVX2), без iGPU и CUDA).

          Варианты с квантованными версиями и аппаратным ускорением как-нибудь вынесем в отдельные тесты.