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

自作のエージェントフレームワーク Shikigami Framework と そのMCPサーバ...

自作のエージェントフレームワーク Shikigami Framework と そのMCPサーバ化について (フル)

More Decks by masa_charcoal (masachaco)

Other Decks in Technology

Transcript

  1. Clineが便利 • 家に居すぎてしまう • 進捗がバンバン出るので家でつ きっきりになってしまう • 外に出たい • 季節的にちょうどいいので公園で

    お花見をしながらプログラミング したい • 競馬場で興味ないレース中は 暇だからプログラミングしたい • Clineはリモートでは使いづらい
  2. Shikigami Agent Framework User Interface Adapter LLM User User Interface

    ShikigamiAgent LLM Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え Agent Team Agent Agent Agent
  3. よくあるエージェントの形式 Shikigami Agent Framework User Interface Adapter LLM User Slack

    UI ShikigamiAgent LLM Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 各種UIからエージェントに指示を出 す エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え Agent Team Agent Agent Agent
  4. よくあるエージェントの形式 Shikigami Agent Framework User Interface Adapter LLM User Mattermost

    UI ShikigamiAgent LLM Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 各種UIからエージェントに指示を出 す エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え Agent Team Agent Agent Agent
  5. よくあるエージェントの形式 Shikigami Agent Framework User Interface Adapter LLM User Standard

    IO UI ShikigamiAgent LLM Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 各種UIからエージェントに指示を出 す エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え Agent Team Agent Agent Agent
  6. Shikigami Agent Framework User Interface Adapter LLM User User Interface

    ShikigamiAgent Open LLM Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 各種UIからエージェントに指示を出 す エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え Agent Team Agent Agent Agent
  7. Shikigami Agent Framework User Interface Adapter LLM User User Interface

    ShikigamiAgent Claude Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 各種UIからエージェントに指示を出 す エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え Agent Team Agent Agent Agent
  8. Shikigami Agent Framework User Interface Adapter LLM User User Interface

    ShikigamiAgent Gemini Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 各種UIからエージェントに指示を出 す エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え Agent Team Agent Agent Agent
  9. よくあるエージェントの形式 Shikigami Agent Framework User Interface Adapter LLM User User

    Interface ShikigamiAgent LLM Client Shikigamiの構造 ユーザとユーザの間に共通化したUI のアダプタを用意 • 各種UIを切り替えられる • Slack • Mattermost • GitHub (プルリク) • 標準入出力 各種UIからエージェントに指示を出 す エージェントとLLMの間に、切り替え 可能なLLM Clientを用意 • モデルの切り替え • モデルの呼び出し方の 切り替え チームに エージェント (機能・役割)を 追加していく Agent Team Agent Agent Agent
  10. デコレータ? 「@(好きな名前)」で関数をデコレーション できる機能。 デコレータをつけた 関数が読み込まれたときに 1度だけデコレータで定義した 処理が実行される (関数の実行時ではない) この例だと、Programmer クラスが

    Importされた際に「read_file」処理に対して 「function_calling」の処理が1度だけ 実行される この仕組みを使って エージェントのインスタンスを作る前に 「LLMが呼び出せる機能ですよ」という マークを付けられるようにする
  11. Agentで関数実行する例 実装されている変数名と function callingでLLMが指定する変数名は 一致しているので 可変長引数 (**kwarg) で まるっとマッチさせることができる このkeyと一致する引数に

    このvalueを指定してねということが できる ので、あらかじめ用意した関数の参照に 可変長引数でLLMが指定した変数を動的に 指定できる LLMが指定した呼び出しを そのまま関数実行に変換できる
  12. ここまでのまとめ Agentのインスタンスはそれぞれ 「私こんな関数を実行できます」 「その関数の参照はこれです!」 という情報をもっており Shikigamiは、それぞれのAgentの情報を 集約する。 その後、ShikigamiはLLMに 「すんません、私こんな機能実行できるんです けど、次何したらいいですかね!」

    と聞きに行く LLMは「それならら、次この機能実行して~」 と言うので、それを実行する その繰り返しで、自律的に与えられた問題を解 決するのがAgentの大まかな仕組み Shikigami Agentを起動 Team の持っている Function Callingを集約 LLMに「こんな機能あるんですけど次何したらいいですかね? 今の状況はこれです」と聞く LLMが「これ実行して~」と返してくる 言われた機能を実行する 処理終了 次やるべきこと を考える 処理完了 or ユーザに問い合わせが必要
  13. よくあるエージェントの形式 GitHub上で動かしたい GitHubActions上で動かす プルリクの内容(作業指示)と コメント(経緯・追加指示)を読んで 作業を開始する LLMのコード出力以外(つまり発言)は 標準出力に出力する 作業が完了したらプルリクに 作業完了コメントを残す

    (経緯を残すことで次回の作業はその 続きから行える。) GitHubのプルリク の コメントを 読み書きする エージェント ブランチ プルリク プログラミング する エージェント 作業指示 コメント・経緯 GitHubActions コード Shikigami
  14. Issueの作成 プルリクの作成 Shikigami Agentの実行 作業報告 レビュー・次の指示 作業完了 作業の流れ Issueにやりたいことを書く 準備できたら「shikigami」ラベルを付ける

    その機能を実現するための ブランチとプルリクができる プルリクができるとAgentが実行される コードを書き、ブランチにコミット 作業内容をプルリクにコメント・報告 ユーザがレビュー 追加指示があれば、再度Agentを実行 問題なければマージ
  15. Clineの頭いいところ① ClineはLLM利用料を安く抑えるための 努力をしている その努力の1つが 「FunctionCallingを使わない」 ということ FunctionCallingは便利 • LLMが必ず指定した形で関数を呼んでくれる •

    やりとりのルールが整備されている 一方で不便な面もある • 毎回関数の定義を送る必要がある • 関数の実行は1回のレスポンスで 返さないといけない Clineのシステムプロンプト 引用元:https://github.com/cline/
  16. Clineの頭いいところ① LLMの利用料金は 入力したトークン(≒文字数) 出力したトークン(≒文字数) が大きいほど、お金がかかる 毎回関数の定義を送る必要がある ということは、 毎回関数定義を指定する分のお金がかかる。 ClineはFunctionCallingを使わない代わりに システムプロンプトに長々と

    機能を呼びたいときは以下のXML形式で リクエストしなさい というルールを書いている システム プロンプト 関数 定義 過去の記憶 今回の指示 (入力) LLMの出力 システム プロンプト 関数 定義 過去の記憶 今回の指示 (入力) LLMの出力 2回めのリクエスト 1回めのリクエスト 1 回 目 分 の 利 用 料 金 2 回 目 分 の 利 用 料 金
  17. Clineの頭いいところ① キャッシュにヒットすると利用料金が 安くなる。 Claudeの場合は キャッシュへの書き込みは25%高くなるが キャッシュの読み込みは9割安くなる。 つまりシステムプロンプトのような 毎回同じことを言って守らせるルールは 超お得に実行させることができる 一方でFunctionCallingはプロンプトではない

    (JSONによる指定)なのでキャッシュできない (トークンは消費してお金はかかる) キャッシュや記憶の管理などを 独自に行なっている システム プロンプト 関数 定義 過去の記憶 今回の指示 (入力) LLMの出力 キャッシュ した システムプロンプト 関数定義 過去の記憶 今回の指示 (入力) LLMの出力 2回めのリクエスト 1回めのリクエスト 1 回 目 分 の 利 用 料 金 2 回 目 分 の 利 用 料 金
  18. Clineの頭いいところ③ FunctionCallingは OpenAIならOpenAIのフォーマット Anthropicなら、Anthropicのフォーマットを 用意する必要がある。 Function Callingを使わずに 独自定義にすると LLM側がこちらのフォーマットに 合わせてくるため

    クライアントの実装は基本的に テキストでやり取りをする シンプルなもの だけ用意すればいい そのため、多くのLLMに対応しやすく 新バージョンの LLMが出てもすぐに対応できる 今いちばん最適なLLMを選べる Clineのシステムプロンプト 引用元:https://github.com/cline/
  19. デメリットもあるよ 先述のメリットもあるが LLMが間違ったXMLフォーマットで 送ってきたり指定を守らない というデメリットもある その場合はリトライしている (その分費用も嵩む) あまり優秀ではないLLMは ルールを守りきれないため コストが余計にかかる場合もある

    LLMがよくやる失敗1(XML以外の応答が含まれる。) == はいわかりました、以下にXMLを出力します <ter> <tdef> <tn>get_weather</tn> ….. LLMがよくやる失敗2(指定した項目がない) == <ter> <tdef> <tn>get_weather</tn> </tdef> </ter> LLMがよくやる失敗3(存在しない関数を実行しようとする) == <ter> <tdef> <tn>sonzai_shinai_func</tn> ….. LLMがよくやる失敗4(そもそもXMLではない) == はい、わかりました。ほげほげを実行します
  20. Shikigami Agent Framework User Interface Adapter LLM User User Interface

    ShikigamiAgent LLM Client Shikigamiも対応する このようにFunctionCallingを使うか 使わないかは、現状一長一短。 ShikigamiもClineに倣って、 FunctionCallingに 依存しなくて良いようにしてみる。 「LLM Client」の部分を FunctionCallingベースのものと テキストベースのものを 選べるようにする。 Agent Team Agent Agent Agent
  21. Shikigamiも対応する これら Shikigamiのあり方を説明した システムプロンプト XMLで使う機能を指定してねという システムプロンプト 仕事の進め方 (プルリク読んでね、成果報告してね) を書いたシステムプロンプト ユーザ指示のシステムプロンプト

    を1つにマージしたものが Shikigamiのシステムプロンプトになる あとは、レスポンスをパースして Shikigamiに渡せばOK Shikigamiのあり方を説明した システムプロンプト XMLでツールを呼んでね というルールを決めた システムプロンプト 仕事の進め方を書いた システムプロンプト ユーザが追加で指示した システムプロンプト Shikigami の シ ス テ ム プ ロ ン プ ト
  22. Clineの頭いいところ④ Visual Studio Codeの拡張機能として 実装されているところ。 VSCode内では言語サーバが動いており 編集したコードの警告やエラーを教えてくれる 拡張機能はVSCodeのAPI経由で その警告やエラーを取得できる また、拡張機能を書くと言語サーバが

    対応するプログラミング言語を増やせる つまり、VSCodeに拡張機能をいれると Clineがエラーや警告に対応できる プログラミング言語が増える Clineが言語サーバを直接管理するよりも 柔軟に実装できかつ、VSCodeの資産も 活用できる。 コード VSCode Python 拡張機能 言語サーバ Cline 言語サーバの出す エラー警告例
  23. PowerSpot Yorishiro (Programmer等) Yorishiro (GitHubOperator等) Team Slack / Mattermost /

    GitHub / Standard IO LLM Shikigami VSCode 拡張機能 LLM Client (Text Base) Ofuda (UI Adapter) Workspace 編集する ファイル shikigami_ignore Shikigami_rules 最終構成 できた せっかくなので各コンポーネントに 名前をつける • Agentのフレームワーク • Shikigami • Shikigamiの実行環境 • PowerSpot • UI のアダプタ • Ofuda • Agentクラス • Yorishiro
  24. MCPサーバ化する Agentでやったときのように 「私こんな関数を実行できます」 「その関数の参照はこれです!」 「すんません、私こんな機能実行できるん ですけど、次何したらいいですかね!」 をLLMに伝えるプロトコルがある それが、「Model Context Protocol」(MPC)

    Claude DesktopはMPCを使う側(Client) としての機能があるので MPCに対応させると、Shikigamiの 機能を呼び出させることができる UIはそのままClaudeDesktopになるため UI Adpterは使用しない MCPサーバ こんなツールが 使えるよ このツール この引数で実行して 実行したよ。 結果はこの通り
  25. MCPの実装例 FastMCPを使った、MCPサーバの実装例 「@mcp.tool」というデコレータをつけると FastMCPが その関数定義とpydocを読み取って MCPのクライアント(Claude Desktop)に 「こんな関数実行できまっせ!」と 伝えてくれる この例では

    指定したユーザ名にマッチしたら そのユーザが好きな、キャラを返す という処理を例として実装している ローカルで動くのでClaudeとは標準 入出力でやりとりをする
  26. ShikigamiのMCPサーバ化 Shikigamiがすでに 「こういう機能があって!」 「この機能を実行する参照はこれ!」 とまとめてくれているので それを持ってきて、mcpに登録するだけ。 関数の型の指定と、Pydocのコメントが 書いてあれば同じように 「こういう機能があって!」 「この機能を実行する参照はこれ!」

    とClaude Desktopに伝えてくれる デコレータは関数として 手動実行させることもできるので デコレータに関数の参照を引数にして じっこうするだけで 利用可能なMCPとして登録できる 「@mcp.tool」 デコレータを関数として 手動実行してMCPに 登録していく。 LLMが呼び出せる関数や 関数の説明はShikigamigaすでに 集めているので