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


Векторное хранилище в Azure Cosmos DB для виртуального ядра MongoDB

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

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

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

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

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

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

Azure Cosmos DB для MongoDB (vCore) предоставляет надежные возможности поиска векторов, что позволяет выполнять высокоскоростные поиски сходства в сложных наборах данных. Чтобы выполнить векторный поиск в Azure Cosmos DB для MongoDB, сначала необходимо создать векторный индекс. Cosmos DB в настоящее время поддерживает три типа векторных индексов:

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

Индексы DiskANN доступны на уровнях M40 и более поздних версиях. Чтобы создать индекс DiskANN, установите параметр "kind" в "vector-diskann", следуя приведённому ниже шаблону:

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-diskann", 
                "dimensions": <integer_value>,
                "similarity": <string_value>,
                "maxDegree" : <integer_value>, 
                "lBuild" : <integer_value>, 
            } 
        } 
    ] 
}
Поле Тип Описание:
index_name строка Уникальное имя индекса.
path_to_property строка Путь к свойству, содержащему вектор. Этот путь может быть свойством верхнего уровня или путем точечной нотации к свойству. Векторы должны быть в формате number[], чтобы быть индексированными и использоваться в результатах векторного поиска. Использование другого типа, например double[], предотвращает индексирование документа. Неиндексированные документы не будут возвращены в результате векторного поиска.
kind строка Тип создаваемого векторного индекса. Параметры: vector-ivf, vector-hnswи vector-diskann.
dimensions целое число Число измерений для сходства векторов. DiskANN поддерживает до 2000 измерений, а в будущем планируется поддержка более 40 000 измерений.
similarity строка Метрика сходства, используемая с индексом. Возможные варианты: COS (косинус расстояние), L2 (Евклидеан расстояние) и IP (внутренний продукт).
maxDegree целое число Максимальное количество ребер на узел в графе. Этот параметр варьируется от 20 до 2048 (по умолчанию — 32). Более maxDegree высокий метод подходит для наборов данных с высокой размерностью и/или высокими требованиями к точности.
lBuild целое число Задает количество потенциальных соседей, вычисляемых во время построения индекса DiskANN. Этот параметр, который варьируется от 10 до 500 (по умолчанию — 50), балансирует точность и вычислительные затраты: более высокие значения повышают качество индекса и точность, но увеличивают время сборки.

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

Чтобы выполнить векторный поиск, используйте стадию конвейера агрегирования $search и выполните запрос с оператором cosmosSearch. DiskANN позволяет выполнять высокопроизводительные поиски в больших наборах данных с дополнительными фильтрами, такими как геопространственные или текстовые фильтры.

{
  "$search": {
    "cosmosSearch": {
      "path": "<path_to_property>",
      "query": "<query_vector>",  
      "k": <num_results_to_return>,  
      "filter": {"$and": [
        { "<attribute_1>": { "$eq": <value> } },
        {"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
      ]}
    }
  }
},
Поле Тип Описание:
lSearch целое число Задает размер динамического списка кандидатов для поиска. Значение по умолчанию — 40с настраиваемым диапазоном от 10 до 1000. Увеличение значения улучшает запоминание, но может снизить скорость поиска.
k целое число Определяет количество возвращаемых результатов поиска. Значение k должно быть меньше или равно lSearch.

Включение DiskANN в новом кластере

Чтобы включить векторный индекс DiskANN в недавно подготовленном кластере Azure Cosmos DB для MongoDB (vCore), выполните следующие действия, чтобы выполнить регистрацию на уровне кластера с помощью Azure CLI:

  1. Вход в Azure CLI
az login
  1. Получите текущие параметры для флагов компонентов в кластере. Это гарантирует сохранение существующих флагов при добавлении новой функции.
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
  1. DiskANNIndex Добавьте флаг в список функций предварительной версии, не удаляя существующие.
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}" 

Пример использования индекса DiskANN с фильтрацией

Добавление векторов в базу данных

Чтобы использовать векторный поиск с геопространственными фильтрами, добавьте документы, которые включают как векторные представления, так и координаты местоположения. Векторы можно создать с помощью собственной модели, Azure OpenAI Embeddings, или другого API (например, Hugging Face на Azure).

from pymongo import MongoClient

client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]

documents = [
    {"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
    {"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
    {"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
    {"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]

collection.insert_many(documents)

Создание векторного индекса DiskANN

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

db.command({
    "createIndexes": "testCollection",
    "indexes": [
        {
            "name": "DiskANNVectorIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "dimensions": 3,
                "similarity": "COS",
                "maxDegree": 32,
                "lBuild": 64
            }
        },
        { 
            "name": "is_open",
            "key": { 
                "is_open": 1 
            }      
        },
        {
            "name": "locationIndex",
            "key": {
                "location": 1
            }
        }
    ]
})

Эта команда создает векторный индекс DiskANN в поле contentVector в exampleCollection, что позволяет выполнять поиск сходства. Он также добавляет:

  • Индекс в is_open поле, позволяющий фильтровать результаты на основе того, открыты ли предприятия.
  • Геопространственный индекс в поле location для фильтрации по географической близости.

Чтобы найти документы с аналогичными векторами в пределах определенного географического радиуса, укажите queryVector поиск сходства и включите геопространственный фильтр.

query_vector = [0.52, 0.28, 0.12]
pipeline = [
    {
        "$search": {
            "cosmosSearch": {
                "path": "contentVector",
                "vector": query_vector,
                "k": 5,
                "filter": {
                    "$and": [
                        {"is_open": {"$eq": 1}},
                        {"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
                    ]
                }
            }
        }
    }
]

results = list(collection.aggregate(pipeline))
for result in results:
    print(result)

В этом примере поиск сходства векторов возвращает самые k близкие векторы на основе указанной COS метрики сходства, а фильтрация результатов включает только открытые предприятия в радиусе 100 миль.

[
  {
    similarityScore: 0.9745354109084544,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'CEO of AdventureWorks',
      is_open: 1,
      location: [-118.9865, 34.0145],
      contentVector: [0.52, 0.20, 0.23]
    }
  },
  {
    similarityScore: 0.9006955671333992,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'President of Our Planet initiative',
      is_open: 1,
      location: [-119.7302, 34.4005],
      contentVector: [0.91, 0.76, 0.83]
    }
  }
]

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

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

Чтобы получить определение векторного индекса из коллекции, используйте listIndexes команду:

db.exampleCollection.getIndexes();

В этом примере возвращаются все параметры cosmosSearch, которые использовались для создания индекса vectorIndex:

[
  { v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
  {
    v: 2,
    key: { vectorContent: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
      numLists: 3,
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

Отфильтрованный векторный поиск (предварительная версия)

Теперь можно выполнять векторные поиски с помощью любого поддерживаемого фильтра запросов, например $lt, , $lte$eq, $neq, $gte, $gt$in$ninи .$regex Включите функцию "Фильтрация векторного поиска" на вкладке "Предварительные версии компонентов" подписки Azure. Дополнительные сведения о предварительных версиях функций см. здесь.

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

db.runCommand({ 
     "createIndexes": "<collection_name",
    "indexes": [ {
        "key": { 
            "<property_to_filter>": 1 
               }, 
        "name": "<name_of_filter_index>" 
    }
    ] 
});

Затем можно добавить термин в векторный "filter" поиск, как показано ниже. В этом примере фильтр ищет документы, в которых "title" свойство не находится в списке ["not in this text", "or this text"].


db.exampleCollection.aggregate([
  {
      '$search': {
          "cosmosSearch": {
              "vector": "<query_vector>",
              "path": <path_to_vector>,
              "k": num_results,
              "filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
          },
          "returnStoredSource": True }},
      {'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);

Внимание

Хотя в предварительной версии отфильтрованный векторный поиск может потребовать настройки параметров индекса вектора для повышения точности. Например, увеличение m, efConstruction или efSearch при использовании HNSW, или numLists или nProbes при использовании IVF может привести к улучшению результатов. Перед использованием необходимо протестировать конфигурацию, чтобы убедиться, что результаты удовлетворительны.

Используйте средства оркестрации LLM

Использование векторной базы данных с семантическим ядром

Используйте семантическое ядро для оркестрации получения информации из Azure Cosmos DB для MongoDB vCore и вашей системы LLM. Подробнее см. здесь.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

Использование векторной базы данных с LangChain

Используйте LangChain для оркестрации получения информации из Azure Cosmos DB для виртуальных ядер MongoDB и LLM. Подробнее см. здесь.

Использование в качестве семантического кэша с LangChain

Используйте LangChain и Azure Cosmos DB для MongoDB (vCore) для оркестрации семантического кэширования с применением ранее записанных ответов LLM, которые могут снизить затраты на API LLM и уменьшить задержку при ответах. Дополнительные сведения см. здесь

Возможности и ограничения

  • Поддерживаемые метрики расстояния: L2 (Euclidean), внутренний продукт и косинус.
  • Поддерживаемые методы индексирования: IVFFLAT, HNSW и DiskANN (предварительная версия)
  • Индексирование векторов размером до 2000 измерений.
  • Индексирование применяется только к одному вектору на путь.
  • На векторный путь можно создать только один индекс.

Итоги

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

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