blog-post

Векторный поиск в Manticore Search: углубленный анализ

Содержание

  1. Векторный поиск в Manticore: детали
  2. Что такое встраивания (и почему это важно)?
  3. Как работает векторный поиск?
  4. Начало работы: настройка векторного поиска
  5. Расширенные функции поиска
  6. Применение в реальном мире
  7. Как сделать векторный поиск быстрым: советы по производительности
  8. Как защитить ваши векторные данные: варианты резервного копирования
  9. Как обеспечить доступность вашей поисковой системы: репликация
  10. Смотрите векторный поиск в действии: живые демонстрации
  11. Запуск векторного поиска в производственной среде
  12. Заключение: будущее векторного поиска

1. Векторный поиск в Manticore: детали

Если вы следите за нашим блогом, вы уже знаете, что Manticore Search предлагает мощные возможности векторного поиска. В этом посте мы идем дальше основ, чтобы показать, как это работает за кулисами — и как вы можете извлечь из этого максимальную пользу.

Прежде чем перейти к техническим деталям, быстрое объявление: 6 июня 2025 года команда Manticore спонсирует Конференцию по векторному поиску 2025

Мы проведем два доклада, сосредоточенных на векторном поиске в реальном мире:

  • Скорость встречает точность: как векторная квантизация усиливает поиск — Сергей Николаев
  • RAG Time: более умные ответы с помощью дополненного извлечения — Дмитрий Кузьменков

Если вы работаете с семантическим поиском, рекомендациями или дополненным извлечением (RAG), это событие, которое вы не захотите пропустить.

Теперь вернемся к теме.

Векторный поиск Manticore построен на нашей Колонной библиотеке , и он позволяет вам:

  • Находить контент с похожим значением, даже если слова разные
  • Создавать рекомендательные системы, которые кажутся личными
  • Группировать похожие элементы вместе без ручной разметки
  • Предоставлять результаты поиска, которые гораздо более релевантны, чем простые совпадения по ключевым словам

Внутри Manticore использует высокоэффективный алгоритм под названием HNSW (Иерархический навигационный малый мир) для векторного поиска. Он предназначен для быстрого нахождения наиболее релевантных результатов, даже в больших наборах данных — как находить ближайших соседей в огромном городе, но без необходимости в карте.

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

2. Что такое встраивания (и почему это важно)?

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

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

Как работают встраивания?

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

  • Размещают похожие вещи рядом друг с другом в этом многомерном пространстве
  • Захватывают значение данных
    – Это позволяет нам выполнять математические операции с идеями (помните знаменитый пример от Word2Vec исследователей Google: король – мужчина + женщина = королева ?)

Многомерная "галактика" точек

Что можно преобразовать в векторы?

Практически все. Некоторые распространенные примеры включают:

  • Текст: отдельные слова, полные предложения или даже целые книги. Вектор для "пляж" будет ближе к "берег" чем к "гора."
  • Изображения: фотографии путешествий, изображения продуктов или мемы. Фотографии собак окажутся ближе друг к другу, чем к фотографиям автомобилей.
  • Аудио: речь, музыка или звуковые эффекты. Треки тяжелого метала группируются вместе, далеко от тихой пианинной музыки.

Эти встраивания являются отправной точкой. Как только у вас есть они, такие алгоритмы, как HNSW, помогают вам быстро их искать.

Как мы измеряем схожесть?

Как только у нас есть эти векторы, нам нужен способ измерить, насколько они похожи. Manticore Search поддерживает три метрики схожести:

  • Евклидово расстояние (L2)
  • Косинусное сходство
  • Скалярное произведение (Dot Product)

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

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

Вот краткий обзор каждой метрики:

  • Евклидово расстояние (L2): Измеряет прямое расстояние между двумя векторами в пространстве. Оно чувствительно к величине векторов и подходит, когда абсолютные различия имеют значение.

  • Косинусное сходство: Измеряет косинус угла между двумя векторами, сосредотачиваясь на их ориентации, а не на величине. Обычно используется в текстовом анализе, где направление вектора (представляющего концепцию) важнее его длины.

  • Скалярное произведение (точечное произведение): Вычисляет сумму произведений соответствующих элементов двух последовательностей чисел. Эффективно, когда как величина, так и направление векторов имеют значение.

Как создаются эти векторы?

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

Вот некоторые широко используемые модели, которые генерируют встраивания:

  • Word2Vec: Одна из первых моделей встраивания слов. Она помогла показать, что отношения между словами можно захватить математически — например, "король" относится к "королеве", как "мужчина" к "женщине".
  • GloVe: Разработанная в Стэнфорде, эта модель также создает встраивания слов, анализируя глобальную статистику совместного появления слов. Она эффективна и по-прежнему широко используется.
  • FastText: Модель от Facebook, которая улучшает Word2Vec, понимая информацию о подсловах. Она может генерировать встраивания для слов, которые она не видела ранее, разбивая их на части.
  • BERT: Модель на основе трансформеров от Google, которая понимает слова в контексте. Например, она различает "банк" в "берег реки" и "банковский счет". Она может производить встраивания для предложений, абзацев или целых документов.
  • MPNet / MiniLM / all-MiniLM-L6-v2: Это оптимизированные модели встраивания предложений из семейства SentenceTransformers, идеальные для задач, таких как семантический поиск, сопоставление часто задаваемых вопросов и обнаружение дубликатов.
  • OpenAI Embeddings (например, text-embedding-3-small): Это высоко универсальные встраивания, используемые в приложениях, таких как поиск, кластеризация и классификация.
  • CLIP: Модель от OpenAI, которая понимает как изображения, так и текст в одном пространстве. Покажите ей фото щенка, и она сможет сопоставить его с текстом "милый пес".
  • ResNet: Глубокая сверточная нейронная сеть, которая отлично преобразует изображения в встраивания. Обычно используется для визуального сходства и классификации изображений.
  • VGG / EfficientNet / Vision Transformers (ViT): Другие сильные модели изображений, широко используемые для преобразования картинок в векторные встраивания.
  • Whisper: Модель OpenAI для транскрибирования аудио в текст, который затем можно встроить для задач, таких как голосовой поиск или классификация аудио.

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

3. Как работает векторный поиск?

Теперь, когда мы рассмотрели, что такое встраивания и как они представляют сходство, давайте посмотрим, как Manticore фактически выполняет векторный поиск. Истинная сила за кулисами заключается в умном алгоритме под названием HNSW — сокращение от Hierarchical Navigable Small World.

Да, это звучит как что-то из научно-фантастического романа — и, честно говоря, это и есть. Но вместо того, чтобы направлять космические корабли через червоточины, HNSW помогает нам быстро ориентироваться в огромных коллекциях векторов.

HNSW: Алгоритм с ужасным названием

человек ищет иглу в стоге сена

Поиск в огромном векторном индексе немного похож на поиск иглы в стоге сена — только стог сена содержит миллионы соломинок, и некоторые из них выглядят очень похоже на иглу. Если бы вам пришлось проверять каждую по отдельности, это заняло бы вечность.

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

Вот как это работает:

  1. Он создает несколько слоев векторов — как многоэтажное здание или слоеный торт.
  2. Нижний слой содержит каждый отдельный вектор — ваш полный набор данных.
  3. Каждый высший слой содержит меньше векторов и более длинные связи.
  4. Когда вы ищете, он начинает с верхнего слоя, который помогает вам быстро перемещаться по данным.
  5. На каждом уровне он приближается к нужной области, уточняя поиск по мере спуска.
  6. К тому времени, когда он достигает дна, он уже находится в нужном районе.

Этот многослойный подход позволяет избежать сканирования всего набора данных. Вместо этого вы быстро приближаетесь — что делает векторный поиск в Manticore суперэффективным.

Но что насчет точности?

Есть небольшая плата. Поскольку HNSW пропускает большую часть данных во время поиска, есть вероятность, что он не найдет абсолютно лучшее совпадение — только очень хорошее. В большинстве реальных сценариев это совершенно нормально. Независимо от того, проводите ли вы семантический поиск, рекомендации продуктов или кластеризацию похожих документов, "очень близко" более чем достаточно.

Но если ваш случай использования требует 100% точности — например, сопоставление последовательностей ДНК или проведение научных анализов — вам может понадобиться метод грубой силы. Он будет медленнее, но абсолютно точен.

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

Структура алгоритма HNSW

схема HNSW

Настройте его под свои нужды

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

Вот основные настройки, которые вы можете изменить:

  • hnsw_m (по умолчанию: 16): Это контролирует, сколько соединений каждый вектор делает с другими — как будто сколько друзей у каждого человека в социальной сети. Большее количество соединений означает лучшую точность поиска, но также большее использование памяти и немного более медленные запросы.

  • hnsw_ef_construction (по умолчанию: 200): Эта настройка влияет на то, насколько тщательно строится индекс. Более высокие значения приводят к лучшему качеству (а значит, и к лучшим результатам поиска), но также делают процесс индексации медленнее и более ресурсоемким.

Эти два параметра позволяют вам найти правильный баланс между:

  • 🔍 Точность поиска — Насколько близки результаты к истинным ближайшим соседям
  • Скорость поиска — Насколько быстро возвращаются результаты
  • 🧠 Использование памяти — Сколько ОЗУ потребляет индекс
  • 🏗️ Время индексации — Сколько времени требуется для построения индекса

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

  • Хотите ультра-точные результаты? Увеличьте как hnsw_m, так и hnsw_ef_construction
  • Ограничены в памяти? Уменьшите hnsw_m, чтобы сократить количество соединений
  • Нужна более быстрая индексация? Уменьшите hnsw_ef_construction

Не стесняйтесь экспериментировать — все дело в том, чтобы найти оптимальное значение для вашей нагрузки.

4. Начало работы: Настройка векторного поиска

Понимание теории — это здорово, но теперь давайте перейдем к практике. Настройка векторного поиска в Manticore проста и гибка, и вы сможете начать работу всего за несколько шагов.

Что вам понадобится

Чтобы включить векторный поиск, вам нужно определить таблицу с как минимум одним атрибутом float_vector. Здесь будут храниться ваши векторы — фактические встраивания.

Ключевые настройки для определения

При создании вашей таблицы вам нужно будет установить три основных параметра:

  1. knn_type: Установите это значение в hnsw. (На данный момент это единственный поддерживаемый вариант, так что здесь не нужно принимать решения.)
  2. knn_dims: Это определяет количество измерений ваших векторов. Значение зависит от модели встраивания, которую вы используете:
    • BERT обычно использует 768
    • CLIP часто использует 512
    • Некоторые трансформеры предложений используют 384 или 1024
    • Просто убедитесь, что это соответствует размеру векторов, которые вы будете вставлять
  3. hnsw_similarity: Выберите метрику сходства, которая соответствует тому, как была обучена ваша модель встраивания. Варианты:
    • L2 (евклидово расстояние): Используйте это для геометрических данных, признаков изображений и в любом случае, когда важна физическая дистанция
    • COSINE: Лучше всего подходит для текстовых встраиваний, семантического поиска и когда вам важна направленность, а не величина
    • IP (внутреннее произведение): Хорошо подходит для нормализованных векторов или случаев использования, таких как рекомендации, где важны как размер, так и направление

🔍 Совет: Большинство современных моделей встраивания текста обучены с учетом косинусного сходства. Если вы не уверены, проверьте документацию модели — или просто начните с COSINE и экспериментируйте.

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

Рабочий процесс векторного поиска

Рабочий процесс векторного поиска

Давайте посмотрим реальный пример

Время перейти к практике. Вот как вы создадите таблицу для хранения векторов изображений в Manticore Search:

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

Теперь давайте добавим немного данных:

insert into cool_images values 
    (1, 'yellow bag', (0.653448,0.192478,0.017971,0.339821)),
    (2, 'white bag', (-0.148894,0.748278,0.091892,-0.095406));

(Конечно, ваши реальные векторы, вероятно, будут иметь сотни измерений — мы оставляем это небольшим для ясности.)

Поддержка транзакций для векторных операций

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

Основы транзакций

  • Транзакции поддерживаются для таблиц реального времени с векторными атрибутами
  • Каждая транзакция атомарна - либо все операции успешны, либо ни одна не удалась
  • Транзакции интегрированы с двоичным журналированием для надежности и согласованности
  • По умолчанию каждая команда является своей мини-транзакцией (autocommit = 1)

Что вы можете делать в транзакции

Вы можете включить следующие операции в транзакцию:

  • INSERT: Добавить новые векторы
  • REPLACE: Обновить существующие векторы
  • DELETE: Удалить векторы

Векторные поля не поддерживают команду UPDATE. Вы можете узнать больше о разнице между REPLACE и UPDATE здесь .

Как управлять транзакциями

Вы можете управлять транзакциями двумя способами:

  1. Автоматический режим (по умолчанию):
SET AUTOCOMMIT = 1

В этом режиме каждая операция автоматически фиксируется.

  1. Ручной режим:
SET AUTOCOMMIT = 0

Это позволяет вам группировать несколько операций в одну транзакцию:

BEGIN;
INSERT INTO cool_images VALUES (3, 'red bag', (0.1, 0.2, 0.3, 0.4));
INSERT INTO cool_images VALUES (4, 'blue bag', (0.5, 0.6, 0.7, 0.8));
COMMIT;

Пакетные операции

Для пакетных операций вы можете использовать конечную точку /bulk, которая поддерживает транзакции для нескольких векторных операций:

POST /bulk
{
    "insert": {"table": "cool_images", "id": 5, "doc": {"title": "green bag", "image_vector": [0.1, 0.2, 0.3, 0.4]}},
    "insert": {"table": "cool_images", "id": 6, "doc": {"title": "purple bag", "image_vector": [0.5, 0.6, 0.7, 0.8]}}
}

Заметки, которые следует учитывать

  • Транзакции ограничены одной таблицей реального времени
  • Векторные операции в транзакциях атомарны и согласованы
  • Изменения не видны, пока не будут явно зафиксированы
  • Двоичный журнал обеспечивает надежность векторных операций
  • Транзакции особенно полезны, когда вам нужно поддерживать согласованность между векторными данными и другими атрибутами

Поиск похожих объектов

Теперь интересная часть — поиск похожих изображений:

Используя SQL:

select id, title, knn_dist() 
from cool_images 
where knn (image_vector, 5, (0.286569,-0.031816,0.066684,0.032926), 2000);

Это дает нам:

+------+------------+------------+
| id   | title      | knn_dist() |
+------+------------+------------+
|    1 | yellow bag | 0.28146550 |
|    2 | white bag  | 0.81527930 |
+------+------------+------------+

Желтая сумка ближе к нашему вектору запроса (меньшее значение расстояния), поэтому она более похожа на то, что мы ищем.

Используя HTTP API:

Manticore предоставляет RESTful HTTP API для операций векторного поиска. Основная конечная точка для векторного поиска:

POST /search

Тело запроса должно быть в формате JSON со следующей структурой:

{
    "table": "<table_name>",
    "knn": {
        "field": "<vector_field_name>",
        "query_vector": [<vector_values>],
        "k": <number_of_results>,
        "ef": <search_accuracy>
    }
}

Ключевые параметры:

  • table: Имя таблицы для поиска
  • knn.field: Имя векторного поля для поиска
  • knn.query_vector: Вектор запроса в виде массива значений с плавающей запятой
  • knn.k: Количество ближайших соседей для возврата
  • knn.ef: (Необязательно) Размер динамического списка, используемого во время поиска. Более высокие значения дают более точные, но более медленные результаты

Пример запроса:

POST /search
{
    "table": "products",
    "knn": {
        "field": "image_vector",
        "query_vector": [0.1, 0.2, 0.3, 0.4],
        "k": 5,
        "ef": 2000
    }
}

Ответ будет в формате JSON:

{
    "took": 6,
    "timed_out": false,
    "hits": {
        "total": 2,
        "total_relation": "eq",
        "hits": [
            {
                "_id": 1,
                "_score": 1,
                "_knn_dist": 0.28146550,
                "_source": {
                    "title": "yellow bag",
                    "image_vector": [0.653448, 0.192478, 0.017971, 0.339821]
                }
            },
            {
                "_id": 2,
                "_score": 1,
                "_knn_dist": 0.81527930,
                "_source": {
                    "title": "white bag",
                    "image_vector": [-0.148894, 0.748278, 0.091892, -0.095406]
                }
            }
        ]
    }
}

Ответ включает:

  • took: Время, затраченное на поиск в миллисекундах
  • timed_out: Истекло ли время поиска
  • hits.total: Общее количество найденных совпадений
  • hits.hits: Массив совпадающих документов, каждый из которых содержит:
    • _id: Идентификатор документа
    • _score: Оценка поиска (всегда 1 для KNN поиска)
    • _knn_dist: Расстояние до векторного запроса
    • _source: Исходные данные документа

Вы также можете комбинировать KNN поиск с дополнительными фильтрами:

POST /search
{
    "table": "products",
    "knn": {
        "field": "image_vector",
        "query_vector": [0.1, 0.2, 0.3, 0.4],
        "k": 5,
        "filter": {
            "bool": {
                "must": [
                    { "match": {"_all": "white"} },
                    { "range": { "id": { "lt": 10 } } }
                ]
            }
        }
    }
}

Я нашел это

5. Расширенные функции поиска

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

Два способа поиска

Вы можете искать двумя основными способами:

  1. Прямой векторный поиск: Дайте мне вещи, похожие на этот вектор. Отлично, когда у вас есть векторное представление того, что вы хотите (например, встраивание изображения или текста).
    -- Пример: Найти элементы, похожие на конкретный вектор
    SELECT id, knn_dist() 
    FROM products 
    WHERE knn(image_vector, 5, (0.286569,-0.031816,0.066684,0.032926));
    
  2. Поиск похожих документов: Дайте мне вещи, похожие на этот документ в моем индексе. Идеально для функций "больше похоже на это", где пользователи могут кликнуть на что-то, что им нравится, и найти похожие элементы.
    -- Пример: Найти элементы, похожие на документ с ID 1
    SELECT id, knn_dist() 
    FROM products 
    WHERE knn(image_vector, 5, 1);
    

Оба метода возвращают результаты, отсортированные по сходству (расстоянию) с вашим запросом, при этом наиболее похожие элементы появляются первыми.

Тонкая настройка вашего поиска

Два важных параметра контролируют, как ведет себя ваш поиск:

  • Параметр k: Сколько результатов вы хотите получить. Слишком мало, и вы можете пропустить хорошие совпадения. Слишком много, и вы можете получить нерелевантные вещи.
  • Параметр ef: Насколько сильно алгоритм пытается найти лучшие совпадения. Более высокие значения дают более точные результаты, но требуют больше времени.

Результаты сортируются по близости

Все результаты поиска автоматически сортируются по тому, насколько близки они к вашему вектору запроса. Функция knn_dist() показывает вам фактическое значение расстояния для каждого результата, так что вы можете видеть, насколько они похожи (или различны).

Например, если мы ищем изображения, похожие на вектор запроса:

select id, title, knn_dist() 
from images 
where knn (image_vector, 3, (0.1, 0.2, 0.3, 0.4));

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

+------+----------------+------------+
| id   | title          | knn_dist() |
+------+----------------+------------+
|    1 | sunset beach   | 0.12345678 |
|    3 | ocean view     | 0.23456789 |
|    2 | mountain lake  | 0.34567890 |
+------+----------------+------------+

Обратите внимание, как значения knn_dist() увеличиваются по мере продвижения вниз по списку - это показывает, что каждое последующее значение становится менее похожим на наш вектор запроса.

Смешивайте и сочетайте с обычным поиском

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

select id, title, knn_dist() 
from cool_images 
where knn (image_vector, 5, (0.286569,-0.031816,0.066684,0.032926)) 
and match('white');

Это находит изображения, похожие на наш вектор, но только если они содержат "белый":

+------+-----------+------------+
| id   | title     | knn_dist() |
+------+-----------+------------+
|    2 | white bag | 0.81527930 |
+------+-----------+------------+

Хотя желтая сумка была технически более похожей (по вектору), она не соответствовала нашему текстовому фильтру, поэтому появилась только белая сумка.

6. Применение в реальном мире

Теперь, когда мы рассмотрели основные возможности, давайте посмотрим на некоторые реальные приложения, где векторный поиск может преобразовать ваш пользовательский опыт. Эти примеры помогут вам понять, как применять эти концепции в ваших собственных проектах.

Умный поиск, который понимает, что вы имеете в виду

Это не то, что я имел в виду

Когда-нибудь искали что-то и думали: "это не то, что я имел в виду!"? Умный поиск понимает смысл вашего запроса, а не только точные слова.

С векторным поиском вы можете:

  • Находить результаты, которые соответствуют тому, что вы ищете, даже если они используют другие слова
  • Искать на разных языках (смысл переводится, а не только слова)
  • На самом деле понимать, что ищут пользователи

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

Системы рекомендаций, которые имеют смысл

Мы видим, что вы купили холодильник вчера. Как насчет еще 5?

Мы все сталкивались с ужасными рекомендациями: "Вы купили холодильник, хотите еще один холодильник?". Векторный поиск помогает создавать рекомендации, которые имеют смысл:

  • Находить продукты, похожие на те, которые понравились клиенту
  • Соответствовать предпочтениям пользователей с товарами
  • Рекомендовать по категориям на основе основных атрибутов
  • Персонализировать результаты поиска на основе истории просмотров

Пример из реальной жизни: Интернет-магазин, который может рекомендовать синюю кожаную куртку после того, как вы посмотрели на синюю кожаную сумку, потому что понимает связь стилей.

Поиск изображений, который видит, как вы

Поиск изображений

Традиционный поиск изображений полагается на текстовые теги и метаданные. Векторный поиск позволяет вам:

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

Пример из реальной жизни: Сайт стоковых фотографий, где дизайнеры могут находить визуально похожие изображения, загружая эталонное изображение или концептуальный эскиз.

Поиск видео и звука за пределами тегов

Примените те же принципы к видео и аудио:

  • Находить похожие видеоклипы на основе их содержания
  • Искать музыку по принципу "звучит как это", а не только по жанровым тегам
  • Находить моменты в видео с похожими визуальными элементами
  • Обнаруживать дублирующие или похожие аудиотреки

Пример из реальной жизни: Платформа для редактирования видео, которая может мгновенно находить все клипы с похожими визуальными композициями во всех ваших проектах.

Поиск на разных языках

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

Как работает кросс-языковой поиск

  1. Языково-агностические встраивания
    Современные многоязычные модели, такие как mBERT, XLM-R и LaBSE, обучены размещать семантически похожий текст — даже на разных языках — близко друг к другу в одном векторном пространстве.
    Это означает, что "apple" на английском и "manzana" на испанском оказываются рядом друг с другом. Таким образом, когда вы ищете на одном языке, вы можете находить результаты, написанные на другом.
  2. Настройка простой таблицы
    create table multilingual_docs (
        id bigint,
        content text,
        language string,
        content_vector float_vector knn_type='hnsw' knn_dims='768' hnsw_similarity='cosine'
    );
    
    • Храните документы на их оригинальном языке
    • Генерируйте векторные представления с использованием многоязычной модели
    • Поиск работает — независимо от того, на каком языке запрос или документ
  3. Поиск на разных языках:
    select id, content, language, knn_dist() 
    from multilingual_docs 
    where knn (content_vector, 5, (0.1, 0.2, ...));
    
    • Введите ваш запрос на любом поддерживаемом языке
    • Результаты возвращаются на основе смысла, а не языка
    • Перевод или определение языка не требуется

Применение в реальном мире

Многоязычный векторный поиск открывает широкий спектр глобальных случаев использования, таких как:

  • Глобальная электронная коммерция: Поиск и рекомендации продуктов на разных языках, а также поддержка международных запросов клиентов
  • Управление контентом: Поиск похожих документов, обнаружение дубликатов и создание многоязычных баз знаний
  • Поддержка клиентов: Сопоставление вопросов с ответами на разных языках и интеллектуальная маршрутизация заявок на поддержку
  • Социальные сети и сообщества: Открытие контента, трендов и пользователей за языковыми границами

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

Советы по реализации

  • Выберите правильную модель
    Выбирайте многоязычные модели векторных представлений, такие как LaBSE, XLM-R или mBERT, в зависимости от ваших языковых потребностей и задач. Убедитесь, что используемая вами модель поддерживает языки, которые вы ожидаете как в запросах, так и в документах.
  • Предобработка с умом
    Нормализуйте и очищайте ваш входной текст последовательно на разных языках перед генерацией векторных представлений. Даже небольшие различия в предобработке (такие как пунктуация или регистр) могут повлиять на качество векторов.
  • Храните информацию о языке
    Сохраняйте поле language в ваших данных. Хотя векторный поиск не требует этого, это может помочь с фильтрацией, аналитикой или улучшением пользовательского опыта.
  • Проектируйте для ясности
    Показывайте информацию о языке в результатах поиска и позволяйте пользователям легко фильтровать или переключать языки — особенно если ваше приложение смешивает несколько языков.

С этими мерами вы будете готовы создать функции поиска, которые естественно работают на разных языках — без необходимости в слоях перевода.

7. Ускорение векторного поиска: советы по производительности

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

Понимание RAM против дискового хранилища

В Manticore векторный поиск работает по-разному в зависимости от того, хранятся ли ваши векторы в сегментах RAM или на диске:

  1. Дисковые сегменты:
    • Каждый дисковый сегмент поддерживает свой собственный независимый индекс HNSW
    • Для KNN-запросов, охватывающих несколько дисковых сегментов, индекс каждого сегмента ищется отдельно
    • Это может повлиять на точность поиска, так как граф HNSW каждого сегмента ограничен векторами в этом сегменте
    • При поиске по многим дисковым сегментам производительность запроса может быть медленнее
    • Для таблиц с векторными атрибутами Manticore автоматически устанавливает более низкое значение optimize_cutoff (физические ядра CPU делятся на 2), чтобы улучшить производительность векторного поиска
  2. Сегмент RAM:
    • Использует более прямой подход к поиску векторов
    • Может предоставить более быстрые результаты для недавно добавленных данных
    • По мере роста сегмента RAM производительность векторного поиска может постепенно ухудшаться
    • Каждый сегмент RAM в конечном итоге становится дисковым сегментом, когда достигает предела размера, определенного rt_mem_limit (по умолчанию 128M) или когда вы явно конвертируете его с помощью FLUSH RAMCHUNK

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

  • Использование пакетных вставок для минимизации фрагментации сегментов RAM
  • Использование функции auto-optimize Manticore, которая автоматически объединяет дисковые сегменты для поддержания оптимальной производительности
  • Настройка optimize_cutoff в зависимости от вашей конкретной нагрузки и ресурсов CPU
  • Использование настроек diskchunk_flush_write_timeout и diskchunk_flush_search_timeout для управления поведением автоматической очистки

Производительность векторного поиска по дисковым сегментам зависит от количества сегментов и их распределения. Меньшее количество дисковых сегментов, как правило, обеспечит лучшую производительность KNN-запросов, чем множество мелких сегментов.

Понимание параметра ef

Параметр ef позволяет вам сбалансировать скорость и точность:

  1. Что он делает:
    • Более высокие значения дают более точные результаты, но требуют больше времени
    • Более низкие значения быстрее, но могут пропустить некоторые хорошие совпадения
  2. Поиск золотой середины:
    • Начните с значения по умолчанию (200)
    • Увеличьте, если точность критична
    • Уменьшите, если скорость имеет первостепенное значение
    • Протестируйте на ваших реальных данных!

8. Обеспечение безопасности ваших векторных данных: варианты резервного копирования

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

Физические резервные копии

Физические резервные копии особенно хорошо подходят для векторных данных, потому что:

  • Скорость: Они напрямую копируют сырые файлы векторных данных, что критично для больших наборов векторных данных
  • Согласованность: Они обеспечивают резервное копирование всех векторных данных и индексов HNSW вместе
  • Низкая нагрузка на систему: Они не требуют дополнительной обработки векторных данных

Вы можете использовать либо:

  1. Инструмент командной строки manticore-backup:
manticore-backup --backup-dir=/path/to/backup --tables=your_vector_table
  1. Команду SQL BACKUP:
BACKUP TABLE your_vector_table TO /path/to/backup

Логические резервные копии

Логические резервные копии могут быть полезны для векторных данных, когда вам нужно:

  • Портативность: Перемещение векторных данных между различными системами
  • Выборочное восстановление: Восстановление конкретных векторных атрибутов или измерений
  • Миграция Версий: Переход между различными версиями Manticore. Новые версии обычно поддерживают обратную совместимость, поэтому вам, вероятно, не потребуется использовать дамп данных при обновлении. Однако, если вы понижаете версию до более старой, использование дампа данных может быть полезным.

Вы можете использовать mysqldump для логических резервных копий векторных данных:

mysqldump -h0 -P9306 -e "SELECT * FROM your_vector_table" > vector_backup.sql

Лучшие Практики для Резервного Копирования Векторных Данных

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

  1. Регулярные Резервные Копии:
    • Настройте регулярные резервные копии, особенно после внесения крупных обновлений в ваши векторные данные
    • Учитывайте размер ваших векторных данных при решении о том, как часто делать резервные копии
  2. Место для Резервных Копий:
    • Сохраняйте резервные копии в месте, где достаточно места для больших векторных данных
    • Используйте сжатие, если ваши векторные данные очень большие
  3. Тестирование:
    • Регулярно тестируйте ваши резервные копии, чтобы убедиться, что их можно восстановить
    • После восстановления проверьте, что векторный поиск по-прежнему работает корректно
  4. Контроль Версий:
    • Ведите учет версии Manticore, которую вы используете
    • Убедитесь, что ваши резервные копии будут работать с этой версией, если вам нужно восстановить
  5. Мониторинг:
    • Следите за размерами резервных копий и временем, которое они занимают
    • Настройте оповещения на случай, если какие-либо резервные копии не удастся выполнить

9. Поддержание Доступности Вашей Поисковой Системы: Репликация

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

Мульти-Мастер Репликация

Manticore поддерживает библиотеку Galera для репликации и предлагает несколько ключевых функций:

  • Истинная Мульти-Мастер: Операции чтения и записи могут выполняться на любом узле в любое время
  • Практически Синхронная: Нет задержки на слейвах и потери данных после сбоев узлов
  • Горячий Резерв: Ноль времени простоя во время сценариев переключения
  • Плотно Связанные: Все узлы поддерживают одно и то же состояние без расхождения данных
  • Автоматическое Обеспечение Узлов: Не требуется ручное резервное копирование/восстановление для новых узлов
  • Репликация на Основе Сертификации: Обеспечивает согласованность данных по всему кластеру

Настройка Репликации для Векторного Поиска

Чтобы включить репликацию для векторного поиска:

  1. Требования к Конфигурации:
    • Опция data_dir установлена по умолчанию в конфигурации searchd
    • Директива listen с доступным IP-адресом является необязательной - репликация будет работать и без нее
    • Опционально установите уникальные значения server_id для каждого узла
  2. Создание Репликационного Кластера:
    CREATE CLUSTER vector_cluster
    
  3. Добавление Векторных Таблиц в Кластер:
    ALTER CLUSTER vector_cluster ADD vector_table
    
  4. Присоединение Узлов к Кластеру:
    JOIN CLUSTER vector_cluster AT 'host:port'
    

При работе с векторными данными в реплицированной среде:

  1. Операции Записи:
    • Все изменения векторов (INSERT, REPLACE, DELETE, TRUNCATE) должны использовать синтаксис cluster_name:table_name
    • Изменения автоматически распространяются на все реплики
    • Векторные операции поддерживают согласованность по всему кластеру
  2. Поддержка Транзакций:
    • Векторные операции являются атомарными по всему кластеру
    • Изменения не видны, пока не будут явно зафиксированы
    • Двоичное логирование обеспечивает долговечность векторных операций

Ограничения и Соображения

  • Репликация поддерживается для таблиц реального времени с векторными атрибутами
  • Нативные бинарные файлы Windows не поддерживают репликацию (используйте WSL вместо этого)
  • macOS имеет ограниченную поддержку репликации (рекомендуется только для разработки)
  • Каждая таблица может принадлежать только одному кластеру

10. Посмотрите Векторный Поиск в Действии: Живые Демонстрации

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

Поиск Проблем на GitHub

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

Github demo

Эта демонстрация основана на векторных возможностях Manticore Search и полностью открыта. Вы можете изучить исходный код на GitHub , чтобы увидеть, как мы это реализовали.

Попробуйте искать концепции, а не просто ключевые слова - поиск понимает, что вы ищете, даже если точные слова не совпадают!

Как Работает Демонстрация Поиска Проблем на GitHub

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

Ключевые особенности:

  • Умный поиск по тысячам проблем GitHub
  • Фильтрация в реальном времени по репозиторию, меткам и другим параметрам
  • Удобный интерфейс с подсветкой синтаксиса
  • Быстрое время отклика благодаря алгоритму HNSW от Manticore

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

Демонстрация Поиска Изображений

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

Image Search Demo

Эта демонстрация использует модель машинного обучения для преобразования изображений в векторы, а затем использует KNN поиск Manticore для нахождения похожих изображений. Исходный код доступен в нашем репозитории manticore-image-search .

Как Работает Демонстрация Поиска Изображений

The Image Search demo leverages a pre-trained vision model to extract meaningful features from images and represent them as high-dimensional vectors. When you upload an image or select one from the gallery:

  1. Изображение обрабатывается моделью зрения для генерации векторных признаков
  2. Векторный поиск Manticore находит ближайших соседей к этому вектору
  3. Возвращаются наиболее похожие изображения, ранжированные по их оценке сходства
  4. Все это происходит за миллисекунды, обеспечивая плавный пользовательский опыт

The demo handles a diverse range of image types and can find similarities based on content, style, color patterns, and even abstract concepts present in the images.

Create Your Own Demo

Both demos are excellent starting points for building your own vector search applications. Whether you're interested in:

  • Умный поиск документов
  • Системы извлечения изображений или видео
  • Рекомендательные системы
  • Классификация контента

You can leverage the same architecture and adapt it to your specific use case. The source code for both demos provides practical examples of how to:

  1. Генерировать встраивания для ваших данных
  2. Структурировать ваши таблицы Manticore для векторного поиска
  3. Реализовать эффективные API поиска
  4. Создавать удобные интерфейсы

These demos demonstrate how vector search can be applied to real-world problems with impressive results. They're also fully open source, so you can learn from them or even deploy your own version!

By tweaking these settings, you can make vector search lightning-fast for your specific needs. Remember, the right configuration depends on your data, your hardware, and what you're trying to accomplish. Don't be afraid to experiment!

11. Running Vector Search in Production

After exploring all these features and capabilities, it's time to discuss what it takes to deploy vector search in a production environment. Let's cover the critical factors that will ensure your implementation is reliable, scalable, and performs optimally.

What You Need: Infrastructure Requirements

  1. Hardware Considerations:
    • CPU: Векторные операции требуют много ресурсов ЦП
      • Рекомендуются современные многоядерные процессоры
      • Учитывайте размер кэша ЦП для векторных операций
      • Мониторьте использование ЦП в периоды пиковых нагрузок
    • Память:
      • Индексы HNSW требуют значительного объема ОЗУ
      • Планируйте 2-3x размер ваших векторных данных
      • Учитывайте фрагментацию памяти со временем
    • Хранение:
      • Рекомендуются быстрые SSD для дисковых чанков
      • Учитывайте конфигурации RAID для надежности
      • Планируйте требования к резервному хранению
  2. Сетевая конфигурация:
    • Высокая пропускная способность для репликации
    • Низкая задержка для распределенных настроек
    • Правильные правила брандмауэра для связи в кластере
    • Конфигурация балансировщика нагрузки для высокой доступности

Vector search represents a fundamental shift in how we approach search and similarity matching in modern applications. Throughout this deep dive, we've explored how Manticore Search implements this powerful technology, from the underlying concepts of embeddings to production-ready deployment strategies.

Key takeaways from our exploration:

  1. Powerful Capabilities: Векторный поиск позволяет понимать смысл слов, выходя за рамки традиционного сопоставления ключевых слов для нахождения действительно релевантных результатов на основе смысла и контекста.
  2. Flexible Implementation: Векторный поиск Manticore может быть применен к различным случаям использования, от текстового поиска до сопоставления изображений, рекомендаций и многоязычных приложений.
  3. Production-Ready: С такими функциями, как репликация, варианты резервного копирования и оптимизация производительности, векторный поиск Manticore готов к развертыванию в корпоративной среде.
  4. Easy to Get Started: Несмотря на свои сложные возможности, векторный поиск в Manticore доступен и может быть реализован с минимальной конфигурацией.

As we look to the future, vector search will continue to evolve and become even more integral to modern applications. The ability to understand and match content based on meaning rather than just keywords is transforming how users interact with data. Whether you're building a search engine, recommendation system, or content discovery platform, vector search provides the foundation for creating more intelligent and user-friendly applications.

To get started with vector search in your own projects, check out our GitHub repository and join our community . We're excited to see what you'll build with Manticore's vector search capabilities!

Remember: The best way to understand the power of vector search is to try it yourself. Start with our demos and experiment with your own use cases. The possibilities are endless, and we're here to help you explore them.

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

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