🐡

gpt-4o-miniをSemantic Kernelから試してみた

2024/08/01に公開

gpt-4o-miniの特徴

そこそこ賢い!
速い!
安い!

なのでアプリケーションレベルで大量にAPIコールするような使い方で使いやすい

試してみたコード

Global AI Bootcampでデモで使ったコードを基本的に流用します。
当時は、スエーデンリージョンのgpt-4でデモをしていて答えが返ってくるまでに会話する程度の時間がかかりました。体感1分弱はかかっていたと思います。

Program.cs
using Azure.Identity;
using ConsoleApp16;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;

IConfigurationRoot config = new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .AddUserSecrets<Program>()
    .Build();

string deploymentName = config["OpenAI:DeploymentName"] ?? throw new InvalidOperationException("OpenAI:DeploymentName is not set.");
string endpoint = config["OpenAI:Endpoint"] ?? throw new InvalidOperationException("OpenAI:BaseUrl is not set.");

var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
   deploymentName,
   endpoint,
   new DefaultAzureCredential()).Build();
builder.Services.AddLogging(c => c.AddDebug().SetMinimumLevel(LogLevel.Trace));
builder.Plugins.AddFromType<WeatherPlugin>();
Kernel kernel = builder.Build();

OpenAIPromptExecutionSettings? setting = new()
{
    ToolCallBehavior = ToolCallBehavior.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}");
    }
}

WeatherPlugin.cs
using Microsoft.SemanticKernel;
using System.ComponentModel;

namespace ConsoleApp16;

public class WeatherPlugin
{
    private readonly HttpClient _client = new();

    [KernelFunction, Description("""
        天気を取得する場所コードを取得します。
        対応している場所コードは下記のとおりです。
        下記に含まれない場所の場合は近くの場所の天気を代わりに取得してください。
        東京
        横浜
        名古屋
        京都
        静岡
        福井
        新潟
        富山
        金沢
        岐阜
        長野
        高山
        松本
        大津
        大阪
        札幌
        仙台
        福岡
        那覇
        """)]
    public static int GetPlaceId([Description("天気を取得する場所")] string place)
    {
        var res = place switch
        {
            "東京" => 130000,
            "横浜" => 140000,
            "名古屋" => 230000,
            "京都" => 260000,
            "静岡" => 220000,
            "福井" => 180000,
            "新潟" => 150000,
            "富山" => 160000,
            "金沢" => 170000,
            "岐阜" => 210000,
            "長野" => 200000,
            "高山" => 190000,
            "松本" => 200000,
            "大津" => 250000,
            "大阪" => 270000,
            "札幌" => 016000,
            "仙台" => 040000,
            "福岡" => 400000,
            "那覇" => 471000,
            _ => throw new ArgumentException("対応していない地域です。")
        };
        return res;
    }

    [KernelFunction, Description("場所コードの地域の天気を返す")]
    public async Task<string> Weather([Description("場所コード")] int place)
    {
        return (await _client.GetAsync($"https://www.jma.go.jp/bosai/forecast/data/forecast/{place}.json")).Content.ReadAsStringAsync().Result;
    }

}

実行結果

https://youtu.be/RBUHSnWmT_w?si=pPXhMsXdLE0TmF4R

ログを含めて実行結果を取ってみました。
かなり高速に、2つのFunctionを実行しさらに気象庁から得られたJSON形式の気象データをもとにきちんと日本語で回答までしていることがわかります。
このように複数のFunctionを実行する必要のあるようなパターンでも実用的になってきました。

Discussion