カーネルについて
カーネルはセマンティック カーネルの中心的なコンポーネントです。 最も簡単なカーネルは、AI アプリケーションの実行に必要なすべてのサービスとプラグインを管理する依存関係挿入コンテナーです。 すべてのサービスとプラグインをカーネルに提供すると、必要に応じて AI によってシームレスに使用されます。
カーネルが中央にある
カーネルには、ネイティブ コードと AI サービスの両方を実行するために必要なすべてのサービスとプラグインがあるため、セマンティック カーネル SDK 内のほぼすべてのコンポーネントによって使用され、エージェントが機能します。 つまり、セマンティック カーネルでプロンプトまたはコードを実行すると、必要なサービスとプラグインを取得するためにカーネルが常に使用できるようになります。
これは非常に強力です。これは、開発者が AI エージェントを構成し、最も重要に監視できる 1 つの場所を持っていることを意味するためです。 たとえば、カーネルからプロンプトを呼び出すとします。 これを行うと、カーネルは...
- プロンプトを実行するための最適な AI サービスを選択します。
- 指定されたプロンプト テンプレートを使用してプロンプトをビルドします。
- AI サービスにプロンプトを送信します。
- 応答を受信して解析します。
- 最後に、LLM からの応答をアプリケーションに返します。
このプロセス全体を通して、これらの各手順でトリガーされるイベントとミドルウェアを作成できます。 つまり、ログ記録などのアクションを実行したり、状態の更新をユーザーに提供したり、最も重要な責任を負う AI を提供したりできます。 すべて 1 か所から。
サービスとプラグインを使用してカーネルを構築する
カーネルをビルドする前に、まず、存在する 2 種類のコンポーネントについて理解しておく必要があります。
コンポーネント | 説明 | |
---|---|---|
1 | サービス | これらは、AI サービス (チャット完了など) と、アプリケーションの実行に必要な他のサービス (ログ記録や HTTP クライアントなど) の両方で構成されます。 これは、すべての言語での依存関係の取り込みをサポートできるように、.NET のサービス プロバイダー パターンの後にモデル化されました。 |
2 | プラグイン | これらは、作業を実行するために AI サービスとプロンプト テンプレートによって使用されるコンポーネントです。 たとえば、AI サービスでは、プラグインを使用してデータベースからデータを取得したり、外部 API を呼び出してアクションを実行したりできます。 |
カーネルの作成を開始するには、ファイルの先頭に必要なパッケージをインポートします。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;
次に、サービスとプラグインを追加できます。 Azure OpenAI チャットの完了、ロガー、時間プラグインを追加する方法の例を次に示します。
// Create a kernel with a logger and Azure OpenAI chat completion service
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(modelId, endpoint, apiKey);
builder.Services.AddLogging(c => c.AddDebug().SetMinimumLevel(LogLevel.Trace));
builder.Plugins.AddFromType<TimePlugin>();
Kernel kernel = builder.Build();
必要なパッケージをインポートします。
from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.core_plugins.time_plugin import TimePlugin
次に、カーネルを作成できます。
# Initialize the kernel
kernel = Kernel()
最後に、必要なサービスとプラグインを追加できます。 Azure OpenAI チャットの完了、ロガー、時間プラグインを追加する方法の例を次に示します。
# Add the Azure OpenAI chat completion service
kernel.add_service(AzureChatCompletion(model_id, endpoint, api_key))
# Add a plugin
kernel.add_plugin(
TimePlugin(),
plugin_name="TimePlugin",
)
カーネルをビルドする
カーネルは、 Kernel.builder()
を使用してビルドできます。 これにより、必要な AI サービスとプラグインを追加できます。
Kernel kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletionService)
.withPlugin(lightPlugin)
.build();
依存関係の挿入の使用
C# では、依存関係の挿入を使用してカーネルを作成できます。 これを行うには、 ServiceCollection
を作成し、サービスとプラグインを追加します。 依存関係挿入を使用してカーネルを作成する方法の例を次に示します。
ヒント
プラグイン コレクションは変更可能であるため、使用するたびに破棄されるように、カーネルを一時的なサービスとして作成することをお勧めします。 カーネルは非常に軽量であるため (サービスとプラグインのコンテナーに過ぎないため)、使用ごとに新しいカーネルを作成することはパフォーマンスの問題ではありません。
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
// Add the OpenAI chat completion service as a singleton
builder.Services.AddOpenAIChatCompletion(
modelId: "gpt-4",
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional; for OpenAI deployment
serviceId: "YOUR_SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
// Create singletons of your plugins
builder.Services.AddSingleton(() => new LightsPlugin());
builder.Services.AddSingleton(() => new SpeakerPlugin());
// Create the plugin collection (using the KernelPluginFactory to create plugins from objects)
builder.Services.AddSingleton<KernelPluginCollection>((serviceProvider) =>
[
KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<LightsPlugin>()),
KernelPluginFactory.CreateFromObject(serviceProvider.GetRequiredService<SpeakerPlugin>())
]
);
// Finally, create the Kernel service with the service provider and plugin collection
builder.Services.AddTransient((serviceProvider)=> {
KernelPluginCollection pluginCollection = serviceProvider.GetRequiredService<KernelPluginCollection>();
return new Kernel(serviceProvider, pluginCollection);
});
ヒント
C# で依存関係の挿入を使用する方法の詳細なサンプルについては、 concept サンプルを参照してください。
次のステップ
カーネルを理解したら、それに追加できるさまざまな AI サービスについて学習できます。