Docs Menu
Docs Home
/
Atlas
/ / /

セマンティック カーネル C# 統合を使い始める

注意

このチュートリアルでは、セマンティック カーネル C#ライブラリ を使用します。Pythonライブラリを使用するチュートリアルについては、セマンティック カーネルPython統合を使い始める を参照してください。

MongoDB ベクトル検索 をMicrosoftセマンティック カーネルと統合して、 AIアプリケーションを構築し、検索拡張生成 (RAG)(RAG) を実装できます。このチュートリアルでは、セマンティック カーネルでMongoDB ベクトル検索を使用してデータのセマンティック検索を実行し、RAG実装を構築する方法を説明します。具体的には、次のアクションを実行します。

  1. 環境を設定します。

  2. カスタム データをMongoDBに保存します。

  3. データにMongoDB ベクトル検索インデックスを作成します。

  4. データに対してセマンティック検索クエリを実行します。

  5. MongoDB ベクトル検索を使用してデータの質問に答え、RAG を実装します。

セマンティック カーネルは、アプリケーションでさまざまな AI サービスとプラグインを組み合わせることができるオープンソースの SDK です。 セマンティック カーネルは、 RAGを含むさまざまな AI ユースケースに使用できます。

MongoDB ベクトル検索 をセマンティック カーネルと統合することで、 MongoDB をベクトルデータベースとして使用し、 MongoDB ベクトル検索を使用してセマンティックで類似したドキュメントを検索して RG を実装することができます。RG の詳細については、 MongoDBによる検索拡張生成(RAG) を参照してください。

Atlas の サンプル データ セット からの映画データを含むコレクションを使用します。

  • 次のいずれかのMongoDBクラスター タイプ

    • MongoDB バージョン 6.0.11、7.0.2、またはそれ以降を実行している Atlas クラスター。IP アドレスが Atlas プロジェクトのアクセスリストに含まれていることを確認する。

    • Atlas CLI を使用して作成されたローカル Atlas 配置。詳細については、「Atlas 配置のローカル配置の作成」を参照してください。

    • Search とベクトル検索がインストールされたMongoDB Community または Enterprise クラスター。

  • OpenAI APIキー。APIリクエストに使用できるクレジットを持つ OpenAI アカウントが必要です。OpenAI アカウントの登録の詳細については、OpenAI APIウェブサイト を参照してください。

  • .NET アプリケーションを実行するためのターミナルとコード エディター。

  • C#/ .NETがインストールされました。

最初に、このチュートリアルの環境を設定する必要があります。 環境を設定するには、次の手順を実行します。

1

ターミナルで次のコマンドを実行して、 sk-mongodbという名前の新しいディレクトリを作成し、アプリケーションを初期化します。

mkdir sk-mongodb
cd sk-mongodb
dotnet new console
2

このチュートリアルのパッケージをインストールするには、ターミナルで次のコマンドを実行します。

dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Connectors.MongoDB --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
dotnet add package Microsoft.Extensions.AI
dotnet add package Microsoft.Extensions.AI.OpenAI
dotnet add package Microsoft.Extensions.AI.Abstractions
dotnet add package Microsoft.Extensions.VectorData.Abstractions
dotnet add package SemanticKernelPooling.Connectors.OpenAI
3

ターミナルで次のコマンドを実行して、 MongoDBクラスターの SRV 接続文字列 と OpenAI APIキー を環境に追加します。

export OPENAI_API_KEY="<Your OpenAI API Key>"
export MONGODB_URI="<Your MongoDB Atlas SRV Connection String>"

注意

<connection-string> を Atlas クラスターまたはローカル Atlas 配置の接続文字列に置き換えます。

接続stringには、次の形式を使用する必要があります。

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

詳しくは、ドライバーを使用してクラスターに接続する を参照してください。

接続stringには、次の形式を使用する必要があります。

mongodb://localhost:<port-number>/?directConnection=true

詳細については、「接続文字列 」を参照してください。

このセクションでは、アプリケーションのサービスとプラグインを管理するために使用されるメインのインターフェースであるカーネルを初期化します。カーネルを介して、 AIサービスを構成し、 MongoDB をベクトルデータベース(メモリストアとも)としてインスタンス化し、カスタム データをMongoDBクラスターにロードします。

次のコードをコピーして、アプリケーションのProgram.csファイルに貼り付けます。

このコードは、次のアクションを実行します。

  • セマンティック カーネルとすべての必要なパッケージをインポートします。

  • 環境から AtlasSRV 接続文字列 を取得して クラスターに接続します。

  • 環境から OpenAI API キーを検索し、OpenAI のtext-embedding-ada-002埋め込みモデルのインスタンスを作成します。

  • Atlas をメモリ ストアとしてインスタンス化し、次のパラメータを指定します。

    • semantic_kernel_db.records ドキュメントを保存するコレクションとして。

    • vector_index メモリ ストアをクエリするために使用するインデックスとして。

  • CreateCollectionFromListAsyncメソッドを呼び出して、 semantic_kernel_db.recordsコレクションにサンプル ドキュメントを入力します。

  • semantic_kernel_db.recordsコレクションを含む変数 recordCollection を定義します。

  • メモリにテキストを保存および検索するための 2 つのヘルパーメソッドを作成します。

    • CreateRecord: 新しい DataModelオブジェクトを作成するファクトリー。

    • CreateCollectionFromListAsync: string エントリを取得し、string の埋め込みを生成し、対応するレコードを作成し、それらのレコードを Atlas クラスターのコレクションにアップサートする方法。

  • MongoDBコレクションに保存されるドキュメントの構造を定義する DataModelクラスを作成します。

using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.MongoDB;
using Microsoft.SemanticKernel.Data;
using MongoDB.Bson;
using MongoDB.Driver;
using OpenAI;
#pragma warning disable SKEXP0001
static class Program
{
static async Task Main(string[] args)
{
// Get connection string and OpenAI API Key
var connectionString = Environment.GetEnvironmentVariable("MONGODB_URI");
if (connectionString == null)
{
Console.WriteLine("You must set your 'MONGODB_URI' 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 OpenAIClient(openAIKey)
.GetEmbeddingClient("text-embedding-ada-002")
.AsIEmbeddingGenerator();
// Instantiate MongoDB as a vector store
var mongoClient = new MongoClient(connectionString);
var options = new MongoVectorStoreOptions { EmbeddingGenerator = embeddingGenerator };
var vectorStore = new MongoVectorStore(mongoClient.GetDatabase("semantic_kernel_db"), options);
// Sample data
string[] lines =
[
"I am a developer",
"I started using MongoDB two years ago",
"I'm using MongoDB Vector Search with Semantic Kernel to implement RAG",
"I like coffee"
];
// Populate database with sample data
await CreateCollectionFromListAsync<string, DataModel>(vectorStore, "records", lines, embeddingGenerator, CreateRecord);
// Get the specific collection from the vector store
var recordCollection = vectorStore.GetCollection<string, DataModel>("records");
}
static DataModel CreateRecord(string text, ReadOnlyMemory<float> embedding)
=> new()
{
Key = ObjectId.GenerateNewId().ToString(),
Text = text,
Embedding = embedding
};
static async Task CreateCollectionFromListAsync<TKey, TRecord>(
this VectorStore vectorStore,
string collectionName,
string[] entries,
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator,
Func<string, ReadOnlyMemory<float>, TRecord> createRecord)
where TKey : notnull
where TRecord : class
{
// Get and create collection if it doesn't exist
var collection = vectorStore.GetCollection<TKey, TRecord>(collectionName);
await collection.EnsureCollectionExistsAsync().ConfigureAwait(false);
// Create records and generate embeddings for them
var embeddings = await embeddingGenerator.GenerateAsync(entries);
var records = entries.Zip(embeddings, (entry, embedding) => createRecord(entry, embedding.Vector));
// Add them to the database
await collection.UpsertAsync(records).ConfigureAwait(false);
}
internal sealed class DataModel
{
[VectorStoreKey]
[TextSearchResultName]
public required String Key { get; init; }
[VectorStoreData]
[TextSearchResultValue]
public required string Text { get; init; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> Embedding { get; init; }
}
}

ファイルを保存し、次のコマンドを実行してデータをMongoDBにロードします。

dotnet run

Tip

ベクトル埋め込みを作成したら、データに対してベクトル検索クエリを実行できます。

Program.csファイルの Programクラスの末尾に、文字列 What is my job title? の基本的なセマンティック検索を実行するための次のコードを追加します。 最も関連性の高いドキュメントが出力されます。

1// Create a text search instance using the InMemory vector store.
2var textSearch = new VectorStoreTextSearch<DataModel>(recordCollection, embeddingGenerator);
3
4// Search and return results as TextSearchResult items
5var query = "What is my job title?";
6KernelSearchResults<TextSearchResult> textResults = await textSearch.GetTextSearchResultsAsync(query, new() { Top = 2, Skip = 0 });
7await foreach (TextSearchResult result in textResults.Results)
8{
9 Console.WriteLine($"Answer: {result.Value}");
10}
11Console.WriteLine("Search completed.");

ファイルを保存し、次のコマンドを実行して、セマンティック検索の結果を確認します。

dotnet run
Answer: I am a developer
Search completed.

このセクションでは、 MongoDB ベクトル検索とセマンティック カーネルが実装RAM の例を示します。MongoDB ベクトル検索を使用してセマンティックに類似したドキュメントを検索したので、Program.csProgramクラスの最後に次のコード例を貼り付けて、それらのドキュメントに基づいて質問に答えるように LM にプロンプトを与えます。

このコードは、次のアクションを実行します。

  • OpenAI の gpt-4o をチャットモデルとして応答を生成するための新しいカーネルを作成します。

  • ベクトルストアを使用して新しいテキスト検索インスタンスを作成します。

  • チャット モデルに質問するための質問を定義し、変数 retrievedContext を初期化してベクトルストアのコンテキストを保持します。

  • recordCollectionWhen did I start using MongoDB? のセマンティック検索を実行し、最も関連性の高い検索結果を返します。

  • 検索されたコンテキストのみに基づいて質問に応答するようAIモデルに指示するプロンプト テンプレートを構築します。

  • カーネルのCreateFunctionFromPrompt関数を使用して、チャット プロンプトからragFunctionという名前の関数を作成します。

  • 質問とコンテキストを保持するための新しいオブジェクトを作成して、RG プロンプトの引数を準備します。

  • カーネルのInvokeAsync関数を呼び出して、次のパラメータを使用してチャット モデルから応答を生成します。

    • プロンプト テンプレートを構成する ragFunction

    • 質問とコンテキストを含む ragArguments

  • 質問と生成された応答を出力します。

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: "gpt-4o",
apiKey: openAIKey);
Kernel kernel = kernelBuilder.Build();
// Create a text search instance using the vector store collection.
var textSearch = new VectorStoreTextSearch<DataModel>(recordCollection, embeddingGenerator);
// --- Modified RAG Section ---
var userQuestion = "When did I start using MongoDB?";
string retrievedContext = "No relevant context found."; // Default
// 1. Perform search to get context
var searchResults = await textSearch.GetTextSearchResultsAsync(userQuestion, new() { Top = 1 }); // Get most relevant result
await foreach (var result in searchResults.Results)
{
if (result.Value != null)
{
retrievedContext = result.Value; // Use the text from the search result as context
break; // Take the most relevant result
}
}
// 2. Define a prompt template that uses the retrieved context
const string ragPromptTemplate = @"
Context:
{{$context}}
Question:
{{$question}}
Based *only* on the context provided, answer the question.
Answer:
";
// 3. Create a function from the RAG prompt template
var ragFunction = kernel.CreateFunctionFromPrompt(ragPromptTemplate);
// 4. Prepare arguments for the RAG prompt
var ragArguments = new KernelArguments
{
["question"] = userQuestion,
["context"] = retrievedContext
};
// 5. Invoke the RAG prompt
var ragResult = await kernel.InvokeAsync(ragFunction, ragArguments);
Console.WriteLine($"Question: {userQuestion}");
Console.WriteLine($"Retrieved Context: {retrievedContext}");
Console.WriteLine($"Answer: {ragResult.GetValue<string>()}");
// --- End of Modified RAG Section ---

ファイルを保存し、次のコマンドを実行して応答を生成します。

dotnet run
Question: When did I start using MongoDB?
Retrieved Context: I started using MongoDB two years ago
Answer: Two years ago.

Tip

独自のデータを追加し、コードの次の部分を置き換えると、別の質問に対する応答を生成できます。

  • var userQuestion = "When did I start using MongoDB?"

MongoDBは、次の開発者リソースも提供しています。

戻る

Python 統合

項目一覧