セマンティック カーネル C# 統合を使い始める
項目一覧
注意
このチュートリアルでは、セマンティック カーネル C# ライブラリ を使用します。 。Python ライブラリを使用するチュートリアルについては、「 セマンティック カーネル Python 統合を使い始める 」を参照してください。
Atlas Vector Search を Microsoft セマンティック カーネル と統合できます AI アプリケーションを構築し、検索拡張生成(RAG)を実装します。このチュートリアルでは、セマンティック カーネルと Atlas Vector Search の使用を開始し、データに対してセマンティック検索を実行し、 RAG実装を構築する方法を説明します。 具体的には、次のアクションを実行します。
環境を設定します。
カスタム データを Atlas に保存します。
データに Atlas Vector Search インデックスを作成します。
データに対してセマンティック検索クエリを実行します。
Atlas Vector Search を使用してデータの質問に答え、RAG を実装します。
バックグラウンド
セマンティック カーネルは、アプリケーションでさまざまな AI サービスとプラグインを組み合わせることができるオープンソースの SDK です。 セマンティック カーネルは、 RAGを含むさまざまな AI ユースケースに使用できます。
Atlas Vector Searchをセマンティック カーネルと統合することで、 Atlasをベクトルデータベースとして使用し、 Atlas Vector Searchを使用してセマンティックで類似したドキュメントを検索してRAGを実装することができます。 RAGRGRAG Atlas Vector Searchの詳細については、「 による検索拡張生成( ) 」を してください。
前提条件
Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。
MongoDBバージョン6.0.11 、7.0.2 、またはそれ以降(RC を含む)を実行中しているクラスターを持つ Atlas アカウント。 IPアドレスが Atlas プロジェクトの アクセス リスト に含まれていることを確認します。詳細については、「 クラスターの作成 」を参照してください。
OpenAI API キー。 API リクエストに使用できるクレジットを持つ有料の OpenAI アカウントが必要です。 OpenAI アカウントの登録の詳細については、 OpenAI API ウェブサイト を参照してください。
.NET アプリケーションを実行するためのターミナルとコード エディター。
C#/.NET インストール済み。
環境を設定する
最初に、このチュートリアルの環境を設定する必要があります。 環境を設定するには、次の手順を実行します。
依存関係をインストールします。
このチュートリアルのパッケージをインストールするには、ターミナルで次のコマンドを実行します。
dotnet add package Microsoft.SemanticKernel dotnet add package Microsoft.SemanticKernel.Connectors.MongoDB --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI dotnet add package Microsoft.SemanticKernel.Memory dotnet add package Microsoft.SemanticKernel.Plugins.Memory --prerelease
環境変数を定義します。
ターミナルで次のコマンドを実行して、 AtlasクラスターのSRV接続文字列と OpenAI APIキーを環境に追加します。
export OPENAI_API_KEY="<Your OpenAI API Key>" export ATLAS_CONNECTION_STRING="<Your MongoDB Atlas SRV Connection String>"
注意
接続stringには、次の形式を使用する必要があります。
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Atlas でのカスタム データの保存
このセクションでは、 カーネル を初期化します は、アプリケーションのサービスとプラグインを管理するために使用されるメインのインターフェースです。カーネルを介して、AI サービスを構成し、Atlas をベクトルデータベース(メモリストアとも)としてインスタンス化し、カスタム データを Atlas クラスターにロードします。
次のコードをコピーして、アプリケーションのProgram.cs
ファイルに貼り付けます。
このコードは、次のアクションを実行します。
セマンティック カーネルとすべての必要なパッケージをインポートします。
環境から AtlasSRV 接続文字列 を取得して クラスターに接続します。
環境から OpenAI API キーを検索し、OpenAI の
text-embedding-ada-002
埋め込みモデルのインスタンスを作成します。カーネルを初期化し、次の AI サービスをカーネルに追加します。
OpenAI の
gpt-3.5-turbo
は、 「 データに関する質問への回答 」セクションの応答を生成するために使用されます。
Atlas をメモリ ストアとしてインスタンス化し、次のパラメータを指定します。
semantic_kernel_db.test
ドキュメントを保存するコレクションとして。vector_index
メモリ ストアをクエリするために使用するインデックスとして。
SemanticTextMemory
というクラスを初期化します。このクラスは、メモリにテキストを保存および取得するためのネイティブ メソッドのグループを提供します。PopulateMemoryAsync
メソッドを呼び出して、semantic_kernel_db.test
コレクションにサンプル ドキュメントを入力します。
// Import Packages using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Connectors.MongoDB; using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Plugins.Memory; class Program { static async Task Main(string[] args) { // Get connection string and OpenAI API Key var connectionString = Environment.GetEnvironmentVariable("ATLAS_CONNECTION_STRING"); if (connectionString == null) { Console.WriteLine("You must set your 'ATLAS_CONNECTION_STRING' environment variable."); Environment.Exit(0); } var openAIKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY"); if (openAIKey == null) { Console.WriteLine("You must set your 'OPENAPI_KEY' environment variable."); Environment.Exit(0); } // Create new OpenAI API Embedding Model var embeddingGenerator = new OpenAITextEmbeddingGenerationService("text-embedding-ada-002", openAIKey); // Initialize Kernel IKernelBuilder builder = Kernel.CreateBuilder(); // Add OpenAI Chat Completion to Kernel builder.AddOpenAIChatCompletion( modelId: "gpt-3.5-turbo", apiKey: openAIKey ); Kernel kernel = builder.Build(); // Instantiate Atlas as a memory store. MongoDBMemoryStore memoryStore = new(connectionString, "semantic_kernel_db", indexName: "vector_index"); SemanticTextMemory textMemory = new(memoryStore, embeddingGenerator); // Populate memory with sample data async Task PopulateMemoryAsync(Kernel kernel) { await textMemory.SaveInformationAsync(collection: "test", text: "I am a developer", id: "1"); await textMemory.SaveInformationAsync(collection: "test", text: "I started using MongoDB two years ago", id: "2"); await textMemory.SaveInformationAsync(collection: "test", text: "I'm using MongoDB Vector Search with Semantic Kernel to implement RAG", id: "3"); await textMemory.SaveInformationAsync(collection: "test", text: "I like coffee", id: "4"); } await PopulateMemoryAsync(kernel); } }
ファイルを保存し、次のコマンドを実行してデータを Atlas にロードします。
dotnet run
Tip
サンプル コードを実行した後、クラスター内のsemantic_kernel_db.test
コレクションに移動すると、Atlas UI でベクトル埋め込みを表示できます。
Atlas Vector Search インデックスの作成
ベクトル ストアでベクトル検索クエリを有効にするには、 semantic_kernel_db.test
コレクションに Atlas Vector Search インデックスを作成します。
必要なアクセス権
Atlas Vector Search インデックスを作成するには、Atlas プロジェクトに対するProject Data Access Admin
以上のアクセス権が必要です。
手順
Atlas Atlasで、プロジェクトの {0 ページにGoします。GoClusters
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
GoAtlas Searchクラスターの ページに します。
GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。
サイドバーで、 Services見出しの下のAtlas Searchをクリックします。
[ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。
Atlas Searchページが表示されます。
クラスターの [Browse Collections] ボタンをクリックします。
データベースを展開し、コレクションを選択します。
コレクションのSearch Indexesタブをクリックします。
Atlas Searchページが表示されます。
クラスタの名前をクリックします。
[Atlas Search] タブをクリックします。
Atlas Searchページが表示されます。
Atlas Vector Search インデックスを定義します。
[Create Search Index] をクリックします。
[ Atlas Vector Search ] で、[ JSON Editor ] を選択し、[ Nextをクリックします。
Database and Collectionセクションで、
semantic_kernel_db
データベースを検索し、test
コレクションを選択します。Index Nameフィールドに
vector_index
と入力します。デフォルトの定義を次のインデックス定義に置き換え、 Nextをクリックします。
このインデックス定義では、 vectorSearchタイプのインデックスで次のフィールドのインデックス作成を指定します。
embedding
ベクトル型としての フィールド。embedding
フィールドには、OpenAI のtext-embedding-ada-002
埋め込みモデルを使用して作成された埋め込みが含まれます。 インデックス定義では、1536
ベクトル次元を指定し、cosine
を使用して類似性を測定します。
1 { 2 "fields": [ 3 { 4 "type": "vector", 5 "path": "embedding", 6 "numDimensions": 1536, 7 "similarity": "cosine" 8 } 9 ] 10 }
ベクトル検索クエリの実行
Atlas がインデックスをビルドすると、データに対してベクトル検索クエリを実行できるようになります。
Program.cs
ファイルの末尾に、次のコードを追加して、string What is my job title?
の基本的なセマンティック検索を実行します。 最も関連性の高いドキュメントと、 0
と1
の間の関連性スコアが出力されます。
1 var results = textMemory.SearchAsync(collection: "test", query: "What is my job title?"); 2 3 await foreach (var result in results) { 4 Console.WriteLine($"Answer: {result?.Metadata.Text}, {result?.Relevance}"); 5 } 6 Console.WriteLine("Search completed.");
ファイルを保存し、次のコマンドを実行して、セマンティック検索の結果を確認します。
dotnet run
Answer: I am a developer, 0.8913083076477051 Search completed.
データに関する質問に答えます
RAGAtlas Vector Searchこのセクションでは、 とセマンティック カーネルを使用した の実装例を示します。Atlas Vector Searchを使用してセマンティックに類似したドキュメントを検索したので、Program.cs
の末尾に次のコード例を貼り付けて、それらのドキュメントに基づいて質問に回答するようLLMに要求します。
このコードは、次のアクションを実行します。
TextMemoryPlugin
クラスの関数をカーネルのtextMemory
にインポートします。TextMemoryPlugin
クラスのrecall
関数を使用して、カーネルのtextMemory
で stringWhen did I start using MongoDB?
のセマンティック検索を実行するプロンプト テンプレートを構築します。カーネルの
CreateFunctionFromPrompt
関数を使用して、チャット プロンプトからsettings
という名前の関数を作成します。カーネルの
InvokeAsync
関数を呼び出して、次のパラメータを使用してチャット モデルから応答を生成します。プロンプト テンプレートと
OpenAIPromptExecutionSettings
を構成するsettings
関数。プロンプト テンプレートの
{{$input}}
変数の値としての質問When did I start using MongoDB?
。semantic_kernel_db.test
情報を取得するコレクションとして。
質問と生成された応答を出力します。
1 kernel.ImportPluginFromObject(new TextMemoryPlugin(textMemory)); 2 const string promptTemplate = @" 3 Answer the following question based on the given context. 4 Question: {{$input}} 5 Context: {{recall 'When did I start using MongoDB?'}} 6 "; 7 8 // Create and Invoke function from the prompt template 9 var settings = kernel.CreateFunctionFromPrompt(promptTemplate, new OpenAIPromptExecutionSettings()); 10 var ragResults = await kernel.InvokeAsync(settings, new() 11 { 12 ["When did I start using MongoDB?", ] = 13 ["test" ] = 14 }); 15 16 // Print RAG Search Results 17 Console.WriteLine("Question: When did I start using MongoDB?"); 18 Console.WriteLine($"Answer: {ragResults.GetValue<string>()}");
ファイルを保存し、次のコマンドを実行して応答を生成します。
dotnet run
Question: When did I start using MongoDB? Answer: You started using MongoDB two years ago.
Tip
独自のデータを追加し、コードの次の部分を置き換えると、別の質問に対する応答を生成できます。
{{recall '<question>'}}
,[TextMemory.InputParam] = "<question>"
,Console.WriteLine("Question: <question>")
.
次のステップ
MongoDBは、次の開発者リソースも提供しています。