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