.NET AI ベクター検索アプリを構築する
このクイック スタートでは、ベクター ストアでセマンティック検索を実行して、ユーザーのクエリに関連する結果を検索する .NET コンソール アプリを作成します。 ユーザー プロンプトの埋め込みを生成し、それらの埋め込みを使用してベクター データ ストアにクエリを実行する方法について説明します。 ベクター検索機能は、取得拡張生成 (RAG) シナリオの重要なコンポーネントでもあります。 このアプリでは、microsoft.Extensions.VectorData.Abstractions ライブラリ Microsoft.Extensions.AI と を使用するため、特定の SDK ではなく AI 抽象化を使用してコードを記述できます。 AI 抽象化は、最小限のアプリ変更で基になる AI モデルを変更できる疎結合コードを作成するのに役立ちます。
前提条件
- .NET 8.0 SDK 以降 - .NET 8.0 SDKをインストールします。
- このサンプルを実行できるようにするための OpenAI の API キー。
前提条件
- .NET 8.0 SDK 以降 - .NET 8 SDKをインストールします。
- Azure サブスクリプション。無料で作成できます。
- Azure OpenAI サービスにアクセスします。
- Azure Developer CLI (省略可能) - Azure Developer CLIをインストールまたは更新します。
サンプル リポジトリをクローンする
前のセクションの手順を使用して独自のアプリを作成することも、すべてのクイックスタートの完成したサンプル アプリを含む GitHub リポジトリを複製することもできます。 Azure OpenAI を使用する予定の場合、サンプル リポジトリは、Azure OpenAI リソースをプロビジョニングできる Azure Developer CLI テンプレートとしても構成されます。
git clone https://github.com/dotnet/ai-samples.git
ベクター ストアを使用してデータを操作する
ベクター ストアまたはベクター データベースは、セマンティック検索、検索拡張生成 (RAG) などのタスクや、生成型 AI 応答を接地する必要があるその他のシナリオに不可欠です。 リレーショナル データベースとドキュメント データベースは構造化データと半構造化データ用に最適化されていますが、ベクター データベースは、埋め込みベクターとして表されるデータを効率的に格納、インデックス付け、管理できるように構築されています。 その結果、ベクター データベースで使用されるインデックス作成アルゴリズムと検索アルゴリズムは、アプリケーションの下流で使用できるデータを効率的に取得するように最適化されます。
Microsoft.Extensions.VectorData.Abstractions を調べる
Microsoft.Extensions.VectorData.Abstractions は、セマンティック カーネルおよびより広範な .NET エコシステムと連携して開発された .NET ライブラリであり、ベクター ストアと対話するための抽象化の統一された層を提供します。
Microsoft.Extensions.VectorData.Abstractions
の抽象化により、ライブラリの作成者と開発者に次の機能が提供されます。
- ベクター ストアに対して Create-Read-Update-Delete (CRUD) 操作を実行する
- ベクター ストアでベクター検索とテキスト検索を使用する
メモ
Microsoft.Extensions.VectorData.Abstractions ライブラリは現在プレビュー段階です。
アプリを作成する
次の手順を実行して、以下を実行できる .NET コンソール アプリを作成します。
- データセットの埋め込みを生成してベクトルストアを作成し、格納する。
- ユーザー プロンプトの埋め込みを生成する
- ユーザー プロンプト埋め込みを使用してベクター ストアにクエリを実行する
- ベクター検索の関連する結果を表示します。
コンピューター上の空のディレクトリで、
dotnet new
コマンドを使用して新しいコンソール アプリを作成します。dotnet new console -o VectorDataAI
ディレクトリをアプリ フォルダーに変更します。
cd VectorDataAI
必要なパッケージをインストールします。
dotnet add package Azure.Identity dotnet add package Azure.AI.OpenAI dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
次の一覧では、
VectorDataAI
アプリで各パッケージが使用される内容について説明します。Azure.Identity
では、DefaultAzureCredential
などのクラスを使用して、Azure SDK 全体でMicrosoft Entra ID
トークン認証のサポートを提供します。Azure.AI.OpenAI
は、Azure OpenAI サービスで OpenAI の .NET ライブラリを使用するための公式パッケージです。Microsoft.SemanticKernel.Connectors.InMemory
は、クエリ可能なベクター データ レコードを保持するメモリ内ベクター ストア クラスを提供します。Microsoft.Extensions.VectorData.Abstractions
、ベクター ストアに対する Create-Read-Update-Delete (CRUD) および検索操作を有効にします。- Microsoft.Extensions.Configuration では、キーと値のペアベースの構成の実装が提供されます。
Microsoft.Extensions.Configuration.UserSecrets
は、Microsoft.Extensions.Configuration
のユーザー シークレット構成プロバイダーの実装です。
dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
次の一覧では、
VectorDataAI
アプリで各パッケージが使用される内容について説明します。Microsoft.Extensions.AI.OpenAI
では、OpenAI と互換性のあるモデルまたはエンドポイントの AI 抽象化が提供されます。 このライブラリには、依存関係として OpenAI サービス API の公式OpenAI
ライブラリも含まれています。Microsoft.SemanticKernel.Connectors.InMemory
は、クエリ可能なベクター データ レコードを保持するメモリ内ベクター ストア クラスを提供します。Microsoft.Extensions.VectorData.Abstractions
、ベクター ストアに対する Create-Read-Update-Delete (CRUD) および検索操作を有効にします。- Microsoft.Extensions.Configuration では、キーと値のペアベースの構成の実装が提供されます。
Microsoft.Extensions.Configuration.UserSecrets
は、Microsoft.Extensions.Configuration
のユーザー シークレット構成プロバイダーの実装です。
Visual Studio Code (または任意のエディター) でアプリを開きます。
code .
AI サービスを作成する
- Azure Developer CLI
- Azure CLI
- Azure Portal
サンプルの GitHub リポジトリは、Azure Developer CLI (azd
) テンプレートとして構成されています。azd
がこれを使用して、Azure OpenAI サービスとモデルをプロビジョニングできます。
ターミナルまたはコマンド プロンプトから、サンプル リポジトリの
src\quickstarts\azure-openai
ディレクトリに移動します。azd up
コマンドを実行して、Azure OpenAI リソースをプロビジョニングします。 Azure OpenAI サービスの作成とモデルのデプロイには数分かかる場合があります。azd up
azd
また、Azure OpenAI エンドポイントやモデル名など、サンプル アプリに必要なユーザー シークレットも構成します。
Configure the app
ターミナルまたはコマンド プロンプトから .NET プロジェクトのルートに移動します。
次のコマンドを実行して、OpenAI API キーをサンプル アプリのシークレットとして構成します。
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key> dotnet user-secrets set ModelName <your-openai-model-name>
メモ
ModelName
値には、text-embedding-3-small
やtext-embedding-3-large
などの OpenAI テキスト埋め込みモデルを指定して、後のセクションでベクター検索用の埋め込みを生成する必要があります。
アプリ コードを追加する
次のプロパティを使用 CloudService という名前の新しいクラスをプロジェクトに追加します。
using Microsoft.Extensions.VectorData; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace VectorDataAI { internal class CloudService { [VectorStoreRecordKey] public int Key { get; set; } [VectorStoreRecordData] public string Name { get; set; } [VectorStoreRecordData] public string Description { get; set; } [VectorStoreRecordVector(384, DistanceFunction.CosineSimilarity)] public ReadOnlyMemory<float> Vector { get; set; } } }
上のコードでは以下の操作が行われます。
Microsoft.Extensions.VectorData
によって提供される C# 属性は、ベクター ストアで使用する場合の各プロパティの処理方法に影響します。- Vector プロパティには、ベクター検索の 名 と Description のセマンティック意味を表す、生成された埋め込みを格納します。
Program.cs ファイルに次のコードを追加して、クラウド サービスのコレクションを記述するデータ セットを作成します。
var cloudServices = new List<CloudService>() { new CloudService { Key=0, Name="Azure App Service", Description="Host .NET, Java, Node.js, and Python web applications and APIs in a fully managed Azure service. You only need to deploy your code to Azure. Azure takes care of all the infrastructure management like high availability, load balancing, and autoscaling." }, new CloudService { Key=1, Name="Azure Service Bus", Description="A fully managed enterprise message broker supporting both point to point and publish-subscribe integrations. It's ideal for building decoupled applications, queue-based load leveling, or facilitating communication between microservices." }, new CloudService { Key=2, Name="Azure Blob Storage", Description="Azure Blob Storage allows your applications to store and retrieve files in the cloud. Azure Storage is highly scalable to store massive amounts of data and data is stored redundantly to ensure high availability." }, new CloudService { Key=3, Name="Microsoft Entra ID", Description="Manage user identities and control access to your apps, data, and resources.." }, new CloudService { Key=4, Name="Azure Key Vault", Description="Store and access application secrets like connection strings and API keys in an encrypted vault with restricted access to make sure your secrets and your application aren't compromised." }, new CloudService { Key=5, Name="Azure AI Search", Description="Information retrieval at scale for traditional and conversational search applications, with security and options for AI enrichment and vectorization." }
埋め込み AI モデルに要求を送信する
IEmbeddingGenerator
実装を作成して構成します。// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string endpoint = config["AZURE_OPENAI_ENDPOINT"]; string model = config["AZURE_OPENAI_GPT_NAME"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new AzureOpenAIClient( new Uri(endpoint), new DefaultAzureCredential())
メモ
DefaultAzureCredential は、ローカル ツールから認証資格情報を検索します。
azd
テンプレートを使用して Azure OpenAI リソースをプロビジョニングしていない場合は、Visual Studio または Azure CLI へのサインインに使用したアカウントにAzure AI Developer
ロールを割り当てる必要があります。 詳細については、「.NET を使用して Azure AI サービスに対する認証をする」を参照してください。// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string model = config["ModelName"]; string key = config["OpenAIKey"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new OpenAIClient(new ApiKeyCredential(key)) .AsEmbeddingGenerator(modelId: model);
ベクター ストアを作成し、クラウド サービス データを設定します。
IEmbeddingGenerator
実装を使用して、クラウド サービス データ内の各レコードに埋め込みベクターを作成して割り当てます。// Create and populate the vector store var vectorStore = new InMemoryVectorStore(); var cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices"); await cloudServicesStore.CreateCollectionIfNotExistsAsync(); foreach (var service in cloudServices) { service.Vector = await generator.GenerateEmbeddingVectorAsync(service.Description); await cloudServicesStore.UpsertAsync(service); }
埋め込みとは、各データ レコードのセマンティック意味の数値表現であり、ベクター検索機能と互換性があります。
検索クエリの埋め込みを作成し、それを使用してベクター ストアでベクター検索を実行します。
// Convert a search query to a vector and search the vector store var query = "Which Azure service should I use to store my Word documents?"; var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query); var results = await cloudServicesStore.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions() { Top = 1, VectorPropertyName = "Vector" }); await foreach (var result in results.Results) { Console.WriteLine($"Name: {result.Record.Name}"); Console.WriteLine($"Description: {result.Record.Description}"); Console.WriteLine($"Vector match score: {result.Score}"); Console.WriteLine(); }
dotnet run
コマンドを使用してアプリを実行します。dotnet run
このアプリは、元のクエリに最も関連するクラウド サービスであるベクター検索の上位の結果を出力します。 クエリを変更して、さまざまな検索シナリオを試すことができます。
リソースをクリーンアップする
サンプル アプリケーションやリソースが不要になったら、対応するデプロイとすべてのリソースを削除します。
azd down
次のステップ
- クイック スタート - ローカル AI モデル とのチャット
- .NET で AI を使用して画像を生成する
.NET