適用於 JavaScript 中 NoSQL 的 Azure Cosmos DB 中的索引和查詢向量
適用於:NoSQL
適用於 NoSQL 的 Azure Cosmos DB 向量搜尋功能處於預覽狀態。 使用這項功能之前,您必須先註冊預覽版。 本文涵蓋下列步驟:
註冊 Azure Cosmos DB for NoSQL 中的向量搜尋預覽
設定 Azure Cosmos DB 容器以進行向量搜尋
製作向量內嵌原則
將向量索引新增至容器索引編製原則
使用向量索引和向量內嵌原則建立容器
對儲存的數據執行向量搜尋
本指南會逐步解說建立向量資料、編製資料索引、然後查詢容器中資料的流程。
必要條件
- 現有的 Azure Cosmos DB for NoSQL 帳戶。
- 如果您沒有 Azure 訂用帳戶,可以免費試用 Azure Cosmos DB for NoSQL。
- 如果您有現有的 Azure 訂用帳戶,請建立新的 Azure Cosmos DB for NoSQL 帳戶。
- 最新版的 Azure Cosmos DB JavaScript SDK(4.1.0 版或更新版本)
註冊預覽
Azure Cosmos DB for NoSQL 的向量搜尋需要預覽功能註冊。 請遵循下列步驟註冊:
瀏覽至您的 Azure Cosmos DB for NoSQL 資源頁面。
選取 [設定] 功能表項目下的 [功能] 窗格。
選取 [適用於 NoSQL 的 Azure Cosmos DB 中的向量搜尋]。
閱讀功能的描述,以確認您要註冊預覽。
選取 [啟用] 以註冊預覽。
注意
註冊要求將會自動獲得核准,不過可能需要幾分鐘的時間才會生效。
瞭解向量搜尋所涉及的步驟
下列步驟假設您知道如何設定 Cosmos DB NoSQL 帳戶和建立資料庫。 向量搜尋功能目前僅支援新容器,而不是現有的容器。 您必須建立新的容器,然後在建立時指定容器層級向量內嵌原則和向量索引原則。
讓我們以建立以網際網路為基礎的書店資料庫為例,您要儲存每本書的標題、作者、ISBN 和說明。 我們也定義了兩個屬性來包含向量內嵌。 第一個是 “contentVector” 屬性,其中包含 從書籍的文字內容產生的文字 內嵌 (例如,在建立內嵌之前串連 “title” “author” “isbn” 和 “description” 屬性)。 第二個是“coverImageVector”,這是從 書籍封面的圖像產生的。
- 針對您要執行向量搜尋的欄位建立和儲存向量內嵌。
- 指定向量內嵌原則中的向量內嵌路徑。
- 在容器的索引編製原則中包含任何所需的向量索引。
針對本文的後續章節,我們會針對儲存在容器中的專案考慮此結構:
{
"title": "book-title",
"author": "book-author",
"isbn": "book-isbn",
"description": "book-description",
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1],
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78]
}
為您的容器建立向量內嵌原則
接下來,您必須定義容器向量原則。 此原則提供的資訊可用來告知 Azure Cosmos DB 查詢引擎如何處理 VectorDistance 系統函數中的向量屬性。 此原則也會告知向量索引編製原則 (若您選擇指定一個) 所需的資訊。
自主向量原則包含下列資訊:
描述 | |
---|---|
path |
包含向量的屬性路徑 |
datatype |
向量項目的型別(預設 Float32 ) |
dimensions |
路徑中每個向量的長度 (預設值 1536 ) |
distanceFunction |
用來計算距離/相似度的計量 (預設值 Cosine ) |
在這個含有書籍詳細資料的範例中,向量原則看起來會類似範例 JSON:
const vectorEmbeddingPolicy: VectorEmbeddingPolicy = {
vectorEmbeddings: [
{
path: "/coverImageVector",
dataType: "float32",
dimensions: 8,
distanceFunction: "dotproduct",
},
{
path: "contentVector",
dataType: "float32",
dimensions: 10,
distanceFunction: "cosine",
},
],
};
在編製索引原則中建立向量索引
一旦決定了向量內嵌路徑,就必須將向量索引新增至索引編製原則。 您必須在容器建立期間套用向量原則,且稍後無法加以修改。 在此範例中,編製索引原則類似下例:
const indexingPolicy: IndexingPolicy = {
vectorIndexes: [
{ path: "/coverImageVector", type: "quantizedFlat" },
{ path: "/contentVector", type: "diskANN" },
],
inlcludedPaths: [
{
path: "/*",
},
],
excludedPaths: [
{
path: "/coverImageVector/*",
},
{
path: "/contentVector/*",
},
]
};
現在請照常建立容器。
const containerName = "vector embedding container";
// create container
const { resource: containerdef } = await database.containers.createIfNotExists({
id: containerName,
vectorEmbeddingPolicy: vectorEmbeddingPolicy,
indexingPolicy: indexingPolicy,
});
重要
目前,Azure Cosmos DB for NoSQL 中的向量搜尋僅在新容器上受到支援。 您必須在建立容器期間同時設定容器向量原則和任何向量索引編製原則,因為稍後無法將其修改。 這兩個原則將可在未來的預覽功能改善中進行修改。
執行向量相似度搜尋查詢
一旦您使用所需的向量原則建立容器,並將向量資料插入容器中,您就可以在查詢中使用向量距離系統函數來執行向量搜尋。 假設您想要查看描述來搜尋有關食品食譜的書籍。 您必須先取得查詢文字的內嵌。 在此情況下,您可能會想要產生查詢文字的內嵌 – 「食物食譜」。一旦您有搜尋查詢的內嵌,就可以在向量搜尋查詢的 VectorDistance 函式中使用它,並取得與您查詢類似的所有專案,如下所示:
SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])
此查詢會擷取書籍標題,以及與您查詢相關的相似度分數。 以下是 JavaScript 中的範例:
const { resources } = await container.items
.query({
query: "SELECT c.title, VectorDistance(c.contentVector, @embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector, @embedding)"
parameters: [{ name: "@embedding", value: [1,2,3,4,5,6,7,8,9,10] }]
})
.fetchAll();
for (const item of resources) {
console.log(`${itme.title}, ${item.SimilarityScore} is a capitol `);
}