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

Комментарии (0)


  1. ne_pridumal_nik
    19.09.2025 06:24

    Спасибо за статью!

    Где можно посмотреть как локальные модели подключить? И можно ли использовать для поиска картинок?