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


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

Область применения: Виртуальные ядра 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 integer Число измерений для сходства векторов. DiskANN поддерживает до 2000 измерений, а в будущем планируется поддержка 40 000 и более поздних версий.
similarity строка Метрика сходства, используемая с индексом. Возможные варианты: COS (косинус расстояние), L2 (Евклидеан расстояние) и IP (внутренний продукт).
maxDegree integer Максимальное количество ребер на узел в графе. Этот параметр варьируется от 20 до 2048 (по умолчанию — 32). Более maxDegree высокий подход подходит для наборов данных с высокими размерностью и (или) высокими требованиями к точности.
lBuild integer Задает количество потенциальных соседей, вычисляемых во время построения индекса DiskANN. Этот параметр, который варьируется от 10 до 500 (по умолчанию — 50), балансирует точность и вычислительные затраты: более высокие значения повышают качество индекса и точность, но увеличивают время сборки.

Примечание.

Включите функцию "Индекс вектора DiskANN для виртуальных ядер Azure Cosmos DB для MongoDB" на вкладке "Предварительные версии компонентов" подписки Azure. Дополнительные сведения о предварительных версиях функций см. здесь.

Выполнение векторного поиска с помощью 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 integer Задает размер динамического списка кандидатов для поиска. Значение по умолчанию — 40с настраиваемым диапазоном от 10 до 1000. Увеличение значения улучшает отзыв, но может снизить скорость поиска.
k integer Определяет количество возвращаемых результатов поиска. Значение k должно быть меньше или равно lSearch.

Пример использования индекса 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();

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

[
  { 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, , $eq$lte, $neq, $gte, $nin$gt$inи .$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или efConstructionefSearch использование HNSW или numListsnProbes при использовании IVF может привести к улучшению результатов. Перед использованием необходимо протестировать конфигурацию, чтобы убедиться, что результаты удовлетворительны.

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

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

Используйте семантический ядро для оркестрации получения информации из Azure Cosmos DB для виртуальных ядер MongoDB и 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. Это позволяет разблокировать полный потенциал данных с помощью векторных внедрения, и позволяет создавать более точные, эффективные и мощные приложения.

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