
Мы рады представить новую функцию, которая делает создание приложений с семантическим поиском таким же простым, как написание 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. Также в Телеграм у нас есть большой русскоязычный чат.
ne_pridumal_nik
Спасибо за статью!
Где можно посмотреть как локальные модели подключить? И можно ли использовать для поиска картинок?