CODE アプリではTCA移行が順調に進んでいる中、AIも大活躍してます!
今回のテーマはAI関連です、最近 github copilot for xcode のおかけで仕事がもっとスムーズになりました。今回使うだけじゃ足りないと思って色々調査しました、少し整理しようと思います。
github copilot for xcodeについて
定番のAskモード以外でAgentモードも用意されています、底部のスライドボタンで切り替えます
モード切り替え後、Xcodeが出してるエラーの隣にアイコンが追加されます:
このアイコンをタップするとエラーの分析と修正をLLMに投げます、そして分析と修正をやってくれます:
これは素晴らしいです、ワンクリックでエラー修正されて、しかも分析とエラーの原因もしっかり生成されます!
今回、基礎の概念をシンプルに説明しようと思います
LLM と Prompt
LLMはLarge Language Models(大規模言語モデル)の略称、「大量のテキストデータを学習し、人間のように自然な文章を生成・理解することに特化したAIモデル」
プロンプト(Prompt)とは、AIとの対話やコマンドラインインタフェース(CLI)などの対話形式のシステムにおいて、ユーザが入力する指示や質問のことです。AIがユーザの要求や問いに対して適切な応答や結果を生成するためには、明確で具体的なプロンプトが必要です。不適切なプロンプトを使用すると、AIが望ましくない結果や誤った情報を生成する可能性があります。(以下↓の記事内一部説明引用しました)
user prompt
ChatGPTが発表されましたが、見た目は普通のSNSアプリとほぼ同じです。我々は問題もしくは話したいメッセージを送って、AIがメッセージを生成して返信します。そこで我々が送信したのはuser promptですね:
system prompt
一方で我々がリアルで他の人に質問した時、全く同じ質問でも相手によって答えはバラバラになりますよね。例えば 腰が痛い、どうすればいい を友たちに聞くと 貼り薬使ったら で返答しますが、両親に聞くと お医者さんに見てもらう? ![]()
けれどAIは自分の友達でもないし、親でもない。質問を投げると 腰痛緩和の方法XX みたいな返答を生成されます。悪くないですが、もっと生き生きとした答えが欲しいですね。
そこでAIにも一定の設定を最初から持たせると、生成された答えはもっと正確になると思われます:
AIに投げるuser prompt内 君が僕の両親 の設定を入れて、君が僕の両親で、私は今腰が痛いのuser promptをAIに投げると、より生き生きとした答えをもらえます。
ですが、毎回質問した際 この設定を書くのはイマイチですね、そこで設定だけはuser promptから分離した物system promptとなります。
system promptは主にAIのキャラクター設定、性格、言葉使いなどのデータを保存してます。AIに質問するたびAIツールはsystem promptとuser promptをまとめてLLMに投げます。
system promptはAIツールで事前設定されます、通常我々は変更できません:
AI Agent・Tool
AIとのやり取りは問答の形式でできるですが、このやりとりですと自分達でAIの答えを見てコードを書く必要あります。具体的な任務を完成までできると最高じゃないですか?
そこでAutoGPTが出ました:
日本語のチュートリアルもあります!
AutoGPTはローカルで走らせられます。具体的に何ができるか一つの例を説明します。
AutoGPTにやることを投げます:パソコン内のXcodeのpathを教えてください:
list_filesとread_filesは事前書いた関数です、そしてこの関数たちの具体の説明と使用方法をAutoGPTに登録しています。
AutoGPTが登録された関数のもとに:どのような関数(list_files, read_files)が用意されたか、どうやって使う(call_toolname)のか、system promptを生成されます。
①AutoGPTは我々が出した指令(user prompt)と事前生成されたsystem prompt一緒にまとめてLLMに投げます。
②LLMが賢いのであれば、その要求に対し適切な関数を呼ぶメッセージを生成して、AutoGPTに投げます(ここAutoGPTに投げたメッセージはAutoGPTがsystem prompt内定義された形式になります、例:call_toolname)
③AutoGPTがメッセージを受け取って解析成功したら、関数list_files()を呼ぶ事ができます。そして関数実行し、結果をAutoGPTに返却します。
④最後関数実行した結果をLLMに投げます、LLMはそれを分析しAutoGPTに新しいメッセージを返却します。
やることを完成させるまで、①から④の過程を循環します。
この様なuser、関数、LLMの間通信するプログラムをAI Agentと呼びます。
そして関数の部分はAgent Toolと呼びます
function calling
AI AgentのおかけでAIが自力で問題解決する事ができました!しかし少し問題があります。
system prompt内では具体的なfuncの使い方や使うため返すべきフォーマットを自然言語で説明しましたが、一定の確率で違う答えを生成します。AIは確率分布ですので。
この問題を解決する為一部のAI Agentは間違えたフォーマット受けた際問題をAIにもう一度投げ、正確のフォーマット受けるまで再試行します。
この方法は問題を解決できますが、デメリットも大きいですね、不安定かつtokenを大量に消費します。
そこで、LLM側で解決すればいいじゃない?という声が出て、LLM提供する企業がLLM内に新しい機能実装しました、それがfunction callingです:
function callingが何をやってるのかを一言で言うと: フォーマットを統一し、AIにもルールを分からせる
function callingを使えば、元々system prompt内に自然言語で書かれた どのような関数(list_files, read_files)が用意されたか、どうやって使う(call_toolname)のかの記述は標準化され、system promptから分離されます。
上の例ですと一個のAgent ToolはJSONで定義されて、tool nameはname keyのvalueに指定、tool descriptionはdesc keyのvalueに指定、必要なparamsはparams keyに指定します。
最後はLLM側生成される物のフォーマットも決めます(例はJSONですね)
これで全てのAgent toolの説明、AIに投げる時のフォーマット、LLM側生成された物のフォーマットこれら全部function calling内管理されます。
フォーマットが統一された事でLLMの特定のトレーニングがもっと簡単になります、トレーニングの最後ではLLMは自分がやった事をより理解し、同じ質問を投げると: あぁ、この問題やった覚えがある の様に素早く回答を生成します。
もう一点素晴らしい事は、function callingはLLMが生成された内容のフォーマットを決めたので、もしAI生成された内容が決めたフォーマットと違う場合、AIサーバー内でその間違えを自動検知して、自ら再度答えを生成します。これでAI Agentの開発難易度も下がり、プラスでclient側のToken消費も抑えられます。
これらのメリットによって多くのAI Agentはsystem promptからfunction callingに切り替えができますね。
実はfunction callingも抱える問題があります、LLMによって提供されたAPIもそれぞれ違うので(LLM開発された会社がAPI決めるので、仕方ないですね)複数のLLMがサポートするAI Agentを開発するのも簡単ではないです。
なのでまだsystem prompt使用して開発されたAI Agentもある程度あります。
mcp
AI AgentとLLM間の通信問題ほぼ解決の後、まだAI AgentとAgent tool間通信の問題が残ってます。
一番シンプルなやり方はAI AgentとAgent toolを同じプロジェクト内に書くことです、そうするとただfunctionを叩けば問題ないです。
しかし汎用的なAgent tool(例えばweb browserのAgent toolとか)をAI Agent作るたびにコピーして入れるのも良くないですね。
そこで解決策が出されました、それがmcp(Model Context Protocol)です:
mcpは通信protocolの一種です:(http(Hypertext Transfer Protocol)、ftp(File Transfer Protocol)、みんなprotocol同士)
mcp server内共通で使用したいtoolsを入れてます、そしてmcp server内のtool使用するAI Agentはmcp clientと呼びます。
mcpはprotocolなのでAgentとTool間の通信はこのprotocolのルール(フォーマット、APIとか)に従う必要があります。
mcp serverも色んなAPI提供しています、例えばmcp内のtool listのAPIとか、各toolの説明とか、リクエスト時必要のパラメーターとか。
tool以外他にresourcer(ファイルのread・write機能)とprompts(promptのテンプレート機能)も提供してます。
mcp serverはAI Agentと同じサーバーに置くことができますが、AI Agentと分離し他のサーバーに置くのも出来ます、その時はhttp(Streamable HTTP)を使用してデータ交換をします。
mcpは基本LLMと関連しない、AgentがどのLLMモデル使用したのかmcpは気にしないです。
最後
最後少し整理しましょう:
①:ちょっと腰が痛いので、AI Agent(mcp client)に腰が痛い、どうすればいい?の問題を投げます。
②:Agentは問題を処理してuser promptを生成する
③:Agentはmcp serverと通信しtoolsのデータを取得してsystem promptに処理する(もしくはfunction callingリクエストのフォーマットに変換)
④:Agentはsystem prompt(もしくはfunction callingリクエスト)とuser prompt結合してLLMに投げる
⑤:LLMはデータを処理して分析した後、web_browserのtoolsの使用を決めて、AI Agentにweb_browser tool使用するリクエスト(system prompt内決めたフォーマットもしくはfunction calling)をAI Agentに投げる
⑥:AI Agentはリクエストを処理し、url指定して、mcp server内のweb_browser toolでの使用リクエストする
⑦:mcp serverがweb_browser tool使って指定したurlを解析し、データをAgentに返す
⑧:Agentはmcp serverから貰ったデータをLLMに渡す
⑨:LLMはデータのもとに思考を始め、そして答えを生成してAgentに渡す
⑩:最後Agentは答えを我々に見せる(テキストフィールドに展示)
system prompt、user prompt、AI Agent、Agent tool、function calling、mcpたちが連携してようやく問題解決にたどり着きました!
今回のまとめは以上となります、ありがとうございました!








