Векторное хранилище в виртуальном ядере 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
или efConstruction
efSearch
использование HNSW или numLists
nProbes
при использовании IVF может привести к улучшению результатов. Перед использованием необходимо протестировать конфигурацию, чтобы убедиться, что результаты удовлетворительны.
Использование средств оркестрации LLM
Использование векторной базы данных с семантическим ядром
Используйте семантический ядро для оркестрации получения информации из Azure Cosmos DB для виртуальных ядер MongoDB и LLM. Подробнее см. здесь.
Использование векторной базы данных с 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. Это позволяет разблокировать полный потенциал данных с помощью векторных внедрения, и позволяет создавать более точные, эффективные и мощные приложения.
Связанный контент
- Эталонное решение .NET RAG Pattern для розничной торговли
- Руководство по .NET — рецепт чат-бот
- Шаблон RAG C# — интеграция служб OpenAI со Cosmos
- Шаблон Python RAG — чат-бот продукта Azure
- Руководство по записной книжке Python. Интеграция векторной базы данных с помощью LangChain
- Учебник по записной книжке Python. Интеграция кэширования LLM с помощью LangChain
- Python — интеграция LlamaIndex
- Python — интеграция семантической памяти ядра