Microsoft.Extensions.AI と Semantic Kernel を連携させよう!
Semantic Kernel のコードを眺めていたら Microsoft.Extensions.AI の連携をするためっぽいコードがあったので試してみました。
Semantic Kernel と Microsoft.Extensions.AI の連携機能は Microsoft.Extensions.AI の IChatClient
インターフェースを Semantic Kernel の IChatCompletionService
インターフェースと相互に変換しあうことで実現されています。具体的には IChatClient
の拡張メソッドとして AsChatCompletionService
が定義されており、これを使うことで IChatClient
を IChatCompletionService
に変換することができます。
逆方向の変換は IChatCompletionService
の拡張メソッドとして AsChatClient
が定義されており、これを使うことで IChatCompletionService
を IChatClient
に変換することができます。
Semantic Kernel の Kernel
を使うようにするためには Kernel
オブジェクトに IChatCompletionService
を登録する必要があります。Azure OpenAI Service などは専用の拡張メソッドがあるのですが、今の所 Microsoft.Extensions.AI 専用の登録メソッドはないため IChatClient
から IChatCompletionService
に変換して、Kernel
に登録する必要があります。
コードとしては以下のようになります。
コンソールアプリを作成して、以下のパッケージを追加します。
- Microsoft.Extensions.AI.OpenAI
- Microsoft.Extensions.AI の OpenAI 用の実装
- Microsoft.SemanticKernel
- Semantic Kernel
- Azure.Identity
- Azure の認証用ライブラリ
そして Program.cs
に以下のコードを追加します。
#pragma warning disable SKEXP0001 // 実験的機能なので警告を無効化
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.SemanticKernel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.Extensions.AI;
// Microsoft.Extensions.AI に繋ぐための IChatClient を作る
var client = new AzureOpenAIClient(
new Uri("https://<<リソース名>>.openai.azure.com/"),
new AzureCliCredential());
var chatClient = client.AsChatClient("<<モデルデプロイ名>>");
// AsChatCompletionService に IChatCompletionService に変換してサービスに登録
var builder = Kernel.CreateBuilder();
builder.Services.AddSingleton(chatClient.AsChatCompletionService());
var kernel = builder.Build();
// AI を呼んでみる
var response = await kernel.InvokePromptAsync("ねこっぽく挨拶して!");
Console.WriteLine(response.GetValue<string>());
実行すると以下のような結果になりました。ちゃんと動いていますね。
にゃんにゃん!こんにちはにゃ?!元気にゃ一日を過ごしてね?!??
まとめ
ということで Semantic Kernel と Microsoft.Extensions.AI の連携機能のコードがあったので試してみました。
Microsoft.Extensions.AI が正式にリリースされたらおそらく Semantic Kernel 側も実験的機能が取れると思います。最終的には各 AI のベンダーが Microsoft.Extensions.AI の実装を作ってくれればシームレスに Semantic Kernel で使うことが出来るようになると思います。
楽しみ!!
Discussion