Цифровой дворник

embeddings

Обложка

Есть вещи, которые в homelab долго живут «на всякий случай». Я когда-то стянул модель bge-m3 в ollama, не особо понимая зачем — просто прозвучало убедительно. А потом она всплыла сразу в двух местах: в семантическом поиске по заметкам и в долговременной памяти ассистента. Пришлось разобраться, что это вообще такое. Делюсь, чтобы не пришлось разбираться с нуля.

Что такое embedding-модель

Коротко: это модель, которая превращает текст в вектор — набор чисел фиксированной длины, описывающих смысл. Не формулировку, а именно смысл.

Зачем это нужно: обычный поиск (grep, полнотекст) ищет точные совпадения. Набрал «туннель к роутеру» — не найдёт запись, где написано «SSH-проброс до шлюза». А векторы ловят смысл: два текста про одно и то же окажутся рядом в векторном пространстве, даже если слова разные. Отсюда «поиск по смыслу», RAG, рекомендации и прочая магия.

Что такое bge-m3

bge-m3 — модель от BAAI (это китайская лаборатория, авторы флагманских bge-эмбеддингов). Название расшифровывается просто:

  • Multi-linguality — многоязычность: 100+ языков, русский в их числе, причём не «как-нибудь», а нормально;
  • Multi-functionality — три режима в одной модели: плотные векторы (dense), разреженные (sparse/лексический поиск) и мульти-векторное представление (в духе ColBERT);
  • Multi-granularity — работает и с короткими запросами, и с длинными документами (до 8192 токенов на вход).

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

Ключевые цифры:

  • 1024 измерения в dense-векторе;
  • ~1.2 ГБ весов — помещается в память любого современного GPU и даже в CPU-контейнер без боли;
  • бесплатно и локально — ничего не улетает в облако, нет лимитов и оплаты за запрос;
  • скорость на нашей AMD-видеокарте с ROCm — десятки миллисекунд на эмбеддинг, для поиска по своей базе хватает с запасом.

Почему bge-m3, а не альтернативы

Выбор на деле невелик, если хочется русский и локально:

  • nomic-embed-text — легче (270 МБ) и быстрее, но 768 измерений и заметно слабее на русском. Годится для английского, для смешанной базы — компромисс.
  • OpenAI text-embedding-3-small — хороша, но это облако: данные уходят наружу, плюс оплата за каждый запрос. Для приватной базы — не вариант.
  • multilingual-e5 / e5-large — многоязычные, но их русификация слабее, чем у bge-m3, а русскоязычных бенчмарков у них меньше.

bge-m3 выигрывает именно на связке «русский + локально + бесплатно». Не самая лёгкая, не самая быстрая — но самая сбалансированная для домашней базы знаний.

Установка

Если уже стоит ollama — всё сводится к одной команде:

ollama pull bge-m3

Модель подтягивается сама, вместе с весами. Дальше можно дёргать её двумя способами.

Нативный API ollama:

curl http://localhost:11434/api/embed -d '{
  "model": "bge-m3",
  "input": "настроить туннель к роутеру"
}'

Либо через OpenAI-совместимый эндпоинт /v1/embeddings — он удобен, потому что под него заточены почти все библиотеки и плагины (тот же агент с долговременной памятью подключается к нему как к обычному OpenAI).

Грабли

Одна, но неприятная: bge-m3 не поддерживает параметр dimensions. Это фиксированная модель на 1024 измерения, «урезать» её под другой размер нельзя (нет matryoshka-представления, как у OpenAI).

Если ваш код по привычке шлёт dimensions — ollama вернёт 400 «does not support matryoshka representation». Лечится просто: убрать параметр, а в интеграциях выставить sendDimensions: false.

Вторая, уже из жизни homelab: модель должна быть живой и доступной по сети. Если ollama в контейнере остановлен или до него нет маршрута из соседней подсети — всё, что на неё завязано, молча деградирует. Проверить легко: curl http://<host>:11434/api/tags должен вернуть список моделей.

Где это пригождается

У нас bge-m3 всплыла в двух местах:

  • семантический поиск по заметкам — вместо грепа по папке ищем по смыслу;
  • долговременная память ассистента — плагин превращает разговоры в векторы и подмешивает релевантные воспоминания в контекст.

Но это только два применения. Подойдёт любой сценарий «найти похожее»: поиск по логам и инцидентам, дедупликация, рекомендации, подбор похожих статей.

Наши замеры

Модель стоит на контейнере с ollama и AMD-видеокартой (ROCm). Замеряли на живой сессии, не в лаборатории:

  • Скорость поиска: первый recall после установки занял 334 мс — из них полнотекстовый поиск (FTS) 78 мс, векторный 258 мс;
  • Нагрузка на GPU: bge-m3 лежит целиком в VRAM — 0.66 ГБ;
  • Размер индекса: 55 чанков заметок индексируются за пару минут, сам поиск — миллисекунды;
  • Точность на наших вопросах: 0.62 / 0.55 / 0.51 — вопрос задаёшь своими словами, находится нужный чанк, даже если ни одно слово не совпало;
  • Память агента: в контекст подмешивается ~500–700 символов релевантных воспоминаний перед каждым ходом.

Для сравнения: сессия агента на 1.5 часа до установки памяти съедала 247 тысяч токенов и 25% окна контекста — поиск по смыслу заметно уменьшает потребность пересказывать контекст с нуля.

Итог

bge-m3 — это та модель, которую приятно держать локально: бесплатная, понимает русский, ставится одной командой и закрывает любые задачи на «поиск по смыслу». Единственное, что нужно помнить, — фиксированные 1024 измерения и живой ollama за спиной.

Если у вас уже крутится ollama — попробуйте, потерять нечего: одна команда и можно гонять эмбеддинги прямо сейчас.

Ссылки

— BGE-M3 на HuggingFace

— BGE-M3 в библиотеке Ollama

— Ollama

#selfhosting #openclaw #embeddings