こんにちは、MLBお兄さんこと松村です。
2024年もあと僅かですね。
オフシーズンのニューヨーク・ヤンキースは補強に積極的で、2025年シーズンが既に楽しみになっています。
冬休みの自主学習として AI エージェントについて学ぶために、娘様に使ってもらうアプリを作っていますが、Azure Functions で Semantic Kernel を使用する手順が整理できたのでまとめます。
今回は .NET 9 Isolated の Azure Functions を例とします。
Azure Functions プロジェクトの作成
Visual Studio の場合、Azure の開発のワークロードをインストールします。
そのうえで Azure Functions プロジェクトを作成します。
Semantic Kernel パッケージのインストール
Azure Functions プロジェクトに Semantic Kernel パッケージをインストールします。
dotnet add package Microsoft.SemanticKernel --version 1.32.0
Chat completion の構成
例えば Azure OpenAI Service を使った Chat completion を使用する場合、Program.cs で以下の構成を行います。
using System.ClientModel; using Azure.AI.OpenAI; using Microsoft.Azure.Functions.Worker.Builder; using Microsoft.Extensions.Hosting; using Microsoft.SemanticKernel; var builder = FunctionsApplication.CreateBuilder(args); builder.ConfigureFunctionsWebApplication(); // Azure OpenAI Serviceの構成 builder.Services.AddAzureOpenAIChatCompletion( "(モデルのデプロイ名)", new AzureOpenAIClient( new Uri("(Azure OpenAI ServiceのエンドポイントURL)"), new ApiKeyCredential("(Azure OpenAI ServiceのAPIキー)")));
※実際はマネージド ID 接続などを使いましょう。
Semantic Kernel の構成
Azure Functions の関数で Chat completion を行う場合、IChatCompletionService
インターフェースを使用します。
そのため Program.cs で Semantic Kernel の構成を行います。
プラグインを使用する場合は AddTransient
で DI コンテナーに登録します。
builder.Services.AddKernel(); // プラグインを使用するとき builder.Services.AddTransient(sp => { KernelPluginCollection plugins = []; plugins.AddFromType<MyPlugin>(); return plugins; });
関数で Chat completion を行う
Azure Functions の関数で Semantic Kernel の Chat completion を行う場合、DI コンテナーから2つのオブジェクトを取り出します。
IChatCompletionService
インターフェースオブジェクトKernel
クラスオブジェクト
public class Function1 { private readonly ILogger<Function1> _logger; private readonly IChatCompletionService _chatService; private readonly Kernel _kernel; public Function1(ILogger<Function1> logger, IChatCompletionService chatService, Kernel kernel) { _logger = logger; _chatService = chatService; _kernel = kernel; } [Function("Function1")] public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req) { PromptExecutionSettings settings = new AzureOpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions }; var prompt = "Microsoft Azureとはなんですか?"; var completion = await _chatService.GetChatMessageContentAsync(prompt, settings, _kernel); return new OkObjectResult(completion); } }
プラグインも含めて DI コンテナーで管理できるのは便利ですね。
Semantic Kernel のドキュメントやサンプルではコンソールアプリーケーションを例としている場合が多いため、Azure Functions でも問題なく使用できるのが確認できてよかったです。
今回の検証に使用したサンプルコードは GitHub にまとめています。
サービス一覧 www.alterbooth.com cloudpointer.tech www.alterbooth.com