Slide 1

Slide 1 text

Sementic Kernelのネイ ティブ関数について 株式会社SAKURUG プロダクトDiv 草場 友光 .NETラボ勉強会2024年1月

Slide 2

Slide 2 text

自己紹介 • 普段は主にシステムをAzureにモダナ イズする仕事をしています。 • コミュニティ活動を通じて知識をアッ プデートしています。 • 2022/08-2024 Microsoft MVP (Developer Technologies) • tomo_kusaba

Slide 3

Slide 3 text

宣伝 【VISION】ひとの可能性を開花させる企業であり続ける VISIONに共感できる仲間募集中。

Slide 4

Slide 4 text

注意 • 個人の見解・解釈が多分に入っています。 • 見解の相違・事実誤認などありましたらご指摘ください。 • #dotnetlabでtweetすると左側に表示されます

Slide 5

Slide 5 text

今日の目的 • 昨年から生成AIの盛り上がりがすごいことになっています。 • Semantic Kernelのなかでも中心的な機能であるPlugin(旧 Skill)についての機能を見ていきましょう。

Slide 6

Slide 6 text

Semantic Kernelとは? • 既存のアプリケーションにLLMエージェントを簡単に追加できる オープンソースのSDK。 • 現在は、OpenAI、Azure OpenAI、Hugging Faceなどのモ デルで使用可能。 • C#、Python、Javaで使用可能。 • AIモデルと組み合わせ質問に答えプロセスを自動化するエージェ ントを構築できる。

Slide 7

Slide 7 text

Semantic KernelはCopilot Stack の中心です https://github.com/Azure-Samples/miyagi?tab=readme-ov-file

Slide 8

Slide 8 text

なぜ、Semantic Kernelを選択するのか? • C#がメインの開発言語であるから • もはや、AIはクラウド・デスクトップ・モバイル・IoT・Web・MRな どすべての領域において不可欠の存在になりつつある。 • また、PlatformもWindows・Linux・Macすべてで動かす必要 がある。 • そのすべての領域での開発が可能なのがC#/.NET • エンタープライズ対応(監視・負荷分散・認証・認可・・・)

Slide 9

Slide 9 text

Semantic Kernelの始め方 • まずは、Jupyter Notebooksから! • 次に、Semantic Kernelリポジトリ内にある多数のサンプル コードを参照 • /dotnet/samples/kernelSyntaxExamples/

Slide 10

Slide 10 text

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を参照してウエ から順番に実行

Slide 11

Slide 11 text

Jupyter Notebooksやってみた動画の紹介 • https://www.youtube.com/live/8sK1SyHmmIk?si=Z eTmC6mZddiDM4gF&t=5 Microsoft アメリカ本社所属 Developer Advocate 千代田 まどかさんのJupyter Notebookやってみた動画です。

Slide 12

Slide 12 text

サンプルコード • /dotnet/samples/KernelSyntaxExamplesに多数のサン プルコードがある

Slide 13

Slide 13 text

Semantic Kernelで何が作れる? 名称 説明 Chatbot シンプルなユーザと会話するアプリケーション RAG 情報を検索してそれを元にユーザと対話する Copilot ユーザーと対話して何かを作業する Fully autonomus 最小限の人間の入力で完全に自動化されたアプリケーション (まだこわい?)

Slide 14

Slide 14 text

Semantic Kernelの構成要素 手順を実行するために必要な機能を実装する。 例)データベースから情報を取得する Bingから情報を取得する 電子メールを送信する 以前の会話を記憶したり取得したりする 手順を実行する順番を計画する。 ユーザとどのように対話するかを指示する。 いわゆる「メタプロンプト」または「指示」と呼ばれるも の。

Slide 15

Slide 15 text

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・・・ネイティ ブ関数の書き方を知っていればいける!

Slide 16

Slide 16 text

プラグインとは? • AIアプリやサービスに公開できる関数のグループ • Semantic Kernelではプラグインの関数を自動または手動の 関数呼び出しまたはプランナーを使用して自動的に呼び出すこと ができる。

Slide 17

Slide 17 text

ネイティブ関数 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は説明文を読み取り適切な関数を実行します。 (複数該当すれば複数実行することも!) 説明文が重要!

Slide 18

Slide 18 text

呼び出し側 using Microsoft.SemanticKernel.Connectors.OpenAI; using Microsoft.SemanticKernel; using ConsoleApp17; Kernel kernel = Kernel.CreateBuilder() .AddAzureOpenAIChatCompletion( “デプロイ名”, “エンドポイント”, “APIキー”).Build(); kernel.Plugins.AddFromType(); 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と会話する

Slide 19

Slide 19 text

実行結果 画面モードの切り替え 画面モードの問い合わせ 画面モードの切り替え 関数を呼び出さない質問

Slide 20

Slide 20 text

デモ

Slide 21

Slide 21 text

タスクの自動化がとても簡単! • コンソールの文字色を変える例を見たとおりユーザからの入力に 対して適切な関数(メソッド)が呼び出されタスクを行うことがで きる。 • どの程度精度が出るかは、選択したモデルと説明文(プロンプト能 力)次第。

Slide 22

Slide 22 text

天気を取得してみる 1. 場所コードを取得する 2. 場所コードをもとにその場所の天気を取得する • 以上のような2段階の処理になります。 これまではPlannerでの関数の実行順を制御していましたが今 回はあえて自動実行で試してみたいと思います。 • gpt-4のモデルで実行すると比較的成功率が高いようです。

Slide 23

Slide 23 text

場所コードを取得する • まず、場所コードを返すメソッドを実装。 • ポイントはメソッドにつける説明文と引数に つける説明文 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; }

Slide 24

Slide 24 text

場所コードに基づいて天気を返す • 先ほどの場所コードを求める関数が先に実 行されることを前提に場所コードを引数に する • 戻り値は、JSON • AIにJSONをよしなに解析させていい感じ に天気を答えてくれる(はず) • 呼び出し側は先ほどと同じ [KernelFunction, Description("場所コードの地域の天気を返す")] public async Task Weather([Description("場所コード")]int place) { return (await _client.GetAsync($"https://www.jma.go.jp/bosai/forecast/data/forecast/{place}.jso n")).Content.ReadAsStringAsync().Result; }

Slide 25

Slide 25 text

天気の実行結果 • 元となっているデータが少々 異なっているのですがそんな に間違ったJSONの読み取り はしてない印象。 • Plannerを書くのをサボって いるのにもかかわらずそこそ この結果が出るのはすごい。

Slide 26

Slide 26 text

デモ

Slide 27

Slide 27 text

参考文献 • 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

Slide 28

Slide 28 text

おしまい おしまい