🐷

Semantic KernelのFunctionを自動的に選択して回答を返すSemantic Kernel1.0.1正式版

2023/12/20に公開

始めに

https://zenn.dev/tomokusaba/articles/c6556ea666c1be

前回書いた記事はrc-3を前提にして書いていましたががっつり破壊的変更が入っています。
本日、正式版リリースされて破壊的変更については落ち着くと思われますのでもう一回同じ記事を書きます。

前提

Semantic Kernel 1.0.1
.NET 8

プラグインのクラス

これは、前回から変化なし。

using Microsoft.SemanticKernel;
using System.ComponentModel;
public class Plugin
{
    private readonly HttpClient _client = new();

    [KernelFunction, Description("今日の日付を返す")]
    public static string Today()
    {
        return DateTime.Now.ToString("yyyy/MM/dd");
    }

    [KernelFunction, Description("今日の曜日を返す")]
    public static string DayOfWeek()
    {
        return DateTime.Now.ToString("dddd");
    }

    [KernelFunction, Description("今の時間を返す")]
    public static string Now()
    {
        return DateTime.Now.ToString("HH:mm:ss");
    }

    [KernelFunction, Description("東京の天気を返す")]
    public async Task<string> Weather()
    {
        return (await _client.GetAsync("https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json")).Content.ReadAsStringAsync().Result;
    }
}

呼び出し側

こちらは名前空間が変更になったり、そもそも初手からKernelを作る方法が変更になっていたり、やはり引数にモデル名いらねとなっていたり大変多くの変更があります。

Kernel kernel = Kernel.CreateBuilder()
 .AddAzureOpenAIChatCompletion(
    "デプロイ名",
    "エンドポイント", 
    "APIキー").Build();
    
kernel.Plugins.AddFromType<Plugin>();

OpenAIPromptExecutionSettings? setting = new()
{
    ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
    // FunctionCallBehavior = FunctionCallBehavior.AutoInvokeKernelFunctions
};

while (true)
{
    Console.Write("User > ");
    string input = Console.ReadLine()!;
    if (input == "exit")
    {
        break;
    }
    else
    {
        var result = await kernel.InvokePromptAsync(input, new(setting));
        Console.WriteLine($"Assistant > {result}");
    }
}


実行結果

Semantic Kernel 1.0.1でも無事きちんと思ったような結果を得ることができました。

https://github.com/tomokusaba/SKAutoFunctions/tree/1.0.1

Discussion