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

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

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

В этой статье приводятся общие сведения о векторных базах данных и на концептуальном уровне объясняется, как можно использовать Eventhouse в качестве векторной базы данных в Real-Time Intelligence в Microsoft Fabric. Практические примеры см. в руководстве: использование Eventhouse в качестве векторной базы данных с эмбеддингами LLM и руководстве: использование Eventhouse в качестве векторной базы данных с эмбеддингами SLM.

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

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

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

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

Внедрение

Внедрение — это распространенный способ представления данных в векторном формате для использования в векторных базах данных. Внедрение — это математическое представление фрагмента данных, например слова, текстового документа или изображения, которое фиксирует его семантический смысл. Вы создаете внедрения с помощью алгоритмов, которые анализируют данные и создают набор числовых значений, представляющих свои ключевые функции. Например, векторное представление слова может отражать его значение, контекст и связь с другими словами. Внедрение — это распространенный способ представления данных в векторном формате для использования в векторных базах данных. Внедрение — это математическое представление фрагмента данных, например слова, текстового документа или изображения, которое фиксирует его семантический смысл. Вы создаете внедрения с помощью алгоритмов, которые анализируют данные и создают набор числовых значений, представляющих свои ключевые функции. Например, векторное представление слова может отражать его значение, контекст и связь с другими словами. Eventhouse поддерживает два метода для генерации эмбеддингов прямо в KQL:

  • плагин ai_embeddings: вызывает внешнюю конечную точку Azure OpenAI для генерации эмбеддингов с использованием больших языковых моделей (LLM). Этот метод создает высококачественные внедрения и лучше подходит для рабочих нагрузок семантического поиска.

  • slm_embeddings_fl(): выполняет небольшие языковые модели (SLM) локально в песочнице Kusto Python, создавая внедрения без какой-либо внешней конечной точки. Этот метод не требует ресурса Azure OpenAI и не влечет платы за каждый эмбеддинг.

Дополнительные сведения о внедрении в Azure OpenAI см. в разделе "Общие сведения о внедрении" в Служба Azure OpenAI.

Выбор метода внедрения

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

Соображение плагин ai_embeddings (LLM) slm_embeddings_fl() (SLM)
Качество модели Высокое качество; использует такие модели Azure OpenAI, какtext-embedding-3-large Хорошее качество; используются SLM с открытым исходным кодом, например harrier-v1-270m, jina-v2-small и e5-small-v2
Внешняя зависимость Требуется ресурс Azure OpenAI с развернутой моделью эмбеддингов Ни один; Модели выполняются локально в песочнице Python
Cost Цены на запросы на основе использования Azure OpenAI Без затрат на внедрение
Пропускная способность Подчиняется лимитам скорости Azure OpenAI; требуется пакетная обработка и логика повторных попыток Ограничено только вычислительными ресурсами кластера; Масштабируется естественным образом с размером кластера
Setup Требуются развертывание Azure OpenAI, настройка политики callout и настройка идентификации Требуется включенный плагин Python и загруженные в lakehouse артефакты SLM
Максимальная длина контекста Зависит от развернутой модели (например, 8 192 токенов для text-embedding-3-large) До 32 768 токенов с harrier-v1-270m, 8 192 с jina-v2-small и 512 с e5-small-v2
лучше всего подходит для Семантический поиск в рабочей среде, где качество внедрения является главным приоритетом Рабочие процессы с повышенными требованиями к конфиденциальности, быстрое прототипирование, пакетное создание эмбеддингов в больших объёмах или сценарии без доступа к Azure OpenAI

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

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

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

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

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

В основе поиска сходства векторов лежит способность хранить, индексировать и запрашивать векторные данные. Центры событий предоставляют решение для обработки и анализа больших объемов данных, особенно в сценариях, требующих аналитики и изучения в режиме реального времени. Эта возможность делает 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 процессоров. Сегменты таблицы должны содержать не более 1 000 000/(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. Загрузите данные в таблицу, созданную и определенную на предыдущем шаге.

Дальнейшие действия