共用方式為


以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 中的向量存放區

適用於: MongoDB 虛擬核心

使用適用於 MongoDB 的 Azure Cosmos DB 整合向量資料庫(虛擬核心),將 AI 型應用程式與儲存在 Azure Cosmos DB 中的數據順暢地連線。 這項整合可以包括您使用 Azure OpenAI 內嵌所建置的應用程式。 原生整合向量資料庫可讓您有效率地儲存、編製索引及查詢直接儲存在適用於 MongoDB 的 Azure Cosmos DB 中的高維度向量數據,以及建立向量數據的原始數據。 它消除了將資料傳輸到替代向量儲存的需求並產生額外的成本。

什麼是向量存放區?

向量存放區或向量資料庫是用來儲存及管理向量內嵌的資料庫,這是高維度空間中資料的數學表示法。 在此空間中,每個維度各對應至資料的一個特徵,且有數萬個維度可用來代表複雜的資料。 向量在此空間中的位置代表其特性。 單字、片語或整份文件、影像、音訊和其他類型的資料,全都可以向量化。

向量存放區如何運作?

在向量存放區中,向量搜尋演算法可用來編製索引和查詢內嵌。 一些已知的向量搜尋演算法包括階層式導覽小型世界 (HNSW)、反轉檔案 (IVF)、DiskANN 等。向量搜尋方法可協助您根據資料性質來尋找類似的項目,而不是根據屬性欄位尋找完全相符的項目。 此技術適用於搜尋類似文字、尋找相關影像、提出建議,甚至偵測異常這類應用程式。 其運作方式是利用內嵌 API 的機器學習模型,查詢您所建立的資料向量內嵌 (數字清單)。 內嵌 API 的範例是 Azure OpenAI 內嵌Hugging Face on Azure。 向量搜尋會測量資料向量與查詢向量之間的距離。 最接近查詢向量的資料向量就是所找到語意最類似的資料向量。

在適用於 MongoDB 的 Azure Cosmos DB 整合向量資料庫中,內嵌可以與原始數據一起儲存、編製索引及查詢。 此方法可讓您在複寫個別純向量資料庫中的資料時,無需支付額外的成本。 此外,此結構會一併保存向量內嵌和原始資料,進一步簡化多模資料作業,並提高資料一致性、規模和效能。

適用於 MongoDB 的 Azure Cosmos DB (虛擬核心) 提供健全的向量搜尋功能,可讓您跨複雜數據集執行高速相似性搜尋。 若要在適用於 MongoDB 的 Azure Cosmos DB 中執行向量搜尋,您必須先建立向量索引。 Cosmos DB 目前支援三種類型的向量索引:

  • DiskANN (建議):適用於大型數據集,利用 SSD 以有效率的記憶體使用量,同時在近似鄰近的搜尋中維持高回收率。
  • 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 string 索引的唯一名稱。
path_to_property string 包含向量的屬性的路徑。 此路徑可以是最上層屬性或屬性的點標記法路徑。 向量必須是 number[] 要編制索引並用於向量搜尋結果的 。 使用另一種類型 (例如 double[]) 可防止將文件編製索引。 在向量搜尋的結果中,將不會傳回未編製索引的文件。
kind 字串 要建立的向量索引類型。 選項有 vector-ivfvector-hnswvector-diskann
dimensions 整數 向量相似度的維度數目。 DiskANN 最多可支援 2000 個維度,並規劃未來支援 40,000+。
similarity 字串 與索引搭配使用的相似度計量。 可能的選項是 COS (餘弦距離)、L2 (歐幾里得距離) 和 IP (內積)。
maxDegree 整數 圖形中每個節點的邊緣數目上限。 此參數的範圍從 20 到 2048(預設值為 32)。 較高 maxDegree 適用於具有高維度和/或高精確度需求的數據集。
lBuild 整數 設定 DiskANN 索引建構期間評估的候選芳鄰數目。 此參數的範圍從 10 到 500(預設值為 50),可平衡精確度和計算額外負荷:較高的值可改善索引品質和精確度,但增加建置時間

注意

在 Azure 訂用帳戶的 [預覽功能] 索引卷標中,啟用以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 的 [DiskANN 向量索引]。 在這裡深入瞭解預覽功能。

使用 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,具有從 101000的可設定範圍。 增加值可增強召回率,但可能會降低搜尋速度。
k 整數 定義要傳回的搜尋結果數目。 值 k 必須小於或等於 lSearch

搭配篩選使用 DiskANN 索引的範例

將向量新增至資料庫

若要搭配地理空間篩選使用向量搜尋,請新增包含向量內嵌和位置座標的檔。 您可以使用自己的模型、Azure OpenAI 內嵌或其他 API 來建立內嵌專案(例如 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
            }
        }
    ]
})

此命令會在中的exampleCollection欄位上contentVector建立 DiskANN 向量索引,以啟用相似度搜尋。 它也會新增:

  • 欄位上的 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)

在此範例中,向量相似度搜尋會根據指定的COS相似度計量傳回最接近的k向量,同時篩選結果以僅包含 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英里半徑和開放企業。 每個結果都包含相似度分數和元數據,示範適用於 MongoDB 的 Cosmos DB 中的 DiskANN 如何支援合併向量和地理空間查詢,以取得豐富、位置敏感的搜尋體驗。

取得向量索引定義

若要從集合中擷取向量索引定義,請使用 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, $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' }
}
]);

重要

在預覽期間,篩選的向量搜尋可能需要您調整向量索引參數,以達到更高的精確度。 例如,在使用 HNSW 時增加 mefConstructionefSearch,或使用 IVF 時,numListsnProbes 可能會導致更好的結果。 您應該先測試您的設定,再使用以確保結果令人滿意。

使用 LLM 協調流程工具

搭配使用向量資料庫與語意核心

使用語意核心以利協調從 Azure Cosmos DB for MongoDB vCore 和 LLM 中擷取的資訊。 在這裡深入了解。

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

搭配使用向量資料庫與 LangChain

使用 LangChain 來協調從 Azure Cosmos DB for MongoDB vCore 和 LLM 中擷取的資訊。 在這裡深入了解。

使用作為語意快取與 LangChain

使用適用於 MongoDB 的 LangChain 和 Azure Cosmos DB(虛擬核心)協調語意快取,使用先前錄製的 LLM 回應來節省 LLM API 成本,並減少回應的延遲。 在這裡深入了解

功能和限制

  • 支援的距離計量:L2 (歐幾里得)、內積和餘弦。
  • 支援的索引編製方法:IVFFLAT、HNSW 和 DiskANN (預覽)
  • 對大小上限為 2,000 個維度的向量進行編製索引。
  • 一個路徑只會有一個向量套用編製索引。
  • 一個向量路徑只能建立一個索引。

摘要

本指南示範如何建立向量索引、新增具有向量資料的文件、執行相似度搜尋,以及擷取索引定義。 透過使用我們的整合向量資料庫,您可以有效率地儲存、編製索引和查詢 Azure Cosmos DB for MongoDB vCore 虛擬核心中的高維度向量資料。 它可讓您透過向量內嵌來解除鎖定資料的完整潛力,並讓您能夠建置更精確、具效率且功能強大的應用程式。

後續步驟