Эмбеддинги и семантический поиск на своём VPS
Эмбеддинги — это числовые векторы, в которых близкие по смыслу тексты оказываются рядом. На них держится вся современная поисковая магия. Научимся считать их прямо на VPS, без внешних API и утечек данных.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое эмбеддинги простыми словами
Модель-энкодер превращает текст в вектор из сотен чисел. Похожие фразы дают похожие векторы, и близость между ними легко посчитать. Так «как вернуть товар» и «оформление возврата покупки» окажутся рядом, хотя слов общих почти нет.
Это работает для любого языка и для смеси языков, если модель мультиязычная. Отсюда — семантический поиск, кластеризация, дедупликация, классификация и вся база под RAG.
Важно понимать: близость векторов измеряют не «на глаз», а метрикой. Чаще всего это косинусное расстояние — угол между векторами. Чем меньше угол, тем ближе смысл. Именно поэтому векторы почти всегда нормализуют перед сравнением: тогда косинус превращается в простое скалярное произведение, а поиск ускоряется.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для эмбеддинговЛокально или через API
У внешних API (OpenAI, Cohere) удобство есть, но каждый запрос — это деньги и отправка ваших текстов наружу. Локальная модель на VPS считает эмбеддинги бесплатно после установки и не выпускает данные за пределы сервера.
Для CPU-инференса хорошо подходят компактные мультиязычные модели: intfloat/multilingual-e5-base (768 измерений) и e5-small (384). Small в разы быстрее и легче, base — точнее.
- API — ноль настройки, но платно и данные уходят
- Локально на CPU — приватно, дёшево, чуть медленнее
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Ставим модель на сервер
Виртуальное окружение и библиотеки:
python3 -m venv ~/emb && source ~/emb/bin/activate
pip install sentence-transformers torch --extra-index-url \
https://download.pytorch.org/whl/cpu
Ставим CPU-версию torch — она в разы легче, а GPU для эмбеддингов обычно не нужен. Первый запуск скачает модель в ~/.cache/huggingface.
Считаем и ищем
Базовый пример: векторизуем корпус, потом ищем ближайшие к запросу.
from sentence_transformers import SentenceTransformer, util
m = SentenceTransformer("intfloat/multilingual-e5-base")
docs = ["passage: возврат товара в течение 14 дней",
"passage: график работы поддержки"]
doc_emb = m.encode(docs, normalize_embeddings=True)
q = m.encode("query: как вернуть покупку", normalize_embeddings=True)
scores = util.cos_sim(q, doc_emb)
print(scores)
Обратите внимание на префиксы query: и passage: — модели семейства e5 обучены с ними, без префиксов качество падает. И всегда нормализуйте векторы, чтобы косинус считался корректно.
Батчинг и скорость на CPU
Кодировать по одному тексту — расточительство. Собирайте батчи по 32–64 штуки, так CPU загружается эффективнее. Ограничьте потоки, чтобы не задушить сервер:
import torch
torch.set_num_threads(4)
emb = m.encode(texts, batch_size=64, normalize_embeddings=True,
show_progress_bar=True)
На AMD EPYC у MAATRIX высокая производительность на ядро, поэтому даже без GPU e5-base уверенно выдаёт сотни текстов в секунду — для индексации базы этого более чем достаточно.
Куда складывать векторы
Посчитанные эмбеддинги нужно где-то хранить и быстро искать. Для тысяч записей хватит numpy-массива в памяти. Для десятков тысяч и выше берите векторную БД — Qdrant или pgvector.
Связка «локальные эмбеддинги + Qdrant» — типовой стек для приватного семантического поиска. Данные не покидают ваш VPS ни на одном этапе.
Один нюанс, о который спотыкаются новички: размерность векторов у модели и у коллекции в базе должна совпадать. Если энкодер выдаёт 768 чисел, коллекция тоже должна быть на 768. И нельзя смешивать в одной коллекции векторы от разных моделей — расстояния между ними будут бессмысленными. Смените модель — переиндексируйте всё заново.
Наконец, держите модель загруженной в память один раз, а не читайте её на каждый запрос. В сервисе загрузите SentenceTransformer при старте и переиспользуйте объект — иначе каждый запрос будет тратить секунды на инициализацию впустую.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для эмбеддинговОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Какую модель выбрать для русского?
multilingual-e5-base — хороший баланс качества и скорости. Если нужна максимальная скорость на слабом сервере, возьмите e5-small.
Обязателен ли GPU?
Нет. Для эмбеддингов CPU-инференса достаточно, особенно на быстрых ядрах EPYC. GPU оправдан только при потоковой векторизации миллионов документов в час.
Зачем префиксы query и passage?
Так обучены модели e5: query для запросов, passage для документов. Без них асимметрия теряется и релевантность падает.
Можно ли смешивать языки?
Да, мультиязычные модели кладут смысл в одно пространство, поэтому русский запрос найдёт английский документ по смыслу.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.