blog-post

Векторный поиск в Manticore

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

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

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

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

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

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

Мы вскоре обсудим, как превратить текст в векторы, но сначала давайте рассмотрим, как работать с векторами в 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, 'желтая сумка', (0.653448,0.192478,0.017971,0.339821) ), ( 2, 'белая сумка', (-0.148894,0.748278,0.091892,-0.095406) );

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

POST /insert
{
    "index":"test_vec",
    "id":1,
    "doc":  { "title" : "желтая сумка", "image_vector" : [0.653448,0.192478,0.017971,0.339821] }
}

POST /insert
{
    "index":"test_vec",
    "id":2,
    "doc":  { "title" : "белая сумка", "image_vector" : [-0.148894,0.748278,0.091892,-0.095406] }
}

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

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

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 предлагает клиенты для различных языков, все поддерживающие запрос данных с использованием Векторного Поиска. Например, вот как выполнить это с помощью PHP клиента :

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

// Сначала создайте клиента
$params = [
	'host' => '127.0.0.1',
	'port' => 9308,
];
$client = new Client($params);

// Создайте объект поиска и установите индекс для запроса
$search = new Search($client);
$search->setIndex('test');

// Теперь выполняем запрос
$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. Сохранение векторов в базе данных: Как только у вас есть векторные представления, сохраните их в Manticore вместе с соответствующим текстом.
  5. Запрос: Чтобы найти тексты, похожие на запрос, преобразуйте текст запроса в вектор, используя ту же модель. Используйте Manticore Vector Search, чтобы найти ближайшие векторы (и их связанные тексты) в базе данных.

Семантический поиск в демонстрации GitHub

В предыдущей статье мы создали демонстрацию, демонстрирующую использование Manticore Search в реальном примере: поиск по проблемам GitHub . Это работало хорошо и уже предоставило преимущества по сравнению с нативным поиском 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;
// Один из <https://huggingface.co/sentence-transformers>
$model = Model::create("sentence-transformers/all-MiniLM-L12-v2");
var_dump($model->predict("Hello world"));

Большое преимущество заключается в том, что модельRemarkably fast at generating embeddings, and it only needs to be loaded once. All subsequent calls are executed in just a few milliseconds, providing good performance for PHP and sufficient speed for the demo project. Consequently, we decided to proceed with this approach. You can check and use our extension on GitHub here .

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

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

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

Selector for search type

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

// Добавить эмбеддинги векторного поиска, если у нас есть запрос
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);
}

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

Сравнение того, что мы получили в нашей демонстрации с семантическим поиском

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

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

Результаты для поиска по ключевым словам

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

Результаты для семантического поиска

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

Результаты для семантического поиска с вопросом

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

Заключение

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

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

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

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

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