
Мы рады представить новую функцию, которая делает создание приложений с семантическим поиском таким же простым, как написание SQL-запроса: Автоэмбеддинги.
С этой возможностью Manticore Search берёт на себя генерацию эмбеддингов — никаких лишних пайплайнов, внешних сервисов и возни.
Проблема раньше
До этого семантический поиск означал сложности с:
отдельными ML-сервисами для генерации эмбеддингов,
управлением моделями,
синхронизацией приложения, сервиса эмбеддингов и поискового движка,
несовпадением размерностей векторов и сложностями с препроцессингом,
обеспечением одинаковой генерации эмбеддингов каждый раз.
Теперь всё это осталось в прошлом.
Что такое Автоэмбеддинги?
С автоэмбеддингами вы просто вставляете текст, а Manticore автоматически:
✨ генерирует эмбеддинги с помощью современных моделей
✨ сохраняет их в векторных индексах
✨ даёт возможность искать на естественном языке
✨ скрывает всю сложность, оставляя вам только работу над функционалом
Как это работает
Семантическое приложение создаётся всего в 3 шага:
1. Создание таблицы
CREATE TABLE products ( title TEXT, description TEXT, category STRING, price INT, vector FLOAT_VECTOR KNN_TYPE='hnsw' HNSW_SIMILARITY='l2' MODEL_NAME='sentence-transformers/all-MiniLM-L6-v2' FROM='title,description' );
Всё задаётся одной строкой: Manticore сам генерирует эмбеддинги, например, из полей title и description.
2. Добавление данных
INSERT INTO products(id, title, description, category, price) VALUES (1, 'green hiking backpack', 'Lightweight backpack suitable for hiking trails', 'outdoors', 5999), (2, 'laptop sleeve', 'Slim padded case for 15-inch laptops', 'electronics', 1999), ... (20, 'wooden puzzle box', 'Challenging mechanical puzzle made of natural wood', 'toys', 1899);
Данные охватывают разные категории: товары для отдыха, электронику, мебель, книги, игрушки и другое.
Обратите внимание: никаких векторов вручную — эмбеддинги генерируются автоматически.
(цены указаны в центах: 5999 = $59.99)
3. Поиск на естественном языке
SELECT id, title, description, price, knn_dist() FROM products WHERE knn(vector, 5, 'lightweight laptop backpack for trail hiking') LIMIT 5;
Результат:
| id | title | description | price | knn_dist() | | --- | ----------------------- | ------------------------------------------------ | ----- | ---------- | | 9 | outdoor laptop pack | Trail-optimized backpack with laptop sleeve | 7800 | 0.3539 | | 1 | green hiking backpack | Lightweight backpack suitable for hiking trails | 5999 | 0.5311 | | 5 | mountain hiking bag | Durable trail-ready backpack for mountain hikes | 8950 | 0.6203 | | 4 | black laptop backpack | Spacious backpack with padded laptop compartment | 6900 | 0.6578 | | 10 | compact hiking backpack | Light and foldable backpack for trail hikes | 4200 | 0.6859 |
Запрос «лёгкий рюкзак для ноутбука и походов» вернул в первую очередь «outdoor laptop pack» — он сочетает и ноутбук, и походы. Далее идут туристические и ноутбучные рюкзаки.
Выбираем подходящую модель
Можно использовать разные модели в зависимости от задач:
🏠 Локальные (Hugging Face) — без ключей и ограничений
🌐 OpenAI — лучшие по качеству семантики
🚀 Voyage и Jina — оптимизированы под разные языки и домены предметной области
Гибридный поиск и фильтрация (пример SQL)
Комбинируйте семантику, ключевые слова и структурные фильтры в одном запросе:
SELECT id, price, highlight() FROM products WHERE knn(vector, 7, 'lightweight laptop backpack for trail hiking') AND category = 'outdoors' AND MATCH('"lightweight laptop backpack for trail hiking"/0.5');
Результаты:
+------+-------+-----------------------------------------------------------------------------------------------+ | id | price | highlight() | +------+-------+-----------------------------------------------------------------------------------------------+ | 9 | 7800 | outdoor <b>laptop</b> pack | <b>Trail</b>-optimized <b>backpack</b> with <b>laptop</b> sleeve | | 1 | 5999 | green <b>hiking backpack</b> | <b>Lightweight backpack</b> suitable <b>for hiking</b> trails | | 5 | 8950 | mountain <b>hiking</b> bag | Durable <b>trail</b>-ready <b>backpack for</b> mountain hikes | | 10 | 4200 | compact <b>hiking backpack</b> | Light and foldable <b>backpack for trail</b> hikes | +------+-------+-----------------------------------------------------------------------------------------------+
Примечание: функция highlight() возвращает разметку (например, <b>...</b>).
Эта мощная комбинация одновременно:
фильтрует по категории (outdoors),
обеспечивает семантическую релевантность с помощью эмбеддингов,
требует совпадений на уровне текста через ключевые слова,
и подсвечивает найденные термины.
Всё это — в одном запросе!
Полная поддержка HTTP/JSON API
Автоэмбеддинги без проблем работают с HTTP/JSON API в Manticore, предоставляя тот же функционал, что и SQL, но через REST-эндпоинты.
Вставка данных через JSON (пример HTTP/JSON API)
Используйте эндпоинт /insert — эмбеддинги будут сгенерированы автоматически:
curl "http://localhost:9308/insert" -H "Content-Type: application/json" \ -d '{ "table": "products", "id": 21, "doc": { "title": "wireless headphones", "description": "Bluetooth headphones with noise cancellation", "category": "electronics", "price": 15900 } }'
Ответ:
{ "table": "products", "id": 21, "created": true, "result": "created", "status": 201 }
Массовая вставка с Автоэмбеддингами (пример HTTP/JSON API)
Вставляйте несколько документов сразу и эффективно с помощью эндпоинта /bulk:
curl "http://localhost:9308/bulk" -H "Content-Type: application/x-ndjson" \ --data-raw $'{"insert": {"table": "products", "id": 22, "doc": {"title": "gaming laptop", "description": "High-performance laptop for gaming and work", "category": "electronics", "price": 159900}}} {"insert": {"table": "products", "id": 23, "doc": {"title": "smartphone", "description": "Latest flagship smartphone with 5G", "category": "electronics", "price": 89900}}} {"insert": {"table": "products", "id": 24, "doc": {"title": "tablet computer", "description": "Lightweight tablet for work and entertainment", "category": "electronics", "price": 49900}}}'
Ответ:
{ "items": [ { "bulk": { "table": "products", "_id": 24, "created": 3, "deleted": 0, "updated": 0, "result": "created", "status": 201 } } ], "current_line": 3, "skipped_lines": 0, "errors": false, "error": "" }
Массовая операция успешно вставила 3 документа с автоматически сгенерированными эмбеддингами.
Семантический поиск через JSON (пример HTTP/JSON API)
Выполняйте поиск с естественно-языковыми запросами, используя эндпоинт /search:
curl "http://localhost:9308/search" -H "Content-Type: application/json" \ -d '{ "table": "products", "_source": ["title"], "size": 5, "knn": { "field": "vector", "query": "outdoor hiking adventure", "k": 3 } }'
Ответ:
`json { "took": 8, "timed_out": false, "hits": { "total": 24, "total_relation": "eq", "hits": [ { "_id": 18, "_score": 1, "_knn_dist": 0.75467718, "_source": { "title": "children's adventure book" } }, { "_id": 1, "_score": 1, "_knn_dist": 0.83226496, "_source": { "title": "green hiking backpack" } }, { "_id": 5, "_score": 1, "_knn_dist": 0.89348459, "_source": { "title": "mountain hiking bag" } }, { "_id": 10, "_score": 1, "_knn_dist": 0.92611158, "_source": { "title": "compact hiking backpack" } }, { "_id": 3, "_score": 1, "_knn_dist": 0.98721427, "_source": { "title": "travel daypack" } } ] } }
Запрос «outdoor hiking adventure» вернул первым children’s adventure book (расстояние 0.755), а затем — рюкзаки для походов. Это показывает, что семантический поиск находит концептуально близкие вещи, а не только точные ключевые слова.
Фильтрация и гибридный поиск через JSON (пример HTTP/JSON API)
Комбинируйте семантический поиск с традиционными фильтрами:
curl "http://localhost:9308/search" -H "Content-Type: application/json" \ -d '{ "table": "products", "_source": ["title", "price"], "size": 5, "knn": { "field": "vector", "query": "technology electronic device", "k": 5, "filter": { "range": {"price": {"gte": 15000}} } } }'
Ответ:
{ "took": 10, "timed_out": false, "hits": { "total": 5, "total_relation": "eq", "hits": [ { "_id": 24, "_score": 1, "_knn_dist": 1.31113040, "_source": { "title": "tablet computer", "price": 49900 } }, { "_id": 23, "_score": 1, "_knn_dist": 1.56920886, "_source": { "title": "smartphone", "price": 89900 } }, { "_id": 22, "_score": 1, "_knn_dist": 1.59042466, "_source": { "title": "gaming laptop", "price": 159900 } }, { "_id": 16, "_score": 1, "_knn_dist": 1.84979212, "_source": { "title": "office chair", "price": 27900 } }, { "_id": 21, "_score": 1, "_knn_dist": 1.88567829, "_source": { "title": "wireless headphones", "price": 15900 } } ] } }
Запрос «technology electronic device» с фильтром по цене (≥ $150) правильно приоритизировал электронику и исключил дешёвые товары вроде походных рюкзаков или мелкой техники. «Tablet computer» оказался выше всего из-за сильного семантического совпадения.
Векторы вручную vs автоэмбеддинги
HTTP/JSON API и SQL интерфейс поддерживают оба варианта:
автоэмбеддинги:
"query": "outdoor hiking adventure"вручную заданные векторы:
"query": [0.1, 0.2, 0.3, ...]
Это даёт гибкость — можно смешивать автоэмбеддинги и свои предварительно вычисленные векторы в одном приложении.
Интеграция с OpenAI
Для ещё более точного семантического понимания вы можете использовать модели эмбеддингов OpenAI:
-- Create table with OpenAI embeddings CREATE TABLE products_openai ( title TEXT, description TEXT, category string, price INT, vector FLOAT_VECTOR KNN_TYPE='hnsw' HNSW_SIMILARITY='l2' MODEL_NAME='openai/text-embedding-ada-002' FROM='title, description' API_KEY='your-openai-api-key' ); -- Insert data (embeddings generated via OpenAI API) INSERT INTO products_openai(title, description, category, price) VALUES ('smartphone device', 'latest mobile technology with advanced features', 'electronics', 79900), ('laptop computer', 'portable workstation for developers and professionals', 'electronics', 129900); -- Search with natural language SELECT id, title, description, knn_dist() FROM products_openai WHERE knn(vector, 2, 'mobile phone technology');
Результаты:
+---------------------+-------------------+-------------------------------------------------------+------------+ | id | title | description | knn_dist() | +---------------------+-------------------+-------------------------------------------------------+------------+ | 2309215617435041807 | smartphone device | latest mobile technology with advanced features | 0.20333229 | | 2309215617435041808 | laptop computer | portable workstation for developers and professionals | 0.40197325 | +---------------------+-------------------+-------------------------------------------------------+------------+
Например, запрос «mobile phone technology» правильно распознал, что смартфон куда ближе по смыслу, чем ноутбук.
Для продакшена
⚡ Быстро: индексация HNSW, опциональная квантизация, оптимизированное хранение
🛡️ Надёжно: несколько провайдеров моделей, защита от пустых векторов
🔧 Гибко: можно строить эмбеддинги из любых полей
Где использовать Автоэмбеддинги
🛍️ Поиск в e-commerce: «водонепроницаемые ботинки для походов» → релевантные товары
📚 Поиск документов: «контракты о защите данных» → нужные юридические документы
🎵 Рекомендации контента: «энергичная музыка для тренировок» → подбор по настроению
🏠 Поиск недвижимости: «уютные квартиры рядом с парком» → объявления, подходящие по стилю жизни
Ещё примеры
Давайте посмотрим, как Автоэмбеддинги работают на практике в разных сценариях поиска:
Поиск товаров для работы и продуктивности
SELECT id, title, description, price, knn_dist() FROM products WHERE knn(vector, 3, 'work productivity office') LIMIT 3;
Результаты:
+------+----------------------+----------------------------------------------------------+-------+------------+ | id | title | description | price | knn_dist() | +------+----------------------+----------------------------------------------------------+-------+------------+ | 24 | tablet computer | Lightweight tablet for work and entertainment | 49900 | 1.306459 | | 16 | office chair | Ergonomic office chair with lumbar support and mesh back | 27900 | 1.44871426 | | 17 | notebook and pen set | Elegant A5 notebook with smooth-writing pen | 1200 | 1.48466742 | +------+----------------------+----------------------------------------------------------+-------+------------+
Запрос «work productivity office» вернул офисную мебель, канцелярию и рабочие аксессуары.
Умная фильтрация по категориям
Иногда семантический поиск оказывается слишком широким. Запрос «usb charger for outdoor camping» без фильтра вернул солнечные зарядки, рюкзаки и туристическое снаряжение.
SELECT id, title, description, price, knn_dist() FROM products WHERE knn(vector, 5, 'usb charger for outdoor camping');
Но если добавить фильтрацию по категории:
SELECT id, highlight() FROM products WHERE knn(vector, 5, 'usb charger for outdoor camping') AND category = 'electronics' AND MATCH('"usb charger for outdoor camping"/0.5') LIMIT 3;
Точный результат:
+------+-------------------------------------------------------------------------------------------------------+ | id | highlight() | +------+-------------------------------------------------------------------------------------------------------+ | 11 | portable solar <b>charger</b> | Foldable solar panel <b>charger for</b> phones and <b>USB</b> devices | +------+-------------------------------------------------------------------------------------------------------+
Примечание: функция highlight() возвращает разметку (например, <b>...</b>). Жирный шрифт в таблице приведён для удобства чтения.
Комбинация семантического понимания + фильтрации по категории + поиска по ключевым словам дала нам именно то, что мы хотели!
Поиск для развлечений и креатива
SELECT id, title, description, price, knn_dist() FROM products WHERE knn(vector, 3, 'fun creative play toys') LIMIT 3;
Результаты:
+------+---------------------------+----------------------------------------------------+-------+------------+ | id | title | description | price | knn_dist() | +------+---------------------------+----------------------------------------------------+-------+------------+ | 8 | camping gear set | Complete set for weekend camping adventures | 12000 | 1.30462146 | | 20 | wooden puzzle box | Challenging mechanical puzzle made of natural wood | 1899 | 1.305056 | | 18 | children's adventure book | Illustrated storybook about outdoor exploration | 1299 | 1.47192979 | +------+---------------------------+----------------------------------------------------+-------+------------+
Автоэмбеддинги поняли идею «fun creative play» и нашли снаряжение для приключений, головоломки и детские книги — всё, что связано с творчеством и игрой.
Что внутри
Автоэмбеддинги используют:
Sentence Transformers для понимания смысла,
HNSW для быстрого поиска по сходству,
умное кэширование для эффективной работы,
Мульти-провайдерные API для гибкости.
Попробуйте прямо сейчас
Как видно из примеров, Автоэмбеддинги дают мощные возможности семантического поиска при минимальной настройке. Будь то:
платформы e-commerce с поиском по естественному языку,
системы управления контентом с умным поиском документов,
рекомендательные движки, которые понимают намерения пользователей,
базы знаний с семантическими ответами на вопросы,
Автоэмбеддинги снимают самую сложную часть — управление эмбеддингами.
А вы можете сосредоточиться на создании функций, которые любят пользователи.
🚀 Готовы прокачать поиск?
👉 Скачайте Manticore Search и попробуйте Автоэмбеддинги.
📚 Ознакомьтесь с документацией по KNN.
💬 Присоединяйтесь к Slack-сообществу и делитесь опытом.
Вопрос�� или отзывы? Добро пожаловать на форум сообщества или в Twitter. Также в Телеграм у нас есть большой русскоязычный чат.
