Поделиться через


Векторные базы данных

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

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

В этой статье приведены некоторые сведения о векторных базах данных и объясняется, как можно использовать eventhouse в качестве векторной базы данных в аналитике в реальном времени в Microsoft Fabric. Практический пример см. в руководстве . Использование eventhouse в качестве векторной базы данных.

Основные понятия

Следующие основные понятия используются в векторных базах данных:

Сходство векторов

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

Внедрение

Внедрение — это распространенный способ представления данных в векторном формате для использования в векторных базах данных. Внедрение — это математическое представление фрагмента данных, например слова, текстового документа или изображения, которое предназначено для захвата его семантического значения. Внедрения создаются с помощью алгоритмов, которые анализируют данные и создают набор числовых значений, представляющих свои ключевые функции. Например, внедрение слова может представлять свое значение, его контекст и его связь с другими словами. Процесс создания внедрения прост. Хотя их можно создать с помощью стандартных пакетов Python (например, spacy, sent2vec, Gensim), крупные языковые модели (LLM) создают высококачественные внедрения для семантического поиска текста. Например, можно отправить текст в модель внедрения в Azure OpenAI и создать векторное представление, которое можно хранить для анализа. Дополнительные сведения см. в статье "Общие сведения о внедрении" в Службе OpenAI Azure.

Общий рабочий процесс

Схематика внедрения, хранения и запроса текста, хранящегося в виде векторов.

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

  1. Внедрение данных: преобразование данных в векторный формат с помощью модели внедрения. Например, можно внедрить текстовые данные с помощью модели OpenAI.
  2. Векторы хранилища: храните внедренные векторы в базе данных векторов. Внедренные данные можно отправлять в хранилище событий для хранения векторов и управления ими.
  3. Внедрение запроса. Преобразование данных запроса в векторный формат с помощью той же модели внедрения, используемой для внедрения хранимых данных.
  4. Векторы запросов: используйте поиск сходства векторов для поиска записей в базе данных, аналогичной запросу.

Eventhouse в качестве векторной базы данных

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

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

  • Динамический тип данных, который может хранить неструктурированные данные, такие как массивы и пакеты свойств. Таким образом, для хранения векторных значений рекомендуется использовать тип данных. Можно дополнительно увеличить векторное значение, сохраняя метаданные, связанные с исходным объектом, в виде отдельных столбцов в таблице.
  • Тип Vector16 кодирования, предназначенный для хранения векторов чисел с плавающей запятой в 16 битах точности, которая использует Bfloat16 вместо 64 бит по умолчанию. Эта кодировка рекомендуется для хранения векторных векторов машинного обучения, так как она снижает требования к хранилищу на четверо и ускоряет обработку векторных функций, таких как series_dot_product() и series_cosine_similarity() по порядкам величины.
  • Функция series_cosine_similarity , которая может выполнять поиск по сходству векторов поверх векторов, хранящихся в eventhouse.

Оптимизация для масштабирования

Дополнительные сведения об оптимизации поиска сходства векторов см. в блоге.

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

  1. Задайте для кодирования столбца внедрения значение Vector16, 16-разрядная кодировка коэффициентов векторов (вместо 64-разрядной версии по умолчанию).
  2. Сохраните таблицу векторов внедрения на всех узлах кластера по крайней мере один сегмент на процессор, который выполняется следующим образом:
    1. Ограничить количество векторов внедрения на сегмент путем изменения ShardEngineMaxRowCount политики сегментирования. Политика сегментирования балансирует данные на всех узлах с несколькими экстентами на узел, чтобы поиск может использовать все доступные процессоры.
    2. Измените RowCountUpperBoundForMerge политики слияния. Политика слияния необходима для подавления слиянием экстентов после приема.

Примеры действий по оптимизации

В следующем примере для хранения векторов 1M определена статическая векторная таблица. Политика внедрения определяется как Vector16, а политики сегментирования и объединения задаются для оптимизации таблицы для поиска сходства векторов. Для этого предположим, что кластер имеет 20 узлов, каждый из которых имеет 16 процессоров. Сегменты таблицы должны содержать не более 1000000/(20*16)=3125 строк.

  1. Следующие команды KQL выполняются по одному, чтобы создать пустую таблицу и задать необходимые политики и кодировку:

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. Прием данных в таблицу, созданную и определенную на предыдущем шаге.

Следующий шаг