以下のイベントの発表資料です。 https://dotnet-communities.connpass.com/event/277869/
Semantic Kernel を使って ChatGPT plugins を自分のアプリに組み込む方法日本マイクロソフトシニア クラウドソリューション アーキテクト エンジニアリング大田 一希
View Slide
自己紹介日本マイクロソフトクラウド ソリューション アーキテクト エンジニアリング大田 一希 (Kazuki Ota)好きな技術:C# (20 年以上ほぼ一筋)、Azure PaaS 系サービス苦手な言語:変数に型のない言語全般SNS や Blog:Twitter: @okazuki (https://twitter.com/okazuki)GitHub: @runceel (https://github.com/runceel)Zenn: https://zenn.dev/okazukiQiita: https://qiita.com/okazukiHatena: https://blog.okazuki.jp趣味:プログラミング、ゲーム(スマブラ: 2495時間, モンハン 1785時間、ティアキン 80時間)好きな食べ物:🍖🍣出身地:広島
もくじ Semantic Kernel の全体像をざっくり Semantic Kernel で ChatGPT Plugins を呼ぶ方法 まとめ
Semantic Kernel の全体像をざっくり
Semantic Kernel とは• 全体概要については以下の動画の 2:19:00 あたりから始まる、ちょまどさんの「Azure OpenAI Service と OpenAI (本家) + Semantic Kernel (LLM 用SDK) 入門セッション (C#)」見てください。• JAZUG: Global Azure 2023 [Room C+D]https://www.youtube.com/watch?v=LQhihic-PCg
Semantic Kernel とはLLM を使うアプリを作る際に必要な機能の詰め合わせ◼ コア機能 (a.k.a 分類に困った機能)• プロンプト生成のためのテンプレート エンジン• 変数の埋め込み、関数の呼び出し結果の埋め込みが可能• プラグイン機能 (少し前まで Skill という名前でした)• 組み込みのプラグイン (MSGraph、Bing、OpenAPI、etc...)• 自作のプロンプトや C# の関数で作るプラグイン• 関数のオーケストレーション機能◼ Connectors• 外部サービスとの接続機能◼ Memories• データの永続化・検索機能◼ Planner• やりたいことを達成するための関数を自動で選んでくれる機能
Semantic Kernel 全体像KernelKernelBuilderPlugin関数関数関数関数Plugin関数関数関数関数自作Plugin関数関数関数関数MemoriesAzure Cognitive Search、Sqlite、Qdrant、PostgreSQL、Pinecone、CosmosDB、etc外部サービス組み込みPluginテキスト、ドキュメント、MS Graph API、OpenAPI、ChatGPT Plugins、etcConnector生成 データ保存先使うものを登録AI サービステキスト、チャット、画像EmbeddingAzure OpenAI ServiceOpenAIOthers...Plugins使用するAIサービス使う使うセットアップが終わった Kernel に対して以下のようなことが出来る• 実行したい関数を選んで実行• 実行したい複数の関数をつなげて実行• AI サービスを直接呼び出す• Memory にデータを登録• Memory からデータを取得
Semantic Kernel 全体像KernelKernelBuilderPlugin関数関数関数関数Plugin関数関数関数関数自作Plugin関数関数関数関数MemoryAzure Cognitive Search、Sqlite、Qdrant、PostgreSQL、Pinecone、CosmosDB、etcPlannerPlan外部サービス組み込みPluginテキスト、ドキュメント、MS Graph API、OpenAPI、ChatGPT Plugins、etcConnector生成 データ保存先使うものを登録Pluginの関数一覧から最適なものをAIを使って選択AI サービステキスト、チャット、画像EmbeddingAzure OpenAI ServiceOpenAIOthers...作成Plan 達成に必要な関数を参照Plugins使用するAIサービス使う使う
Semantic Kernel 全体像KernelKernelBuilderPlugin関数関数関数関数Plugin関数関数関数関数自作Plugin関数関数関数関数MemoryAzure Cognitive Search、Sqlite、Qdrant、PostgreSQL、Pinecone、CosmosDB、etcPlannerPlan外部サービス組み込みPluginテキスト、ドキュメント、MS Graph API、OpenAPI、ChatGPT Plugins、etcConnector生成 データ保存先使うものを登録Pluginの関数一覧から最適なものをAIを使って選択AI サービステキスト、チャット、画像EmbeddingAzure OpenAI ServiceOpenAIOthers...作成Plan 達成に必要な関数を参照Plugins使用するAIサービス使う使う今日やりたいことが組み込みである!
作ってみました自作 TODO ChatGPT Plugins を組み込んだアプリのデモrunceel/ChatGPTPlugins-SemanticKernel (github.com)
頑張った点 ChatGPT Plugins を作る 参考: Introduction - OpenAI API 作った Plugin の説明文を丁寧に記載する 正しい Plugin が選択されるようにプロンプトを組み立てる 正しい回答が返ってくるようにプロンプトを組み立てる
ポイント1: ChatGPT Plugins のマニフェストDescription に使い方をきちんと書かないとダメopenapi: 3.0.1 info: title: TodoPlugin version: '1.0' servers: - url: https://localhost:7062 paths: /todos: get: tags: - TodoPlugin description: 全てのTODOを返します。 operationId: getTodos responses: '200': description: O{"schema_version": "v1","name_for_human": "TODO リスト (no auth)","name_for_model": "TODO list","description_for_human": "TODOリストの表示と追加が出来ます。","description_for_model": "TODOリストの管理が出来るプラグインです。TODOの一覧表示と追加が出来ます。","auth": {"type": "none"},"api": {"type": "openapi","url": "https://localhost:7062/swagger/v1/swagger.yaml"},"logo_url": "http://localhost:5003/logo.png","contact_email": "[email protected]","legal_info_url": "http://example.com/legal"}name_for_model と description_for_model を見てAI が使うプラグインを選ぶ
ポイント2: OpenAPI の定義Description に使い方をきちんと書かないとダメopenapi: 3.0.1 info: title: TodoPlugin version: '1.0' servers: - url: https://localhost:7062 paths: /todos: get: tags: - TodoPlugin description: 全てのTODOを返します。 operationId: getTodos responses: '200': description: Oopenapi: 3.0.1info:title: TodoPluginversion: '1.0'servers:- url: https://localhost:7062paths:/todos:get:tags:- TodoPlugindescription: 全てのTODOを返します。operationId: getTodosresponses:'200':description: OKcontent:application/json:schema:type: arrayitems:$ref: '#/components/schemas/TodoItem'post:tags:- TodoPlugindescription: TODOを作成します。operationId: createTodorequestBody:description: 'TODO Item. { "text": "Todo item title" }'content:application/json:schema:$ref: '#/components/schemas/TodoItem'required: trueresponses:'200':description: OKcomponents:schemas:TodoItem:required:- Texttype: objectproperties:text:minLength: 1type: stringdescription: TODO のタイトルadditionalProperties: falsedescription: TODO ItemDescription を見て AI が呼び出すべき処理と渡すべきパラメーターを決める
Kernel への ChatGPT Plugins の読み込みIKernel の ImportChatGptPluginSkillFromUrlAsync メソッドで Kernel に登録可能await kernel.ImportChatGptPluginSkillFromUrlAsync("Todos",new Uri("https://localhost:7062/.well-known/ai-plugin.json"),new HttpClient());ai-plugins.json と OpenAPI の定義を読み込んでSemantic Kernel の Plugins として登録
プラグインを使ったチャットを成立させる処理の流れ1. ユーザーの入力メッセージが何をしたいのか意図を確認する2. 意図を元に適切なプラグインがあるか ActionPlanner を使って探す3. 適切なプラグインがある場合は実行をする4. プラグインを実行した結果を含めたプロンプトを使って回答を生成
プラグインを使うためのフロー1. ユーザーの入力メッセージが何をしたいのか意図を確認するプロンプト力が求められる…
プラグインを使うためのフロー2. 意図を元に適切なプラグインがあるか ActionPlanner を使って探す3. 適切なプラグインがある場合は実行をする32
プラグインを使うためのフロー4. プラグインを実行した結果を含めて回答を生成プロンプト力が求められる…この部分で 2, 3 の処理を呼び出し結果を埋め込んでいる
苦労した点、もっと考えないといけない点苦労した点 Planner が呼び出すべきプラグインを正しく選定出来るような文章を組むのが大変 Planner が内部で使用しているプロンプトが英語なので英語になりがち Planner のプロンプトは差し替え可能なので日本語を使ってくれる Planner はプロンプト力があれば作れるもっと考えないといけない点 ChatGPT Plugins を呼ぶ場合はユーザーの明示的な同意が必要なようにするべき 呼ぶ前にユーザーがボタンを押すなどの明示的なアクションが必要 特に更新系の場合はユーザーの明示的なアクションがないと怖くて使えない Semantic Kernel の Copilot Chat というサンプル アプリは確認プロセスを実装しているので参考になるsemantic-kernel/samples/apps/copilot-chat-app at main チャット履歴が長くなってくると思った通りに動かなくなりがち… 例: プラグインから取得した情報とチャットの履歴の間で矛盾が起きたら間違う可能性が上がる ユーザー認証はどうする?
まとめ 簡単な ChatGPT Plugins を作って Semantic Kernel で使ってみた プロンプト力が無いと思った結果を出すのが大変… GPT 4 で試してみたい ある程度やることを絞らないと使い物になるものを作るのは難しそう… AI にユーザーがやりたいことを要約してもらってから処理をするのが良さそう 1 回のチャットのやり取りで N 回 AI に処理してもらう ユーザーが結構待たされることになるので UI での工夫が必要になりそう 「考え中…」の表示やストリーミングに対応して生成結果をパラパラと表示する Semantic Kernel の Copilot Chat サンプルが参考になる semantic-kernel/samples/apps/copilot-chat-app at main
参考: Copilot Chat の画面 a
© Copyright Microsoft Corporation. All rights reserved.