Векторные базы данных
Векторная база данных хранит и управляет данными в виде векторов, которые являются числовыми массивами точек данных.
Использование векторов позволяет выполнять сложные запросы и анализы, так как векторы можно сравнивать и анализировать с помощью расширенных методов, таких как поиск сходства векторов, квантизация и кластеризация. Традиционные базы данных не хорошо подходят для обработки высокомерных данных, которые становятся все более распространенными в аналитике данных. Однако векторные базы данных предназначены для обработки высокомерных данных, таких как текст, изображения и звук, путем представления их в виде векторов. Векторные базы данных полезны для таких задач, как машинное обучение, обработка естественного языка и распознавание изображений, где цель заключается в определении шаблонов или сходств в больших наборах данных.
В этой статье приведены некоторые сведения о векторных базах данных и объясняется, как можно использовать eventhouse в качестве векторной базы данных в аналитике в реальном времени в Microsoft Fabric. Практический пример см. в руководстве . Использование eventhouse в качестве векторной базы данных.
Основные понятия
Следующие основные понятия используются в векторных базах данных:
Сходство векторов
Сходство векторов — это мера того, как разные (или аналогичные) два или более векторов. Поиск сходства векторов — это метод, используемый для поиска аналогичных векторов в наборе данных. Векторы сравниваются с помощью метрик расстояния, например Евклидеан расстояние или косинус сходство. Чем ближе два вектора, тем больше они похожи.
Внедрение
Внедрение — это распространенный способ представления данных в векторном формате для использования в векторных базах данных. Внедрение — это математическое представление фрагмента данных, например слова, текстового документа или изображения, которое предназначено для захвата его семантического значения. Внедрения создаются с помощью алгоритмов, которые анализируют данные и создают набор числовых значений, представляющих свои ключевые функции. Например, внедрение слова может представлять свое значение, его контекст и его связь с другими словами. Процесс создания внедрения прост. Хотя их можно создать с помощью стандартных пакетов Python (например, spacy, sent2vec, Gensim), крупные языковые модели (LLM) создают высококачественные внедрения для семантического поиска текста. Например, можно отправить текст в модель внедрения в Azure OpenAI и создать векторное представление, которое можно хранить для анализа. Дополнительные сведения см. в статье "Общие сведения о внедрении" в Службе OpenAI Azure.
Общий рабочий процесс
Общий рабочий процесс для использования векторной базы данных выглядит следующим образом:
- Внедрение данных: преобразование данных в векторный формат с помощью модели внедрения. Например, можно внедрить текстовые данные с помощью модели OpenAI.
- Векторы хранилища: храните внедренные векторы в базе данных векторов. Внедренные данные можно отправлять в хранилище событий для хранения векторов и управления ими.
- Внедрение запроса. Преобразование данных запроса в векторный формат с помощью той же модели внедрения, используемой для внедрения хранимых данных.
- Векторы запросов: используйте поиск сходства векторов для поиска записей в базе данных, аналогичной запросу.
Eventhouse в качестве векторной базы данных
В основе поиска подобия векторов лежит возможность хранить, индексировать и запрашивать векторные данные. Центры событий предоставляют решение для обработки и анализа больших объемов данных, особенно в сценариях, требующих аналитики и изучения в режиме реального времени, что делает его отличным выбором для хранения и поиска векторов.
Следующие компоненты включения использования векторной базы данных Eventhouse:
- Динамический тип данных, который может хранить неструктурированные данные, такие как массивы и пакеты свойств. Таким образом, для хранения векторных значений рекомендуется использовать тип данных. Можно дополнительно увеличить векторное значение, сохраняя метаданные, связанные с исходным объектом, в виде отдельных столбцов в таблице.
- Тип
Vector16
кодирования, предназначенный для хранения векторов чисел с плавающей запятой в 16 битах точности, которая используетBfloat16
вместо 64 бит по умолчанию. Эта кодировка рекомендуется для хранения векторных векторов машинного обучения, так как она снижает требования к хранилищу на четверо и ускоряет обработку векторных функций, таких как series_dot_product() и series_cosine_similarity() по порядкам величины. - Функция series_cosine_similarity , которая может выполнять поиск по сходству векторов поверх векторов, хранящихся в eventhouse.
Оптимизация для масштабирования
Дополнительные сведения об оптимизации поиска сходства векторов см. в блоге.
Чтобы повысить производительность и итоговое время поиска, выполните следующие действия.
- Задайте для кодирования столбца внедрения значение Vector16, 16-разрядная кодировка коэффициентов векторов (вместо 64-разрядной версии по умолчанию).
- Сохраните таблицу векторов внедрения на всех узлах кластера по крайней мере один сегмент на процессор, который выполняется следующим образом:
- Ограничить количество векторов внедрения на сегмент путем изменения ShardEngineMaxRowCount политики сегментирования. Политика сегментирования балансирует данные на всех узлах с несколькими экстентами на узел, чтобы поиск может использовать все доступные процессоры.
- Измените RowCountUpperBoundForMerge политики слияния. Политика слияния необходима для подавления слиянием экстентов после приема.
Примеры действий по оптимизации
В следующем примере для хранения векторов 1M определена статическая векторная таблица. Политика внедрения определяется как Vector16, а политики сегментирования и объединения задаются для оптимизации таблицы для поиска сходства векторов. Для этого предположим, что кластер имеет 20 узлов, каждый из которых имеет 16 процессоров. Сегменты таблицы должны содержать не более 1000000/(20*16)=3125 строк.
Следующие команды 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
Прием данных в таблицу, созданную и определенную на предыдущем шаге.