⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.
blog-post

Vector search in Manticore

Manticore Search с версии 6.3.0 поддерживает Vector Search! Давайте узнаем больше об этом — что это такое, какие преимущества он дает и как использовать его на примере интеграции в демонстрацию поиска по GitHub issue .

Полнотекстовый поиск и векторный поиск

Full-text search полезен, потому что позволяет эффективно искать, находя точные совпадения ключевых слов. Однако он в основном опирается на ключевые слова, что иногда может быть ограничивающим. В отличие от этого, семантический поиск использует сходство векторов и машинное обучение для понимания смысла вашего запроса и находит документы, похожие на то, что вы ищете. Этот метод часто приводит к лучшим результатам и позволяет выполнять поиск в более естественном и непринуждённом стиле.

Мы рады представить эту мощную функцию в Manticore Search, реализованную как часть библиотеки Columnar . Давайте посмотрим, как начать её использовать.

Начало работы с векторным поиском и Manticore

Краткое введение в векторный поиск: Чтобы выполнить vector search, текст должен быть преобразован в векторы, которые обычно представляют собой упорядоченные списки чисел с плавающей запятой. Вы делаете то же самое со своим запросом. Затем сравниваете вектор вашего запроса с векторами ваших документов и сортируете их по близости. Прочитайте нашу другую статью о Vector search in old and modern databases .

Мы скоро обсудим, как преобразовать текст в векторы, но сначала давайте посмотрим, как работать с векторами в Manticore Search.

Установка

Функциональность векторного поиска доступна в Manticore с версии 6.3.0. Убедитесь, что Manticore установлен с библиотекой Columnar . Если вам нужна помощь с установкой, ознакомьтесь с документацией .

Создание таблицы

Сначала нам нужно создать таблицу реального времени, которая будет содержать объявление нашей схемы. Это включает поле для хранения векторов, позволяющее выполнять запросы к ним с использованием указанного синтаксиса. Давайте создадим простую таблицу. Таблица должна иметь поле типа float_vector с настроенными параметрами.

create table test ( title text, image_vector float_vector knn_type='hnsw' knn_dims='4' hnsw_similarity='l2' );

Подробную документацию можно прочитать здесь .

Вставка данных

После создания таблицы нам нужно заполнить её некоторыми данными, прежде чем мы сможем извлекать из неё любую информацию.

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) );

Manticore Search поддерживает SQL, что делает его удобным для тех, кто знаком с SQL‑базами данных. Однако, если вы предпочитаете использовать обычные HTTP‑запросы, эта возможность тоже доступна! Вот как можно выполнить ранее описанную SQL‑операцию с помощью HTTP:

POST /insert
{
    "index":"test_vec",
    "id":1,
    "doc":  { "title" : "yellow bag", "image_vector" : [0.653448,0.192478,0.017971,0.339821] }
}

POST /insert
{
    "index":"test_vec",
    "id":2,
    "doc":  { "title" : "white bag", "image_vector" : [-0.148894,0.748278,0.091892,-0.095406] }
}

Запрос данных

Последний шаг включает запрос результатов с использованием нашего предварительно рассчитанного вектора запроса, аналогично векторам документов, подготовленным с помощью моделей ИИ. Мы подробно объясним этот процесс в следующей части статьи. Пока что вот пример того, как запросить данные из таблицы, используя готовый вектор:

mysql> select id, knn_dist() from test where knn ( image_vector, 5, (0.286569,-0.031816,0.066684,0.032926), 2000 );

Вы получите следующее:

+------+------------+
| id   | knn_dist() |
+------+------------+
|    1 | 0.28146550 |
|    2 | 0.81527930 |
+------+------------+
2 rows in set (0.00 sec)

То есть 2 документа, отсортированные по близости их векторов к вектору запроса.

Векторный поиск Manticore в поддерживаемых клиентах

Manticore Search предоставляет клиенты для различных языков, все поддерживают запросы данных с использованием Vector Search. Например, вот как выполнить это с помощью PHP‑клиента :

<?php
use Manticoresearch\Client;
use Manticoresearch\Search;
use Manticoresearch\Query\KnnQuery;

// Create the Client first
$params = [
	'host' => '127.0.0.1',
	'port' => 9308,
];
$client = new Client($params);

// Create Search object and set index to query
$search = new Search($client);
$search->setIndex('test');

// Query now
$results = $search->knn('image_vector', [0.286569,-0.031816,0.066684,0.032926], 5);

Легко, не правда ли? Если хотите узнать больше о различных вариантах, можете посмотреть документацию PHP‑клиента .

Как преобразовать текст в векторы?

Давайте теперь обсудим, как мы можем получить вектор из текста.

«Эмбеддинг» — это вектор, представляющий текст и фиксирующий его семантическое значение. В настоящее время Manticore Search не создаёт эмбеддинги автоматически. Однако мы работаем над добавлением этой функции и имеем открытый тикет на GitHub . Пока эта возможность недоступна, вам придётся готовить эмбеддинги внешне. Поэтому нам нужен метод преобразования текста в список чисел с плавающей запятой для хранения и последующего запроса с помощью векторного поиска.

Вы можете использовать различные решения для преобразования текстов в эмбеддинги. Мы можем порекомендовать использовать sentence transformers от Hugging Face , которые включают предобученные модели , преобразующие текст в высоко‑размерные векторы. Эти модели эффективно фиксируют семантические сходства между текстами.

Процесс преобразования текста в векторы с помощью sentence transformers включает следующие шаги:

  1. Загрузить предобученную модель: Начните с загрузки нужной модели sentence transformer из репозитория Hugging Face. Эти модели, обученные на обширных текстовых данных, могут эффективно улавливать семантические отношения между словами и предложениями.
  2. Токенизировать и кодировать текст: Используйте модель для разбивки текста на токены (слова или субслова) и преобразования этих токенов в числовые представления.
  3. Вычислить векторные представления: Модель рассчитывает векторные представления текста. Эти векторы обычно высоко‑размерные (например, 768 измерений) и численно представляют семантическое значение текста.
  4. Сохранить векторы в базе данных: Как только ...
  5. Семантический поиск в демонстрации GitHub

Semantic Search in the GitHub Demo

В предыдущей статье , мы создали демо, демонстрирующее использование Manticore Search в реальном примере: поиск по GitHub issue . Всё работало хорошо и уже давало преимущества перед нативным поиском GitHub. С последним обновлением Manticore Search, включающим векторный поиск, нам показалось интересным добавить возможность семантического поиска в наше демо. Давайте посмотрим, как это было реализовано.

Хотя большинство библиотек, генерирующих эмбеддинги, написаны на Python, в нашем демо мы используем PHP. Чтобы интегрировать векторный поиск в наше демо‑приложение, у нас было два варианта:

  • API‑сервер (который может использовать Python, но может быть медленнее)
  • PHP‑расширение, которое мы решили реализовать.

Ища быстрый и прямой способ создания текстовых эмбеддингов, мы обнаружили несколько полезных инструментов, позволивших нам достичь цели. В результате мы создали простое в использовании PHP‑расширение , способное генерировать текстовые эмбеддинги. Это расширение позволяет выбрать любую модель из Sentence Transformers на HuggingFace. Оно построено на фреймворке CandleML , написанном на Rust и являющемся частью известной экосистемы HuggingFace . Само PHP‑расширение также написано на Rust с использованием библиотеки php-ext-rs . Такой подход обеспечивает быструю работу расширения при простой разработке.

Объединение всех частей было сложным, но в результате у нас есть это расширение , которое легко преобразует текст в векторы непосредственно в PHP‑коде, значительно упрощая процесс.

<?php
use Manticore\\Ext\\Model;
// One from <https://huggingface.co/sentence-transformers>
$model = Model::create("sentence-transformers/all-MiniLM-L12-v2");
var_dump($model->predict("Hello world"));

Главное преимущество в том, что модель генерирует эмбеддинги чрезвычайно быстро и её нужно загружать только один раз. Все последующие вызовы выполняются за несколько миллисекунд, обеспечивая хорошую производительность для PHP и достаточную скорость для демо‑проекта. Поэтому мы решили продолжить использовать этот подход. Вы можете проверить и использовать наше расширение на GitHub здесь .

Сложная часть завершена; теперь нам нужно интегрировать её в демо‑проект с минимальными изменениями кода.

Интеграция в существующий код

Чтобы добавить возможность векторного поиска, мы добавили небольшой переключатель в заголовок, позволяющий пользователям менять режим поиска. По умолчанию мы используем поиск по ключевым словам (также известный как «полнотекстовый поиск»). Это выглядит так:

Search type selector

Изменения на стороне бэкенда были несложными. Мы добавили вызов расширения преобразования текста в вектор, упомянутого выше. Вот как выглядит блок кода :

// Add vector search embeddings if we have a query
if ($search_query) {
    if ($search !== 'keyword-search') {
        $embeddings = result(TextEmbeddings::get($query));
        $filters['embeddings'] = $embeddings;
    }
    if ($search === 'vector-search') {
        $filters['vector_search_only'] = true;
    }
}

Гибридный поиск, комбинирующий семантический и ключевой поиск, можно реализовать разными способами. В данном случае мы просто добавили полнотекстовый фильтр к результатам векторного поиска. Обновлённый код можно увидеть здесь . Вот как он выглядит:

protected static function getSearch(string $table, string $query, array $filters): Search {
    $client = static::client();
    $Index = $client->index($table);
    $vector_search_only = $filters['vector_search_only'] ?? false;
    $query = $vector_search_only ? '' : $query;
    $Query = new BoolQuery();
    if (isset($filters['embeddings'])) {
        $Query = new KnnQuery('embeddings', $filters['embeddings'], 1000);
    }

    if ($query) {
        $QueryString = new QueryString($query);
        $Query->must($QueryString);
    }

    return $Index->search($Query);
}

Как видим, интеграция семантического поиска в демо прошла без проблем. Далее посмотрим, чего мы добились с помощью векторного поиска.

Сравнение результатов в нашем демо с семантическим поиском

Давайте посмотрим и сравним простые результаты, полученные с помощью стандартного поиска по ключевым словам и семантического поиска на нашей странице демо .

Например, выполнение поиска по ключевому слову для фразы "improve performance" может дать такие результаты:

Results for keyword search

Это выглядит правдоподобно и приемлемо. Но такой поиск ищет ТОЛЬКО точное совпадение исходной фразы. Давайте сравним это с семантическим поиском:

Results for semantic search

Это выглядит несколько гибко, хотя и не идеально. Тем не менее, мы также можем задать вопрос, например How to improve performance of Manticore Search? и получить дополнительные релевантные результаты.

Results for semantic search with question

Здесь вы видите, что благодаря векторному поиску и модели машинного обучения, стоящей за ним, система точно понимает, что мы ищем, и предоставляет релевантные результаты. Однако, если выполнить тот же поиск в режиме ключевых слов, вы не получите никаких результатов.

Заключение

Мы рады новым возможностям Manticore! Теперь, с векторным поиском и помощью некоторых внешних инструментов, легко настроить семантический поиск. Семантический поиск — это умный способ лучше понимать запросы. Вместо того чтобы искать только точные слова, он определяет смысл того, что спрашивают люди. Это позволяет находить более релевантные ответы, особенно на сложные или детальные вопросы.

Делая поиск более похожим на естественный разговор, семантический поиск устраняет разрыв между тем, как мы говорим, и тем, как организованы данные. Он предоставляет точные и полезные результаты, полностью соответствующие тому, что ищет пользователь, делая поиск с Manticore гораздо лучше.

Сейчас мы работаем над внедрением функции автоэмбеддингов в Manticore. Это позволит автоматически преобразовывать текст в векторы, делая всё проще и быстрее. Следите за нашим прогрессом здесь на GitHub . С этими улучшениями поиск с Manticore становится ещё лучше!

Установить Manticore Search

Установить Manticore Search