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, '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] }
}

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

Последний шаг включает запрос результатов, используя наш заранее рассчитанный вектор запроса, аналогично векторам документов, подготовленным с помощью 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;

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

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

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

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

Семантический поиск в демо 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;
// One from <https://huggingface.co/sentence-transformers>
$model = Model::create("sentence-transformers/all-MiniLM-L12-v2");
var_dump($model->predict("Hello world"));

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

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

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

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

Выбор типа поиска

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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

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