仮想コアベースの 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 を構成する必要があります。 この構成には、次の 3 つの主要な手順が含まれます。
- ベクトル フィールドをドキュメントに追加して、テキスト データの埋め込みを保存します。
- ドキュメントのテキスト データから埋め込みを生成し、それらをベクトル フィールドに保存します。
- これらのベクトル フィールドのベクトル インデックスを作成します。
各ステップを詳しく見ていきましょう。
ドキュメントにベクトル フィールドを追加する
まず、仮想コアベースの Azure Cosmos DB for MongoDB ドキュメントにベクトル フィールドを追加します。 これらのフィールドは高次元ベクトル データを保存しているため、非常に重要です。 ドキュメントのテキスト データから生成された埋め込みを使用して、これらのベクトル フィールドを設定します。 設定が完了すると、これらのベクトル フィールドからベクトル インデックスが作成されます。
埋め込みの生成
ベクトル インデックスを利用する前に、データベースのドキュメントに格納されている一部のテキスト フィールドの埋め込みを生成する必要があります。 ベクトル埋め込みはテキスト データの数値表現であり、ドキュメント間で AI システムによる効率的な類似性比較を実行できます。 たとえば、何らかのテキスト フィールドに対して生成された埋め込みベクトルは、次のようになります。
[0.123, 0.234, 0.345, ...]
Adventure Works Bike Shop の sales データベースに products コレクションがあるとします。 コレクション ドキュメントの category および description フィールドの埋め込みを生成できます。 Azure OpenAI は、フィールドのテキスト データからこれらの埋め込みを生成するのに役立ちます。 生成が完了すると、それらの埋め込みをドキュメントのベクトル フィールドに保存できます。
ベクトル フィールドの埋め込みを作成するには、多くの言語の中でも特に、Azure OpenAI の Python または Node.js SDK を使用できます。 たとえば、Azure OpenAI の API を使用して category フィールド内のテキストの埋め込みを生成するために、次のコード スニペットを使用できます。
パイソン
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 では、次の 2 種類のベクトル インデックスを使用できます。HNSW (Hierarchical Navigable Small World) と IVF (転置ファイル) インデックスです。 アプリケーションの要件に基づいてインデックスの種類を選択できます。
たとえば、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 データベースでベクトル検索を実行する準備ができました。
ベクトル検索を実行する
ベクトル インデックスを作成したら、ベクトル検索を実行して、ベクトルの類似性に基づいて同様の項目を取得できます。 検索プロセスには、次の 2 つの主要な手順が含まれます。
クエリを埋め込む: ベクトル フィールドの埋め込みを作成するのに使用したのと同じ埋め込み関数を使用して、自然言語の質問をベクトルに変換します。 たとえば、"どのような種類の自転車を販売していますか?" のような質問を入力した場合、ドキュメントの 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 に明確な指示を提供するように、構造化することです。 このモジュールの演習では、そのような方法の 1 つを確認します。
構造化されたプロンプトを定義したら、次のコード スニペットを使用して、Azure OpenAI を使用して応答を生成できます。
パイソン
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 で生成した応答の品質と関連性が大幅に向上します。