Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

Azure Functions (.NET 9 Isolated) でSemantic Kernelを使用する

こんにちは、MLBお兄さんこと松村です。
2024年もあと僅かですね。
オフシーズンのニューヨーク・ヤンキースは補強に積極的で、2025年シーズンが既に楽しみになっています。


冬休みの自主学習として AI エージェントについて学ぶために、娘様に使ってもらうアプリを作っていますが、Azure Functions で Semantic Kernel を使用する手順が整理できたのでまとめます。
今回は .NET 9 Isolated の Azure Functions を例とします。

Azure Functions プロジェクトの作成

Visual Studio の場合、Azure の開発のワークロードをインストールします。
そのうえで Azure Functions プロジェクトを作成します。

learn.microsoft.com

Semantic Kernel パッケージのインストール

Azure Functions プロジェクトに Semantic Kernel パッケージをインストールします。

dotnet add package Microsoft.SemanticKernel --version 1.32.0

www.nuget.org

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 接続などを使いましょう。

learn.microsoft.com

Semantic Kernel の構成

Azure Functions の関数で Chat completion を行う場合、IChatCompletionService インターフェースを使用します。

learn.microsoft.com

そのため Program.cs で Semantic Kernel の構成を行います。
プラグインを使用する場合は AddTransient で DI コンテナーに登録します。

builder.Services.AddKernel();

// プラグインを使用するとき
builder.Services.AddTransient(sp =>
{
    KernelPluginCollection plugins = [];
    plugins.AddFromType<MyPlugin>();
    return plugins;
});

learn.microsoft.com

関数で Chat completion を行う

Azure Functions の関数で Semantic Kernel の Chat completion を行う場合、DI コンテナーから2つのオブジェクトを取り出します。

  1. IChatCompletionService インターフェースオブジェクト
  2. 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);
    }
}

learn.microsoft.com


プラグインも含めて DI コンテナーで管理できるのは便利ですね。
Semantic Kernel のドキュメントやサンプルではコンソールアプリーケーションを例としている場合が多いため、Azure Functions でも問題なく使用できるのが確認できてよかったです。

今回の検証に使用したサンプルコードは GitHub にまとめています。

github.com


サービス一覧 www.alterbooth.com cloudpointer.tech www.alterbooth.com