Manticore Search поддерживает возможность добавления эмбеддингов, сгенерированных моделями машинного обучения, к каждому документу, а затем выполнение поиска ближайших соседей по ним. Это позволяет создавать такие функции, как поиск по сходству, рекомендации, семантический поиск и ранжирование по релевантности на основе алгоритмов NLP, среди прочего, включая поиск по изображениям, видео и звуку.
Эмбеддинг — это метод представления данных — таких как текст, изображения или звук — в виде векторов в многомерном пространстве. Эти векторы созданы таким образом, чтобы расстояние между ними отражало сходство представляемых ими данных. Этот процесс обычно использует такие алгоритмы, как word embeddings (например, Word2Vec, BERT) для текста или нейронные сети для изображений. Многомерная природа векторного пространства, с большим количеством компонентов на вектор, позволяет представлять сложные и тонкие взаимосвязи между элементами. Их сходство измеряется расстоянием между этими векторами, часто с использованием таких методов, как евклидово расстояние или косинусное сходство.
Manticore Search позволяет выполнять поиск по векторам методом k-ближайших соседей (KNN) с использованием библиотеки HNSW. Эта функциональность является частью Manticore Columnar Library.
Для выполнения KNN-поиска необходимо сначала настроить вашу таблицу. Векторы с плавающей точкой и KNN-поиск поддерживаются только в реальном времени (не в обычных таблицах). Таблица должна иметь хотя бы один атрибут типа float_vector, который служит вектором данных. Необходимо указать следующие свойства:
-
knn_type: Обязательная настройка; в настоящее время поддерживается толькоhnsw. -
knn_dims: Обязательная настройка, которая определяет размерность индексируемых векторов. -
hnsw_similarity: Обязательная настройка, которая определяет функцию расстояния, используемую индексом HNSW. Допустимые значения:L2- Квадрат L2IP- Скалярное произведениеCOSINE- Косинусное сходство
Примечание: При использовании сходства
COSINEвекторы автоматически нормализуются при вставке. Это означает, что сохраненные значения векторов могут отличаться от исходных входных значений, так как они будут преобразованы в единичные векторы (векторы с математической длиной/величиной 1.0) для обеспечения эффективных вычислений косинусного сходства. Эта нормализация сохраняет направление вектора, стандартизируя его длину. -
hnsw_m: Необязательная настройка, определяющая максимальное количество исходящих соединений в графе. По умолчанию 16. -
hnsw_ef_construction: Необязательная настройка, определяющая компромисс между временем построения и точностью. По умолчанию 200.
- SQL
- Config
create table test ( title text, image_vector float_vector knn_type='hnsw' knn_dims='4' hnsw_similarity='l2' );Query OK, 0 rows affected (0.01 sec)Самый простой способ работы с векторными данными — использование автоэмбеддингов. С этой функцией вы создаете таблицу с параметрами MODEL_NAME и FROM, а затем просто вставляете свои текстовые данные — Manticore автоматически генерирует эмбеддинги для вас.
При создании таблицы для автоэмбеддингов укажите:
MODEL_NAME: Модель эмбеддинга для использованияFROM: Какие поля использовать для генерации эмбеддингов (пустое значение означает все текстовые/строковые поля)
Поддерживаемые модели эмбеддингов:
- Sentence Transformers: Любая подходящая модель на основе BERT из Hugging Face (например,
sentence-transformers/all-MiniLM-L6-v2) — ключ API не требуется. Manticore загружает модель при создании таблицы. - Qwen локальные эмбеддинги: Модели эмбеддингов Qwen, такие как
Qwen/Qwen3-Embedding-0.6B— ключ API не требуется. Manticore загружает модель при создании таблицы. - OpenAI: Модели эмбеддингов OpenAI, такие как
openai/text-embedding-ada-002- требует параметрAPI_KEY='<OPENAI_API_KEY>' - Voyage: Модели эмбеддингов Voyage AI - требует параметр
API_KEY='<VOYAGE_API_KEY>' - Jina: Модели эмбеддингов Jina AI - требует параметр
API_KEY='<JINA_API_KEY>'
Более подробную информацию о настройке атрибута float_vector можно найти здесь.
- SQL
- Config
Использование sentence-transformers (ключ API не требуется)
CREATE TABLE products (
title TEXT,
description TEXT,
embedding_vector FLOAT_VECTOR KNN_TYPE='hnsw' HNSW_SIMILARITY='l2'
MODEL_NAME='sentence-transformers/all-MiniLM-L6-v2' FROM='title'
);Использование локальных эмбеддингов Qwen (ключ API не требуется)
CREATE TABLE products_qwen (
title TEXT,
description TEXT,
embedding_vector FLOAT_VECTOR KNN_TYPE='hnsw' HNSW_SIMILARITY='l2'
MODEL_NAME='Qwen/Qwen3-Embedding-0.6B' FROM='title' CACHE_PATH='/opt/homebrew/var/manticore/.cache/manticore'
);Использование OpenAI (требуется параметр API_KEY)
CREATE TABLE products_openai (
title TEXT,
description TEXT,
embedding_vector FLOAT_VECTOR KNN_TYPE='hnsw' HNSW_SIMILARITY='l2'
MODEL_NAME='openai/text-embedding-ada-002' FROM='title,description' API_KEY='...'
);Использование всех текстовых полей для эмбеддингов (FROM пуст)
CREATE TABLE products_all (
title TEXT,
description TEXT,
embedding_vector FLOAT_VECTOR KNN_TYPE='hnsw' HNSW_SIMILARITY='l2'
MODEL_NAME='sentence-transformers/all-MiniLM-L6-v2' FROM=''
);При использовании автоэмбеддингов не указывайте векторное поле в вашем операторе INSERT. Эмбеддинги генерируются автоматически из текстовых полей, указанных в параметре FROM.
- SQL
Вставка только текстовых данных - эмбеддинги генерируются автоматически
INSERT INTO products (title) VALUES
('machine learning artificial intelligence'),
('banana fruit sweet yellow');Вставка нескольких полей - оба используются для эмбеддинга, если FROM='title,description'
INSERT INTO products_openai (title, description) VALUES
('smartphone', 'latest mobile device with advanced features'),
('laptop', 'portable computer for work and gaming');Вставка пустого вектора (документ исключен из векторного поиска)
INSERT INTO products (title, embedding_vector) VALUES
('no embedding item', ());Поиск работает аналогичным образом - предоставьте ваш запрос в виде текста, и Manticore сгенерирует эмбеддинги и найдет похожие документы:
- SQL
- JSON
SELECT id, knn_dist() FROM products WHERE knn(embedding_vector, 3, 'machine learning');+------+------------+
| id | knn_dist() |
+------+------------+
| 1 | 0.12345678 |
| 2 | 0.87654321 |
+------+------------+
2 rows in set (0.00 sec)В качестве альтернативы, вы можете вручную вставлять предварительно вычисленные векторные данные, убедившись, что они соответствуют размерности, указанной вами при создании таблицы. Вы также можете вставить пустой вектор; это означает, что документ будет исключен из результатов векторного поиска.
Важно: При использовании hnsw_similarity='cosine' векторы автоматически нормализуются при вставке до единичных векторов (векторов с математической длиной/величиной, равной 1.0). Эта нормализация сохраняет направление вектора, стандартизируя его длину, что необходимо для эффективных вычислений косинусного сходства. Это означает, что сохраненные значения будут отличаться от ваших исходных входных значений.
- SQL
- JSON
insert into test values ( 1, 'yellow bag', (0.653448,0.192478,0.017971,0.339821) ), ( 2, 'white bag', (-0.148894,0.748278,0.091892,-0.095406) );Query OK, 2 rows affected (0.00 sec)Теперь вы можете выполнять KNN поиск, используя предложение knn в формате SQL или JSON. Оба интерфейса поддерживают одинаковые основные параметры, обеспечивая согласованный опыт независимо от выбранного формата:
- SQL:
select ... from <table name> where knn ( <field>, <query vector> [,<options>] ) - JSON:
POST /search { "table": "<table name>", "knn": { "field": "<field>", "query": "<text or vector>", "ef": <ef>, "rescore": <rescore>, "oversampling": <oversampling> } }
Параметры:
field: Это имя атрибута вектора с плавающей запятой, содержащего векторные данные.k: Устаревшая опция. Вместо этого используйтеlimitв запросе. Ранее использовалась для указания количества документов, которое должен возвращать один индекс HNSW. Однако фактическое количество документов, включенных в окончательные результаты, может отличаться. Например, если система работает с таблицами реального времени, разделенными на дисковые чанки, каждый чанк может возвращатьkдокументов, что приводит к общему количеству, превышающему указанноеk(так как совокупное количество будетnum_chunks * k). С другой стороны, окончательное количество документов может быть меньшеk, если после запросаkдокументов некоторые из них отфильтровываются на основе определенных атрибутов. Важно отметить, что параметрkне применяется к ramchunks. В контексте ramchunks процесс извлечения работает иначе, и поэтому влияние параметраkна количество возвращаемых документов неприменимо.query: (Рекомендуемый параметр) Поисковый запрос, который может быть:- Текстовой строкой: Автоматически преобразуется в эмбеддинги, если для поля настроены авто-эмбеддинги. Вернет ошибку, если у поля нет авто-эмбеддингов.
- Векторным массивом: Работает так же, как
query_vector.
query_vector: (Устаревший параметр) Поисковый вектор в виде массива чисел. Все еще поддерживается для обратной совместимости. Примечание: Используйте либоquery, либоquery_vector, но не оба в одном запросе.ef: необязательный размер динамического списка, используемого во время поиска. Более высокое значениеefприводит к более точному, но более медленному поиску. По умолчанию равно 10.rescore: Включает пересчет оценок KNN (включено по умолчанию). Установите0в SQL илиfalseв JSON, чтобы отключить пересчет. После завершения KNN поиска с использованием квантованных векторов (с возможным перевыборкой), расстояния пересчитываются с исходными (полноразрядными) векторами, и результаты пересортировываются для повышения точности ранжирования.oversampling: Устанавливает коэффициент (значение с плавающей запятой), на который умножаетсяkпри выполнении KNN поиска, что приводит к извлечению большего количества кандидатов, чем необходимо, с использованием квантованных векторов. По умолчанию применяетсяoversampling=3.0. Эти кандидаты могут быть позже переоценены, если пересчет оценок включен. Перевыборка также работает с неквантованными векторами. Поскольку она увеличиваетk, что влияет на работу индекса HNSW, это может вызвать небольшое изменение точности результатов.
Документы всегда сортируются по расстоянию до поискового вектора. Любые дополнительные критерии сортировки, которые вы укажете, будут применены после этого основного условия сортировки. Для получения расстояния существует встроенная функция knn_dist().
- SQL
- JSON
select id, knn_dist() from test where knn ( image_vector, (0.286569,-0.031816,0.066684,0.032926), { ef=2000, oversampling=3.0, rescore=1 } );+------+------------+
| id | knn_dist() |
+------+------------+
| 1 | 0.28146550 |
| 2 | 0.81527930 |
+------+------------+
2 rows in set (0.00 sec)Индексы HNSW должны быть полностью загружены в память для выполнения KNN поиска, что может привести к значительному потреблению памяти. Для уменьшения использования памяти может применяться скалярное квантование - техника, которая сжимает высокоразмерные векторы, представляя каждый компонент (размерность) ограниченным количеством дискретных значений. Manticore поддерживает 8-битное и 1-битное квантование, что означает, что каждый компонент вектора сжимается с 32-битного числа с плавающей запятой до 8 бит или даже 1 бита, уменьшая использование памяти в 4 или 32 раза соответственно. Эти сжатые представления также позволяют выполнять более быстрые вычисления расстояний, так как больше компонентов вектора может быть обработано одной инструкцией SIMD. Хотя скалярное квантование вносит некоторую ошибку аппроксимации, это часто является оправданным компромиссом между точностью поиска и эффективностью использования ресурсов. Для еще лучшей точности квантование можно комбинировать с пересчетом оценок и перевыборкой: извлекается больше кандидатов, чем запрошено, и расстояния для этих кандидатов пересчитываются с использованием исходных 32-битных векторов с плавающей запятой.
Поддерживаемые типы квантования включают:
8bit: Каждый компонент вектора квантуется до 8 бит.1bit: Каждый компонент вектора квантуется до 1 бита. Используется асимметричное квантование, при этом векторы запросов квантуются до 4 бит, а хранимые векторы — до 1 бита. Этот подход обеспечивает более высокую точность по сравнению с более простыми методами, хотя и с некоторым компромиссом в производительности.1bitsimple: Каждый компонент вектора квантуется до 1 бита. Этот метод быстрее, чем1bit, но обычно менее точен.
- SQL
create table test ( title text, image_vector float_vector knn_type='hnsw' knn_dims='4' hnsw_similarity='l2' quantization='1bit');Query OK, 0 rows affected (0.01 sec)ПРИМЕЧАНИЕ: Поиск похожих документов по id требует наличия Manticore Buddy. Если это не работает, убедитесь, что Buddy установлен.
Поиск документов, похожих на конкретный, на основе его уникального ID, является распространённой задачей. Например, когда пользователь просматривает определённый элемент, Manticore Search может эффективно идентифицировать и отобразить список элементов, наиболее похожих на него в векторном пространстве. Вот как это можно сделать:
- SQL:
select ... from <table name> where knn ( <field>, <k>, <document id> ) - JSON:
POST /search { "table": "<table name>", "knn": { "field": "<field>", "doc_id": <document id>, "k": <k> } }
Параметры:
field: Это имя атрибута вектора с плавающей точкой, содержащего векторные данные.k: Это количество возвращаемых документов и ключевой параметр для индексов Hierarchical Navigable Small World (HNSW). Он указывает количество документов, которое должен вернуть один индекс HNSW. Однако фактическое количество документов, включённых в окончательные результаты, может варьироваться. Например, если система работает с таблицами реального времени, разделёнными на дисковые чанки, каждый чанк может вернутьkдокументов, что приводит к общему количеству, превышающему указанноеk(так как совокупное количество будетnum_chunks * k). С другой стороны, итоговое количество документов может быть меньшеk, если после запросаkдокументов некоторые из них отфильтровываются на основе определённых атрибутов. Важно отметить, что параметрkне применяется к ramchunks. В контексте ramchunks процесс извлечения работает иначе, и, следовательно, влияние параметраkна количество возвращаемых документов неприменимо.document id: ID документа для поиска сходства KNN.
- SQL
- JSON
select id, knn_dist() from test where knn ( image_vector, 5, 1 );+------+------------+
| id | knn_dist() |
+------+------------+
| 2 | 0.81527930 |
+------+------------+
1 row in set (0.00 sec)Manticore также поддерживает дополнительную фильтрацию документов, возвращаемых поиском KNN, либо по полнотекстовому соответствию, либо по фильтрам атрибутов, либо по обоим.
- SQL
- JSON
select id, knn_dist() from test where knn ( image_vector, 5, (0.286569,-0.031816,0.066684,0.032926) ) and match('white') and id < 10;+------+------------+
| id | knn_dist() |
+------+------------+
| 2 | 0.81527930 |
+------+------------+
1 row in set (0.00 sec)