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


Поиск вектора в Azure Cosmos DB для NoSQL

Azure Cosmos DB для NoSQL теперь предлагает эффективное индексирование и поиск векторов. Эта функция предназначена для обработки много модальных, высокомерных векторов, обеспечивая эффективный и точный поиск векторов в любом масштабе. Теперь вы можете хранить векторы непосредственно в документах вместе с данными. Каждый документ в базе данных может содержать не только традиционные данные без схемы, но и многофакторные высокомерные векторы в качестве других свойств документов. Это совместное размещение данных и векторов позволяет эффективно индексировать и выполнять поиск, так как векторы хранятся в той же логической единице, что и данные, которые они представляют. Объединение векторов и данных упрощает управление данными, архитектуры приложений ИИ и эффективность операций на основе векторов.

Azure Cosmos DB для NoSQL обеспечивает гибкость, позволяя выбрать метод индексирования векторов:

  • Плоский или поиск k-ближайших соседей, точный метод поиска (иногда называемый полным перебором), может обеспечить полный охват при небольших векторных поисках. особенно при сочетании с фильтрами запросов и ключами секционирования.
  • Квантизованный плоский индекс, который сжимает векторы с помощью методов квантизации на основе DiskANN для повышения эффективности поиска kNN.
  • DiskANN, набор алгоритмов индексирования векторов, разработанных Корпорацией Майкрософт Research для повышения эффективности много модального поиска векторов с высокой точностью в любом масштабе.

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

Векторный поиск в Azure Cosmos DB можно объединить со всеми другими поддерживаемыми фильтрами запросов и индексами NoSQL Azure Cosmos DB с помощью WHERE предложений. Это позволяет выполнять поиск векторов для предоставления наиболее релевантных данных для приложений.

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


Замечание

Заинтересованы в возможностях поиска векторов с ультра высокой пропускной способностью? Azure Cosmos DB разрабатывает расширенные функции поиска векторов, предназначенные для больших векторных наборов данных, в сочетании с вставками и поисками с высокой пропускной способностью. Он может обрабатывать миллионы запросов в секунду (QPS) с прогнозируемой низкой задержкой и непревзойденной экономичностью. Зарегистрируйтесь, чтобы узнать больше о возможностях раннего доступа и получать уведомления, когда эти возможности становятся доступными.

Зарегистрируйтесь для расширенной частной предварительной версии.

Что такое хранилище векторов?

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

Как работает векторное хранилище?

В векторном хранилище алгоритмы поиска векторов используются для индексирования и обработки эмбеддингов запросов. Некоторые известные алгоритмы поиска векторов включают иерархический навигационно-малый мир (HNSW), инвертированные файлы (IVF) и DiskANN. Векторный поиск — это метод, который помогает находить аналогичные элементы на основе их характеристик данных, а не по точным совпадениям в поле свойства.

Этот метод полезен в таких приложениях, как поиск аналогичного текста, поиск связанных изображений, рекомендации или даже обнаружение аномалий. Он используется для запроса векторных представлений вашего набора данных, созданных при помощи модели машинного обучения с использованием API для представлений. Примерами API встраиваний являются Azure OpenAI Embeddings или Hugging Face на Azure.

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

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

Включение функции индексирования векторов и поиска

Чтобы включить эту функцию для Azure Cosmos DB для NoSQL, выполните следующие действия.

  1. Перейдите на страницу ресурсов Azure Cosmos DB для NoSQL.
  2. На левой панели в разделе "Параметры" выберите "Компоненты".
  3. Выберите векторный поиск ДЛЯ API NoSQL.
  4. Ознакомьтесь с описанием функции, чтобы убедиться, что вы хотите включить ее.
  5. Выберите "Включить", чтобы включить векторный поиск в Azure Cosmos DB для NoSQL.

Подсказка

Кроме того, используйте Azure CLI для обновления возможностей учетной записи для поддержки поиска векторов NoSQL.

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

Запрос на регистрацию автоматически одобряется, но на это может уйти 15 минут.

Замечание

Если вы хотите использовать векторный поиск по коллекциям с иерархическими ключами разделов, свяжитесь с командой cosmossearch@microsoft.com чтобы настроить вашу учетную запись для оптимальной настройки и использования схемы разбиения во время поиска.

Политики вектора контейнеров

Для выполнения векторного поиска с помощью Azure Cosmos DB для NoSQL требуется определить политику вектора для контейнера. Это предоставляет важную информацию для ядра СУБД для эффективного поиска векторов, найденных в документах контейнера. Это также предоставляет необходимые сведения для политики индексирования векторов, если вы решите её указать. Следующие сведения включаются в содержащуюся векторную политику:

  • path: путь свойства, содержащий векторы (обязательный).
  • datatype: тип данных свойства вектора. Поддерживаемые типы: float32, float16int8и uint8.
  • dimensions: размерность или длина каждого вектора в пути. Все векторы в пути должны иметь одинаковое количество измерений. Значение по умолчанию — 1536.
  • distanceFunction: метрика, используемая для вычисления расстояния или сходства. Поддерживаемые метрики:
    • cosine (по умолчанию), который имеет значения от -1 (наименее похожий) на +1 (наиболее похожий).
    • dot product, который имеет значения от -inf (наименее похожий) на +inf (наиболее похожий).
    • euclidean, имеющий значения от 0 (наиболее похожие) на +inf (наименее похожий).

Замечание

Каждый уникальный путь может иметь не более одной политики. Однако можно указать несколько политик, если все они нацелены на другой путь.

Замечание

Многие модели внедрения представляют элементы вектора с помощью float32. Использование float16 вместо этого может сократить объем хранилища векторов на 50%, однако это может привести к некоторому снижению точности.

Политика вектора контейнера может быть описана как объекты JSON. Ниже приведены два примера допустимых политик вектора контейнера:

Политика с одним векторным путем

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        }
    ]
}

Политика с двумя векторными путями

{
    "vectorEmbeddings": [
        {
            "path":"/vector1",
            "dataType":"float32",
            "distanceFunction":"cosine",
            "dimensions":1536
        },
        {
            "path":"/vector2",
            "dataType":"float16",
            "distanceFunction":"dotproduct",
            "dimensions":100
        }
    ]
}

Политики индексирования векторов

Индексы векторов повышают эффективность при выполнении векторного поиска с помощью системной VectorDistance функции. Векторы поиска имеют более низкую задержку, более высокую пропускную способность и меньшее потребление единиц запросов при использовании векторного индекса. Можно указать следующие типы политик индексов векторов:

Тип Description Максимальные размеры
flat Сохраняет векторы в том же индексе, что и другие индексированные свойства. 505
quantizedFlat Квантизует (сжимает) векторы перед хранением в индексе. Это может повысить задержку и пропускную способность за счет небольшого количества точности. 4096
diskANN Создает индекс на основе DiskANN для быстрого и эффективного поиска. 4096

Замечание

Индексы quantizedFlat и diskANN требуют вставки по крайней мере 1000 векторов. Это необходимо для обеспечения точности процесса квантизации. Если векторов меньше 1000, выполняется полное сканирование.

Некоторые моменты, которые следует рассмотреть:

  • flat и quantizedFlat типы индексов используют индекс Azure Cosmos DB для хранения и чтения каждого вектора при выполнении векторного поиска. Векторные поиски с индексом flat — это поиски методом перебора, обеспечивающие 100% точность или полноту. То есть гарантированно найти наиболее похожие векторы в наборе данных. Однако существует ограничение 505 измерений для векторов на плоском индексе.

  • Индекс quantizedFlat сохраняет квантованные (сжатые) векторы в индексе. Векторный поиск с использованием quantizedFlat индекса также является поиском методом прямого перебора, однако его точность может быть немного меньше 100%, так как векторы квантуируются перед добавлением в индекс. Однако поиск векторов с quantized flat должен иметь более низкую задержку, более высокую пропускную способность и более низкую стоимость RU по сравнению с векторными поисками по индексу flat. Это хороший вариант для небольших сценариев или сценариев, в которых вы используете фильтры запросов, чтобы сузить векторный поиск до относительно небольшого набора векторов. quantizedFlat рекомендуется, если число векторов для индексирования составляет около 50 000 или меньше на физическую секцию. Однако это просто общее руководство, и фактические показатели производительности должны быть проверены, так как каждый сценарий может отличаться.

  • Индекс diskANN — это отдельный индекс, определенный специально для векторов с помощью DiskANN, набора алгоритмов индексирования векторов высокой производительности, разработанных Microsoft Research. Индексы DiskANN могут предложить самые низкие задержки, высокую пропускную способность и наименьшую стоимость запросов по RU, сохраняя высокую точность. Как правило, DiskANN является наиболее эффективной из всех типов индексов, если на физическую секцию приходится более 50 000 векторов.

Замечание

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

Ниже приведены примеры допустимых политик векторного индекса:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        },
        {
            "path": "/vector1/*"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "diskANN"
        }
    ]
}
{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/_etag/?"
        }
    ],
    "vectorIndexes": [
        {
            "path": "/vector1",
            "type": "quantizedFlat"
        },
        {
            "path": "/vector2",
            "type": "diskANN"
        }
    ]
}

Это важно

Символы подстановочных карточек (*, []) и векторные пути, вложенные внутри массивов, в настоящее время не поддерживаются в политике векторов или векторном индексе.

Выполнение векторного поиска с помощью запросов VectorDistance

После создания контейнера с требуемой политикой вектора и вставки в контейнер векторных данных можно выполнить поиск вектора с помощью системной функции VectorDistance в запросе. В следующем примере показан запрос NoSQL, который проектирует оценку сходства в качестве псевдонима SimilarityScoreи сортирует по порядку наиболее похожих на наименее похожий:

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

Это важно

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

Текущие ограничения

Индексирование и поиск векторов в Azure Cosmos DB для NoSQL имеет некоторые ограничения.

  • quantizedFlat и diskANN индексы требуют индексирования по крайней мере 1000 векторов, чтобы убедиться, что квантизация является точной. Если индексируется менее 1000 векторов, то вместо этого используется полное сканирование, и плата за ресурсы может быть выше.
  • Векторы, индексированные с типом flat индекса, могут быть не более 505 измерений. Векторы, индексированные с типом quantizedFlat индекса, DiskANN могут быть не более 4096 измерений.
  • Скорость вставки векторов должна быть ограничена. Очень большая загрузка (более 5 млн векторов) в течение короткого периода времени может потребовать больше времени на создание индекса.
  • В настоящее время индексирование и поиск векторов не поддерживаются в учетных записях с общей пропускной способностью.
  • После включения индексирования векторов и поиска в контейнере его нельзя отключить.

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