Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Sementic Kernelのネイティブ関数について
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
tomokusaba
January 26, 2024
Programming
650
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Sementic Kernelのネイティブ関数について
Sementic Kernelのネイティブ関数について
.NETラボ2024年1月
https://dotnetlab.connpass.com/event/305578/
tomokusaba
January 26, 2024
More Decks by tomokusaba
See All by tomokusaba
GitHub Copilot app時代の開発フロー
tomokusaba
0
37
オートマトンと字句解析でRoslynを読む
tomokusaba
0
140
GitHub Copilot appとGitHub Copilot CLIとVS CodeのCopilot Chat Agent Modeの使い分け
tomokusaba
0
130
GitHub Copilot app最速の発信の裏側
tomokusaba
1
530
自宅サーバの変遷
tomokusaba
0
830
Microsoft Build Keynoteふりかえり
tomokusaba
0
160
GitHub Copilot CLIでWebアクセシビリティを改善した話
tomokusaba
0
740
GitHub Copilot CLI で考える複数エージェント設計
tomokusaba
0
280
GitHub Copilot appで変わる GitHub Copilot CLI開発体験
tomokusaba
1
1.5k
Other Decks in Programming
See All in Programming
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
670
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
1
250
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
670
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
Google Apps Script で Ruby を動かす
kawahara
0
130
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
600
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
370
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
530
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
590
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
240
Featured
See All Featured
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
840
Making the Leap to Tech Lead
cromwellryan
135
10k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Balancing Empowerment & Direction
lara
6
1.2k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
890
Typedesign – Prime Four
hannesfritz
42
3.1k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
New Earth Scene 8
popppiees
3
2.5k
Code Reviewing Like a Champion
maltzj
528
40k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
Sementic Kernelのネイ ティブ関数について 株式会社SAKURUG プロダクトDiv 草場 友光 .NETラボ勉強会2024年1月
自己紹介 • 普段は主にシステムをAzureにモダナ イズする仕事をしています。 • コミュニティ活動を通じて知識をアッ プデートしています。 • 2022/08-2024 Microsoft
MVP (Developer Technologies) • tomo_kusaba
宣伝 【VISION】ひとの可能性を開花させる企業であり続ける VISIONに共感できる仲間募集中。
注意 • 個人の見解・解釈が多分に入っています。 • 見解の相違・事実誤認などありましたらご指摘ください。 • #dotnetlabでtweetすると左側に表示されます
今日の目的 • 昨年から生成AIの盛り上がりがすごいことになっています。 • Semantic Kernelのなかでも中心的な機能であるPlugin(旧 Skill)についての機能を見ていきましょう。
Semantic Kernelとは? • 既存のアプリケーションにLLMエージェントを簡単に追加できる オープンソースのSDK。 • 現在は、OpenAI、Azure OpenAI、Hugging Faceなどのモ デルで使用可能。
• C#、Python、Javaで使用可能。 • AIモデルと組み合わせ質問に答えプロセスを自動化するエージェ ントを構築できる。
Semantic KernelはCopilot Stack の中心です https://github.com/Azure-Samples/miyagi?tab=readme-ov-file
なぜ、Semantic Kernelを選択するのか? • C#がメインの開発言語であるから • もはや、AIはクラウド・デスクトップ・モバイル・IoT・Web・MRな どすべての領域において不可欠の存在になりつつある。 • また、PlatformもWindows・Linux・Macすべてで動かす必要 がある。
• そのすべての領域での開発が可能なのがC#/.NET • エンタープライズ対応(監視・負荷分散・認証・認可・・・)
Semantic Kernelの始め方 • まずは、Jupyter Notebooksから! • 次に、Semantic Kernelリポジトリ内にある多数のサンプル コードを参照 •
/dotnet/samples/kernelSyntaxExamples/
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を参照してウエ から順番に実行
Jupyter Notebooksやってみた動画の紹介 • https://www.youtube.com/live/8sK1SyHmmIk?si=Z eTmC6mZddiDM4gF&t=5 Microsoft アメリカ本社所属 Developer Advocate 千代田
まどかさんのJupyter Notebookやってみた動画です。
サンプルコード • /dotnet/samples/KernelSyntaxExamplesに多数のサン プルコードがある
Semantic Kernelで何が作れる? 名称 説明 Chatbot シンプルなユーザと会話するアプリケーション RAG 情報を検索してそれを元にユーザと対話する Copilot ユーザーと対話して何かを作業する
Fully autonomus 最小限の人間の入力で完全に自動化されたアプリケーション (まだこわい?)
Semantic Kernelの構成要素 手順を実行するために必要な機能を実装する。 例)データベースから情報を取得する Bingから情報を取得する 電子メールを送信する 以前の会話を記憶したり取得したりする 手順を実行する順番を計画する。 ユーザとどのように対話するかを指示する。 いわゆる「メタプロンプト」または「指示」と呼ばれるも
の。
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・・・ネイティ ブ関数の書き方を知っていればいける!
プラグインとは? • AIアプリやサービスに公開できる関数のグループ • Semantic Kernelではプラグインの関数を自動または手動の 関数呼び出しまたはプランナーを使用して自動的に呼び出すこと ができる。
ネイティブ関数 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は説明文を読み取り適切な関数を実行します。 (複数該当すれば複数実行することも!) 説明文が重要!
呼び出し側 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と会話する
実行結果 画面モードの切り替え 画面モードの問い合わせ 画面モードの切り替え 関数を呼び出さない質問
デモ
タスクの自動化がとても簡単! • コンソールの文字色を変える例を見たとおりユーザからの入力に 対して適切な関数(メソッド)が呼び出されタスクを行うことがで きる。 • どの程度精度が出るかは、選択したモデルと説明文(プロンプト能 力)次第。
天気を取得してみる 1. 場所コードを取得する 2. 場所コードをもとにその場所の天気を取得する • 以上のような2段階の処理になります。 これまではPlannerでの関数の実行順を制御していましたが今 回はあえて自動実行で試してみたいと思います。 •
gpt-4のモデルで実行すると比較的成功率が高いようです。
場所コードを取得する • まず、場所コードを返すメソッドを実装。 • ポイントはメソッドにつける説明文と引数に つける説明文 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; }
場所コードに基づいて天気を返す • 先ほどの場所コードを求める関数が先に実 行されることを前提に場所コードを引数に する • 戻り値は、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; }
天気の実行結果 • 元となっているデータが少々 異なっているのですがそんな に間違ったJSONの読み取り はしてない印象。 • Plannerを書くのをサボって いるのにもかかわらずそこそ この結果が出るのはすごい。
デモ
参考文献 • 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
おしまい おしまい