Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sementic Kernelのネイティブ関数について

tomokusaba
January 26, 2024

Sementic Kernelのネイティブ関数について

Sementic Kernelのネイティブ関数について
.NETラボ2024年1月
https://dotnetlab.connpass.com/event/305578/

tomokusaba

January 26, 2024
Tweet

More Decks by tomokusaba

Other Decks in Programming

Transcript

  1. Semantic Kernelとは? • 既存のアプリケーションにLLMエージェントを簡単に追加できる オープンソースのSDK。 • 現在は、OpenAI、Azure OpenAI、Hugging Faceなどのモ デルで使用可能。

    • C#、Python、Javaで使用可能。 • AIモデルと組み合わせ質問に答えプロセスを自動化するエージェ ントを構築できる。
  2. Jupyter Notebooks • 前提 • .NET8 SDK • Visual Studio

    Code • “polyglot” VSCode Extension • OpenAIまたはAzure OpenAI ServiceのAPIキーを取得済み • Semantic Kernelリポジトリ (https://github.com/microsoft/semantic-kernel)を クローン • /dotnet/notebooks/に移動して配下のREADME.mdを参照してウエ から順番に実行
  3. OpenAIプラグインとは • Semantic KernelのPlugin+ OpenAPI+マニフェストファイル • https://github.com/microsoft/se mantic-kernel- starters/tree/main/sk-csharp- chatgpt-plugin

    上記をテンプレートとして作成可能である がSemantic Kernelのバージョンが現在 0.19.230804.2-preview 最新まで変更かけるの結構つらい。。。 • Semantic KernelのPlugin・・・ネイティ ブ関数の書き方を知っていればいける!
  4. ネイティブ関数 using Microsoft.SemanticKernel; using System.ComponentModel; namespace ConsoleApp17; public class ColorMode

    { public bool IsOn { get; set; } = false; [KernelFunction, Description("画面モードの状態を取得します。")] public string GetMode() { return IsOn ? "ON" : "OFF"; } [KernelFunction, Description("画面モードを切り替えます。")] public string ToggleMode() { IsOn = !IsOn; if (IsOn) { Console.ForegroundColor = ConsoleColor.DarkBlue; } else { Console.ResetColor(); } return GetMode(); } } • AIにコードを呼び出させたいときは説明文をつ けてその関数の使い方をAIに理解させる必要 があります。(Description) • AIは説明文を読み取り適切な関数を実行します。 (複数該当すれば複数実行することも!) 説明文が重要!
  5. 呼び出し側 using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel; using ConsoleApp17; Kernel kernel =

    Kernel.CreateBuilder() .AddAzureOpenAIChatCompletion( “デプロイ名”, “エンドポイント”, “APIキー”).Build(); kernel.Plugins.AddFromType<ColorMode>(); 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}"); } } • Semantic KernelのKernelに先ほど作った プラグインと使用するモデルを渡します。 • ToolCallBehavior.AutoInvokeKernelF unctionで関数を説明文に従って自動的に呼 び出します。 使用するモデル 使用するプラグイン 自動的に関数を呼び 出す LLMと会話する
  6. 場所コードを取得する • まず、場所コードを返すメソッドを実装。 • ポイントはメソッドにつける説明文と引数に つける説明文 Plannerや関数の自動呼び出しによって 使用される [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; }
  7. 場所コードに基づいて天気を返す • 先ほどの場所コードを求める関数が先に実 行されることを前提に場所コードを引数に する • 戻り値は、JSON • AIにJSONをよしなに解析させていい感じ に天気を答えてくれる(はず)

    • 呼び出し側は先ほどと同じ [KernelFunction, Description("場所コードの地域の天気を返す")] public async Task<string> Weather([Description("場所コード")]int place) { return (await _client.GetAsync($"https://www.jma.go.jp/bosai/forecast/data/forecast/{place}.jso n")).Content.ReadAsStringAsync().Result; }
  8. 参考文献 • What is Semantic Kernel? https://learn.microsoft.com/ja-jp/semantic-kernel/overview/ • .NET Conf

    2023 Recap Japan ~ 最新の.NETを学ぶ https://info.microsoft.com/JA-ModApps-WBNR-FY24-12Dec-19- NET-Conf-2023-Recap-Japan-Latest-Learn-NET- SREVM25677_LP01-Registration---Form-in-Body.html • .NET Conf Japan 2023「.NET + AI」補足記事 https://zenn.dev/microsoft/articles/231219-dot-net- conf?redirected=1 • semantic-kernel https://github.com/microsoft/semantic-kernel