Эмбеддинги и семантический поиск на своём VPS
Эмбеддинги — это числовые векторы, в которых близкие по смыслу тексты оказываются рядом. На них держится вся современная поисковая магия. Научимся считать их прямо на VPS, без внешних API и утечек данных.
Содержание
Что такое эмбеддинги простыми словами
['Модель-энкодер превращает текст в вектор из сотен чисел. Похожие фразы дают похожие векторы, и близость между ними легко посчитать. Так «как вернуть товар» и «оформление возврата покупки» окажутся рядом, хотя слов общих почти нет.', 'Это работает для любого языка и для смеси языков, если модель мультиязычная. Отсюда — семантический поиск, кластеризация, дедупликация, классификация и вся база под 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\npip install sentence-transformers torch --extra-index-url \\\n https://download.pytorch.org/whl/cpu', 'Ставим CPU-версию torch — она в разы легче, а GPU для эмбеддингов обычно не нужен. Первый запуск скачает модель в ~/.cache/huggingface.']
Считаем и ищем
['Базовый пример: векторизуем корпус, потом ищем ближайшие к запросу.', 'from sentence_transformers import SentenceTransformer, util\n\nm = SentenceTransformer("intfloat/multilingual-e5-base")\ndocs = ["passage: возврат товара в течение 14 дней",\n "passage: график работы поддержки"]\ndoc_emb = m.encode(docs, normalize_embeddings=True)\n\nq = m.encode("query: как вернуть покупку", normalize_embeddings=True)\nscores = util.cos_sim(q, doc_emb)\nprint(scores)', 'Обратите внимание на префиксы query: и passage: — модели семейства e5 обучены с ними, без префиксов качество падает. И всегда нормализуйте векторы, чтобы косинус считался корректно.']
Батчинг и скорость на CPU
['Кодировать по одному тексту — расточительство. Собирайте батчи по 32–64 штуки, так CPU загружается эффективнее. Ограничьте потоки, чтобы не задушить сервер:', 'import torch\ntorch.set_num_threads(4)\nemb = m.encode(texts, batch_size=64, normalize_embeddings=True,\n 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 для эмбеддинговНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Какую модель выбрать для русского?
multilingual-e5-base — хороший баланс качества и скорости. Если нужна максимальная скорость на слабом сервере, возьмите e5-small.
Обязателен ли GPU?
Нет. Для эмбеддингов CPU-инференса достаточно, особенно на быстрых ядрах EPYC. GPU оправдан только при потоковой векторизации миллионов документов в час.
Зачем префиксы query и passage?
Так обучены модели e5: query для запросов, passage для документов. Без них асимметрия теряется и релевантность падает.
Можно ли смешивать языки?
Да, мультиязычные модели кладут смысл в одно пространство, поэтому русский запрос найдёт английский документ по смыслу.