Облачная платформаAdvanced

О Vector Search

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

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

How It Works

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

  • Сузить область совпадения

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

  • Снизить сложность вычисления отдельного вектора

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

Векторный поиск означает извлечение k-ближайших соседей (KNN) к вектору запроса в заданном наборе векторных данных с использованием конкретного метода измерения. Как правило, CSS ориентируется только на приближенный поиск ближайших соседей (ANN), потому что поиск KNN требует чрезмерных вычислительных ресурсов.

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

Векторный поисковый движок CSS интегрирует различные векторные индексы, такие как поиск полного перебора, иерархические навигируемые Small World (HNSW) графы, квантование продукта и IVF‑HNSW. Он также поддерживает несколько методов расчёта сходства, таких как Эвклидово расстояние, внутреннее произведение, косинус и Хэмминг. Коэффициент извлечения и производительность поиска движка лучше, чем у движков с открытым исходным кодом. Он способен удовлетворять требованиям высокой производительности, высокой точности, низкой стоимости и многомодального вычисления.

Поисковый движок также поддерживает все возможности родного Elasticsearch, включая распределение, многорепликацию, восстановление после ошибок, снимок и контроль прав доступа. Движок совместим с экосистемой родного Elasticsearch, включая инструмент мониторинга кластера Cerebro, инструмент визуализации Kibana и инструмент реального времени для загрузки данных Logstash. Поддерживается несколько языков клиентов, таких как Python, Java, Go и C++.

Ограничения

  • Только кластеры Elasticsearch 7.6.2, Elasticsearch 7.10.2 и OpenSearch 1.3.6 поддерживают векторный поисковый движок CSS.
  • Векторный поисковый плагин выполняет вычисления в памяти и требует больше памяти, чем обычные индексы. Рекомендуется использовать вычислительные спецификации, оптимизированные по памяти.
  • Чтобы использовать векторный поисковый плагин CSS, объём памяти data node или cold data node должен быть больше 16 GB. Чтобы включить векторный поисковый плагин, обратитесь в техническую поддержку.

Выбор спецификаций узлов кластера для векторного поиска

Для построения индексов и запросов в векторном поиске используется off-heap память. Поэтому требуемая емкость кластера зависит от типа индекса и размера off-heap памяти. Вы можете оценить объём off-heap памяти, необходимый для полного индексирования, чтобы выбрать соответствующие спецификации кластера. Из‑за высокого потребления памяти векторным поиском, CSS по умолчанию отключает векторный поисковый плагин для кластеров с памятью 8 GB или менее.

Существует несколько методов оценки объёма off-heap памяти, необходимого для различных типов индексов. Формулы расчёта приведены ниже:

  • GRAPH Индекс

    mem_needs = (dim x dim_size + neighbros x 4) x num + delta

    Note

    Если вам нужно обновлять индексы в реальном времени, учитывайте накладные расходы памяти off-heap, необходимые для построения векторного индекса и автоматического слияния. Фактический размер требуемого mem_needs не менее чем в 1.5–2 раза от первоначальной оценки.

  • PQ Index

    mem_needs = frag_num x frag_size x num + delta

  • FALT and IVF Indexes

    mem_needs = dim x dim_size x num + delta

Таблица 1 Описание параметра

Параметр

Описание

dim

Размерность вектора

соседи

Количество соседей узла графа. Значение по умолчанию 64.

dim_size

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

num

Общее количество векторов

delta

Размер метаданных. Этот параметр можно оставить пустым.

frag_num

Количество сегментов вектора при квантизации и кодировании. Если этот параметр не указан при создании индекса, значение определяется размерностью вектора dim.

if dim <= 256:
frag_num = dim / 4
elif dim <= 512:
frag_num = dim / 8
else :
frag_num = 64

frag_size

Размер центральной точки при квантизации и кодировании. Значение по умолчанию — 1.

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

Политика распределения памяти кучи: размер памяти кучи каждого узла составляет половину физической памяти узла, а максимальный размер — 31 GB.

Например, если вы создаете индекс Graph для набора данных SIFT10M, с dim установлен в 128, dim_size в 4, соседи к значению по умолчанию 64, и num в 10 миллионов, требуемая внекучавая память для индекса Graph составляет около 7,5 ГБ. Формула расчёта: mem_needs = (128 x 4 + 64 x 4) x 10000000 ≈ 7.5.

Учитывая накладные расходы памяти кучи, один сервер с 8 vCPUs и 16 GB памяти рекомендуется. Если требуется запись или обновление в реальном времени, необходимо запросить больше памяти.