Индексные векторные данные в Cosmos DB (в Azure и Fabric)

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

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

  • Точный поиск "плоских" или к-ближайших соседей (иногда называемый методом подбора) может обеспечить 100% отзыв для небольших, ориентированных векторных поисков. особенно при сочетании с фильтрами запросов и ключами секционирования.

  • Квантизованный плоский индекс, который сжимает векторы с помощью методов квантизации на основе DiskANN для повышения эффективности поиска kNN.

  • DiskANN, набор алгоритмов индексирования векторов, разработанных Майкрософт Research для обеспечения эффективной и высокой точности много модального поиска векторов в любом масштабе.

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

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

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

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

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

В векторном хранилище алгоритмы поиска векторов используются для индексирования и обработки эмбеддингов запросов. Некоторые известные алгоритмы поиска векторов включают иерархический навигационно-небольшой мир (HNSW), инвертированные файлы (IVF), DiskANN и т. д. Векторный поиск — это метод, который помогает находить аналогичные элементы на основе их характеристик данных, а не по точным совпадениям в поле свойства. Этот метод полезен в таких приложениях, как поиск аналогичного текста, поиск связанных изображений, рекомендации или даже обнаружение аномалий. Он используется для запроса векторных встраиваний ваших данных, которые были созданы с использованием модели машинного обучения через API встраиваний. Примерами внедрения API являются API Azure OpenAI Embeddings или Hugging Face на Azure. Векторный поиск измеряет расстояние между векторами данных и вектором запроса. Векторы данных, близкие к вектору запросов, являются наиболее похожими семантикой.

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

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

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

  • path: свойство, содержащее вектор (обязательный).

  • datatype: тип данных свойства вектора. Поддерживаемые типы: float32 (по умолчанию) int8и uint8.

  • dimensions: размерность или длина каждого вектора в пути. Все векторы в пути должны иметь одинаковое количество измерений. (по умолчанию 1536).

  • distanceFunction: метрика, используемая для вычисления расстояния или сходства. Поддерживаемые метрики:

    • cosine, который имеет значения от $-1$ (наименее похожий) на $+1$ (наиболее похожий).

    • dot product, который имеет значения от $-\infty$ (наименее похожий) на $+\infty$ (наиболее похожий).

    • euclidean, который имеет значения от $0$ (наиболее похожие) на $+\infty$ (наименее похожий).

Замечание

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

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

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

В этом примере показана конфигурация политики встраивания векторов с одним векторным маршрутом, демонстрирующая базовую настройку для хранения 1536-мерных векторов float32 с косинусным сходством. Эта конфигурация иллюстрирует следующее:

  • /[0]: использует тип данных float32 с косинусом сходства для 1536-мерных векторов (распространенных для внедрения OpenAI)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    }
  ]
}

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

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

  • /[0]: использует тип данных float32 с косинусом сходства для 1536-мерных векторов (распространенных для внедрения OpenAI)
  • /[1]: использует тип данных int8 с расстоянием произведения точек для 100-мерных векторов (более эффективно с точки зрения памяти для небольших встраивания)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    },
    {
      "path": "/vector2",
      "dataType": "int8",
      "distanceFunction": "dotproduct",
      "dimensions": 100
    }
  ]
}

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

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

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

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

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

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

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

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

  • quantizedFlat и diskANN индексы поддерживают два метода квантизации в объекте vectorIndexes через свойство quantizerType: product и spherical.

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

{
  "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/?"
    },
    {
      "path": "/vector1/*",
    },
    {
      "path": "/vector2/*",
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "quantizedFlat"
    },
    {
      "path": "/vector2",
      "type": "diskANN"
    }
  ]
}

Методы квантизации

Кроме того, можно указать метод квантизации непосредственно в объекте vectorIndexes . Cosmos DB поддерживает два метода квантизации: productметод по умолчанию и spherical (в общедоступной предварительной версии), которые могут иметь лучшие характеристики производительности, включая более быстрое время индексирования и более высокую память. Метод квантизации можно указать с помощью quantizerType свойства в объекте vectorIndexes , как показано ниже:

{
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "diskANN",
      "quantizerType": "spherical"
    }
  ]
}

Это важно

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

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

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

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

Это важно

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