<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>embeddings &amp;mdash; Цифровой дворник</title>
    <link>https://articles.clr58.ru/tag:embeddings</link>
    <description>Практические заметки о сетях, self-hosting, виртуализации, мониторинге, автоматизации и локальном ИИ.</description>
    <pubDate>Wed, 30 Sep 2026 01:15:42 +0000</pubDate>
    <item>
      <title>bge-m3: локальная embedding-модель, которая понимает русский бесплатно</title>
      <link>https://articles.clr58.ru/bge-m3</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Есть вещи, которые в homelab долго живут «на всякий случай». Я когда-то стянул модель bge-m3 в ollama, не особо понимая зачем — просто прозвучало убедительно. А потом она всплыла сразу в двух местах: в семантическом поиске по заметкам и в долговременной памяти ассистента. Пришлось разобраться, что это вообще такое. Делюсь, чтобы не пришлось разбираться с нуля.&#xA;&#xA;Что такое embedding-модель&#xA;&#xA;Коротко: это модель, которая превращает текст в вектор — набор чисел фиксированной длины, описывающих смысл. Не формулировку, а именно смысл.&#xA;&#xA;Зачем это нужно: обычный поиск (grep, полнотекст) ищет точные совпадения. Набрал «туннель к роутеру» — не найдёт запись, где написано «SSH-проброс до шлюза». А векторы ловят смысл: два текста про одно и то же окажутся рядом в векторном пространстве, даже если слова разные. Отсюда «поиск по смыслу», RAG, рекомендации и прочая магия.&#xA;&#xA;Что такое bge-m3&#xA;&#xA;bge-m3 — модель от BAAI (это китайская лаборатория, авторы флагманских bge-эмбеддингов). Название расшифровывается просто:&#xA;&#xA;Multi-linguality — многоязычность: 100+ языков, русский в их числе, причём не «как-нибудь», а нормально;&#xA;Multi-functionality — три режима в одной модели: плотные векторы (dense), разреженные (sparse/лексический поиск) и мульти-векторное представление (в духе ColBERT);&#xA;Multi-granularity — работает и с короткими запросами, и с длинными документами (до 8192 токенов на вход).&#xA;&#xA;Для практики важнее всего первое: многоязычность. Большинство популярных локальных эмбеддингов заточены под английский, а bge-m3 из коробки понимает русский.&#xA;&#xA;Ключевые цифры:&#xA;&#xA;1024 измерения в dense-векторе;&#xA;~1.2 ГБ весов — помещается в память любого современного GPU и даже в CPU-контейнер без боли;&#xA;бесплатно и локально — ничего не улетает в облако, нет лимитов и оплаты за запрос;&#xA;скорость на нашей AMD-видеокарте с ROCm — десятки миллисекунд на эмбеддинг, для поиска по своей базе хватает с запасом.&#xA;&#xA;Почему bge-m3, а не альтернативы&#xA;&#xA;Выбор на деле невелик, если хочется русский и локально:&#xA;&#xA;nomic-embed-text — легче (270 МБ) и быстрее, но 768 измерений и заметно слабее на русском. Годится для английского, для смешанной базы — компромисс.&#xA;OpenAI text-embedding-3-small — хороша, но это облако: данные уходят наружу, плюс оплата за каждый запрос. Для приватной базы — не вариант.&#xA;multilingual-e5 / e5-large — многоязычные, но их русификация слабее, чем у bge-m3, а русскоязычных бенчмарков у них меньше.&#xA;&#xA;bge-m3 выигрывает именно на связке «русский + локально + бесплатно». Не самая лёгкая, не самая быстрая — но самая сбалансированная для домашней базы знаний.&#xA;&#xA;Установка&#xA;&#xA;Если уже стоит ollama — всё сводится к одной команде:&#xA;&#xA;ollama pull bge-m3&#xA;&#xA;Модель подтягивается сама, вместе с весами. Дальше можно дёргать её двумя способами.&#xA;&#xA;Нативный API ollama:&#xA;&#xA;curl http://localhost:11434/api/embed -d &#39;{&#xA;  &#34;model&#34;: &#34;bge-m3&#34;,&#xA;  &#34;input&#34;: &#34;настроить туннель к роутеру&#34;&#xA;}&#39;&#xA;&#xA;Либо через OpenAI-совместимый эндпоинт /v1/embeddings — он удобен, потому что под него заточены почти все библиотеки и плагины (тот же агент с долговременной памятью подключается к нему как к обычному OpenAI).&#xA;&#xA;Грабли&#xA;&#xA;Одна, но неприятная: bge-m3 не поддерживает параметр dimensions. Это фиксированная модель на 1024 измерения, «урезать» её под другой размер нельзя (нет matryoshka-представления, как у OpenAI).&#xA;&#xA;Если ваш код по привычке шлёт dimensions — ollama вернёт 400 «does not support matryoshka representation». Лечится просто: убрать параметр, а в интеграциях выставить sendDimensions: false.&#xA;&#xA;Вторая, уже из жизни homelab: модель должна быть живой и доступной по сети. Если ollama в контейнере остановлен или до него нет маршрута из соседней подсети — всё, что на неё завязано, молча деградирует. Проверить легко: curl http://host:11434/api/tags должен вернуть список моделей.&#xA;&#xA;Где это пригождается&#xA;&#xA;У нас bge-m3 всплыла в двух местах:&#xA;&#xA;семантический поиск по заметкам — вместо грепа по папке ищем по смыслу;&#xA;долговременная память ассистента — плагин превращает разговоры в векторы и подмешивает релевантные воспоминания в контекст.&#xA;&#xA;Но это только два применения. Подойдёт любой сценарий «найти похожее»: поиск по логам и инцидентам, дедупликация, рекомендации, подбор похожих статей.&#xA;&#xA;Наши замеры&#xA;&#xA;Модель стоит на контейнере с ollama и AMD-видеокартой (ROCm). Замеряли на живой сессии, не в лаборатории:&#xA;&#xA;Скорость поиска: первый recall после установки занял 334 мс — из них полнотекстовый поиск (FTS) 78 мс, векторный 258 мс;&#xA;Нагрузка на GPU: bge-m3 лежит целиком в VRAM — 0.66 ГБ;&#xA;Размер индекса: 55 чанков заметок индексируются за пару минут, сам поиск — миллисекунды;&#xA;Точность на наших вопросах: 0.62 / 0.55 / 0.51 — вопрос задаёшь своими словами, находится нужный чанк, даже если ни одно слово не совпало;&#xA;Память агента: в контекст подмешивается ~500–700 символов релевантных воспоминаний перед каждым ходом.&#xA;&#xA;Для сравнения: сессия агента на 1.5 часа до установки памяти съедала 247 тысяч токенов и 25% окна контекста — поиск по смыслу заметно уменьшает потребность пересказывать контекст с нуля.&#xA;&#xA;Итог&#xA;&#xA;bge-m3 — это та модель, которую приятно держать локально: бесплатная, понимает русский, ставится одной командой и закрывает любые задачи на «поиск по смыслу». Единственное, что нужно помнить, — фиксированные 1024 измерения и живой ollama за спиной.&#xA;&#xA;Если у вас уже крутится ollama — попробуйте, потерять нечего: одна команда и можно гонять эмбеддинги прямо сейчас.&#xA;&#xA;Ссылки&#xA;&#xA;— BGE-M3 на HuggingFace&#xA;&#xA;— BGE-M3 в библиотеке Ollama&#xA;&#xA;— Ollama&#xA;&#xA;#selfhosting #openclaw #embeddings&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-bge-m3-cover-v2-digclean.jpg" alt="Обложка"></p>

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

<h2 id="что-такое-embedding-модель">Что такое embedding-модель</h2>

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

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

<h2 id="что-такое-bge-m3">Что такое bge-m3</h2>

<p>bge-m3 — модель от BAAI (это китайская лаборатория, авторы флагманских bge-эмбеддингов). Название расшифровывается просто:</p>
<ul><li><strong>M</strong>ulti-linguality — многоязычность: 100+ языков, русский в их числе, причём не «как-нибудь», а нормально;</li>
<li><strong>M</strong>ulti-functionality — три режима в одной модели: плотные векторы (dense), разреженные (sparse/лексический поиск) и мульти-векторное представление (в духе ColBERT);</li>
<li><strong>M</strong>ulti-granularity — работает и с короткими запросами, и с длинными документами (до 8192 токенов на вход).</li></ul>

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

<p>Ключевые цифры:</p>
<ul><li><strong>1024 измерения</strong> в dense-векторе;</li>
<li><strong>~1.2 ГБ</strong> весов — помещается в память любого современного GPU и даже в CPU-контейнер без боли;</li>
<li><strong>бесплатно и локально</strong> — ничего не улетает в облако, нет лимитов и оплаты за запрос;</li>
<li>скорость на нашей AMD-видеокарте с ROCm — десятки миллисекунд на эмбеддинг, для поиска по своей базе хватает с запасом.</li></ul>

<h2 id="почему-bge-m3-а-не-альтернативы">Почему bge-m3, а не альтернативы</h2>

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

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

<h2 id="установка">Установка</h2>

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

<pre><code class="language-bash">ollama pull bge-m3
</code></pre>

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

<p>Нативный API ollama:</p>

<pre><code class="language-bash">curl http://localhost:11434/api/embed -d &#39;{
  &#34;model&#34;: &#34;bge-m3&#34;,
  &#34;input&#34;: &#34;настроить туннель к роутеру&#34;
}&#39;
</code></pre>

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

<h2 id="грабли">Грабли</h2>

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

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

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

<h2 id="где-это-пригождается">Где это пригождается</h2>

<p>У нас bge-m3 всплыла в двух местах:</p>
<ul><li><strong>семантический поиск по заметкам</strong> — вместо грепа по папке ищем по смыслу;</li>
<li><strong>долговременная память ассистента</strong> — плагин превращает разговоры в векторы и подмешивает релевантные воспоминания в контекст.</li></ul>

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

<h2 id="наши-замеры">Наши замеры</h2>

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

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

<h2 id="итог">Итог</h2>

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

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

<h2 id="ссылки">Ссылки</h2>

<p>— <a href="https://huggingface.co/BAAI/bge-m3">BGE-M3 на HuggingFace</a></p>

<p>— <a href="https://ollama.com/library/bge-m3">BGE-M3 в библиотеке Ollama</a></p>

<p>— <a href="https://ollama.com/">Ollama</a></p>

<p><a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a> <a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:embeddings" class="hashtag"><span>#</span><span class="p-category">embeddings</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/bge-m3</guid>
      <pubDate>Fri, 21 Aug 2026 12:48:47 +0000</pubDate>
    </item>
  </channel>
</rss>