在以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 中,使用向量索引實作檢索增強生成
使用 Azure OpenAI 和以虛擬核心為基礎的 Azure Cosmos DB for MongoDB,您可以實作檢索增強生成 (RAG) 系統。 此系統結合以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 的向量搜尋功能與 Azure OpenAI 的進階 AI 模型,以根據搜尋結果來提供詳細的回應。 此方法顯著提高了 AI 利用您自己的資料成生的回應的品質和相關性。
設定以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 以進行向量搜尋
檢索增強生成 (RAG) 系統的第一個部分涉及詢問問題,並根據向量相似性在您的資料中搜尋相似的項目。 換言之,您的問題會轉換成數值向量,而系統會在您的資料中搜尋與此向量最相似的項目。
此程序首先需要設定以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 以支援向量搜尋。 此設定牽涉到三個主要步驟:
- 將向量場新增至您的文件,以儲存其文字資料內嵌。
- 從文件的文字資料產生內嵌,並將其儲存在向量場中。
- 為這些向量場建立向量索引。
讓我們更詳細地探索每個步驟。
將向量場新增至您的文件
首先,您要將向量場新增至以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 文件。 這些欄位至關重要,因為它們儲存高維向量資料。 您可以使用從文件的文字資料中產生的內嵌來填入這些向量場。 填入之後,就會從這些向量場建立向量索引。
產生內嵌
在利用向量索引之前,您需要為資料庫文件中儲存的某些文字欄位產生內嵌。 向量內嵌是文字資料的數值表示,可讓 AI 系統在文件之間執行有效率的相似性比較。 例如,為某些文字欄位所產生的內嵌向量可能會像下面這樣出現:
[0.123, 0.234, 0.345, ...]
假設您在 Adventure Works Bike Shopsales 資料庫中有 products 集合。 您可以為該集合文件的 category 和 description 欄位產生內嵌。 Azure OpenAI 可協助您從這些欄位的文字資料中產生這些內嵌。 產生之後,您可以將這些內嵌儲存在文件的向量場中。
若要建立向量場內嵌,您可以使用 Azure OpenAI 的 Python 或 Node.js SDK 以及其他語言。 例如,您可以使用下列程式碼片段,以使用 Azure OpenAI 的 API 來為 category 欄位中的文字產生內嵌:
Python
response = AzureOpenAIClient.embeddings.create(
input=categoryText,
model=embeddings_deployment)
Node.js
const response = await AzureOpenAIClient.getEmbeddings(embeddingsDeployment, categoryText);
這些命令會呼叫 Azure OpenAI 的 API,以使用指定的模型 (例如 GPT4) 來為 categoryText 變數產生數值內嵌。 產生文件的內嵌之後,您可以使用 MongoDB 集合的 insert 或 update 命令將其儲存在您的向量場中。
建立向量索引
在執行向量搜尋以取得 RAG 系統所需的結果之前,我們需要在這些向量場上建立向量索引。 這些索引可讓您執行有效率的向量搜尋,以根據向量相似性擷取類似的項目。 Azure Cosmos DB for MongoDB 中提供兩種類型的向量索引:HNSW (Hierarchical Navigable Small World) 和 IVF (Inverted File) 索引。 您可以根據您的應用程式需求來選擇索引類型。
例如,若要使用 HNSW 演算法來建立向量索引,您可以使用下列 MongoDB 命令:
db.command({
"createIndexes": "exampleCollection",
"indexes": [
{
"name": "VectorSearchIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-hnsw",
"m": 16,
"efConstruction": 64,
"similarity": "COS",
"dimensions": 3
}
}
]
});
這個 MongoDB 命令會從 contentVector 向量場,在 exampleCollection 集合上,建立名為 VectorSearchIndex 的向量索引。 您可以使用類似的命令來使用 IVF 演算法建立向量索引。 我們會在本課程模組的練習中瀏覽該範例。 建立向量索引之後,您現在可以使用它們在以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 資料庫上執行相似性搜尋。 以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 資料庫現在已準備好執行向量搜尋。
執行向量搜尋
建立向量索引之後,您可以執行向量搜尋以根據向量相似性來擷取類似的項目。 搜尋程序包含兩個主要步驟:
內嵌查詢:使用您用來建立向量場內嵌的相同內嵌函式,將一般語言問題轉換成向量。 例如,如果您輸入一個像「您銷售哪種類型的自行車?」的問題,您會使用您用來建立文件的 category 或 description 內嵌的相同 Azure OpenAI API 函式來產生問題的內嵌。
搜尋:使用產生的內嵌 (也稱為查詢向量) 來搜尋資料庫中的類似項目。 搜尋演算法會將查詢向量與資料庫中所儲存的向量資料進行比較,以找到最相似的項目。 若要執行向量搜尋,您可以使用下列的 aggregate MongoDB 命令:
db.exampleCollection.aggregate([
{
"$search": {
"cosmosSearch": {
"vector": "queryVector",
"path": "contentVector",
"k": 2,
"efSearch": 40
},
}
}
]);
向量搜尋結果會根據查詢向量傳回最相似的項目。 在此命令中,contentVector 會是您的向量場名稱。 這些結果只是具有最高相似性分數的文件陣列。 不過,您可以透過整合 Azure OpenAI 以根據搜尋結果產生詳細的回應來進一步增強使用者體驗。 此整合是我們的檢索增強生成 (RAG) 系統的最後一個步驟。
整合 Azure OpenAI
雖然向量搜尋結果提供了相關項目,但您可以透過整合 Azure OpenAI 以根據向量搜尋結果產生詳細的回應來進一步增強使用者體驗。 Azure OpenAI 的進階 AI 模型可以提供內容感知回應,以補充向量搜尋結果。
那麼,我們需要怎麼做才能整合 Azure OpenAI 與向量搜尋結果? 首先,讓我們建立一個結構化提示,Azure OpenAI 可使用該提示根據向量搜尋結果來產生詳細的回應。 結構化提示會結合下列元素:
- 您在向量搜尋中使用的原始查詢 - 例如,「您銷售的自行車類型為何?」
-
使用者定義的系統提示 - 系統提示會提供一個清楚的工作描述,詳細說明 AI 預期要處理的工作,例如,它可以將其角色定義為 Adventure Works Bike Shop 的助手。 它概述了 AI 應如何回答問題,確保所有答案都是相關的並以易於理解的格式傳回。 系統提示可能具有下列元件:
- 作業描述:AI 應該是誰,例如,「作為 Adventure Works Bike Shop 的助手,你負責回答客戶有關我們銷售的自行車的查詢問題。」
- 格式化 AI 回應:提示會準確地告訴 AI 如何格式化其答案,例如使用具有特定間距的清單。 這種格式使資訊清晰一致,讓使用者能輕易了解。
- 限制 AI 互動回應:提示可能包含 AI 應該能夠討論的主題清單,例如自行車類型、價格和可用性。 此清單可確保 AI 的回應連接到實際情況中並確保它保持在話題上,並提供相關的資訊。
- 處理不確定性:提示可讓 AI 知道如何處理它可能沒有足夠資訊來提供答案的情況。 AI 可能會提出「我不知道」之類的建議片語,或鼓勵使用者進行自己的研究。 本節可協助 AI 更妥善地管理不確定性的情況。
- 其他指示:提示可能包含其他指示,例如如何將其他資源提供給使用者,或如何處理不適當的問題。 因此,您想要 AI 執行的任何其他動作,您都應該包含在系統提示中。 這些指示可協助 AI 為使用者提供一致且實用的體驗。
- 向量搜尋結果:向量搜尋結果會根據查詢向量提供您的資料中最相似的項目。 由於傳回的向量搜尋結果是整個文件本身,因此您應該選擇最相關的欄位來包含在提示中,像是也許是自行車的 category 或 description。 AI 可以使用此資訊,根據向量搜尋結果來產生詳細的回應。 例如,如果向量搜尋結果傳回 Mountain Bikes 和 Road Bikes,則 AI 可以提供這些類型自行車的相關詳細資訊。
有許多程序設計方式可以產生提示。 關鍵是要以一種方式來建構它,以為 AI 提供如何根據向量搜尋結果產生回應的清楚指示。 我們會在本課程模組的練習中瀏覽一個這類的方法。
定義結構化提示之後,您可以使用下列程式碼片段來使用 Azure OpenAI 產生回應:
Python
response = AzureOpenAICompletionClient.chat.completions.create(
model=completion_deployment, messages=structuredPrompt)
Node.js
const response = await AzureOpenAICompletionClient.getChatCompletions(completionDeployment, structuredPrompt);
這些命令會呼叫 Azure OpenAI 的 API,以根據結構化提示來產生詳細的回應 (使用指定的模型來提供內容感知資訊,以補充向量搜尋結果)。
此設定結合了以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 的客戶資料與 Azure OpenAI 的 AI 模型,以形成您的檢索增強生成 (RAG) 系統。 藉由整合向量搜尋,它可讓 AI 從以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 中提取精確的相關資訊,以增強回應能力。 此方法顯著提高了 AI 利用您自己的資料成生的回應的品質和相關性。