Function Callingの4つのステップは何ですか?LLM自体は実際にツールを実行しますか?
Function Callingには完全な4ステップのフローがあります——この4ステップを理解することがAIエージェントの動作原理を理解する鍵です。
ステップ1、LLMにどのツールが利用可能かを伝える:LLMのAPIを呼び出す際、各ツールの名前・機能・パラメータフォーマットを説明するツールリストを同時に渡します(例:「get_eth_price:ETHの現在価格を取得、パラメータ:currency(文字列、'USD'または'EUR')」)。LLMはこのリストを読み取り、どのツールが利用可能かを知ります。
ステップ2、LLMがツール呼び出しリクエストを出力する:LLMが推論中にツールが必要と判断した場合、直接実行するのではなく、応答に構造化されたJSONフォーマットのリクエストを出力します:{"tool": "get_eth_price", "parameters": {"currency": "USD"}}。
ステップ3、バックエンドコードが実際に実行する:あなたのアプリケーション(LLMではなく)がこのJSONリクエストを読み取り、実際のget_eth_price関数を呼び出し、CoinGecko APIから実際のETH現在価格を取得します。
ステップ4、結果をLLMに返す:関数の実行結果をLLMに返し、LLMはこの結果に基づいて推論を継続して最終応答を生成します。
重要な認識:LLM自体はツールを実行しません。「何を呼び出したいか」を言うだけで、実際の実行は常にバックエンドコードです。
Function CallingはMCPと同じものですか?ドキュメントで両方の用語を見かけますが、何が違いますか?
同じものではありませんが、密接に関連しており混同しやすいです。
Function Calling / Tool UseはLLMとツール間の「通信メカニズム」です——LLMがツールを呼び出したいと「言う」方法(構造化JSONを出力)と、ツールの結果をLLMに返す方法を定義します。これはGPTとClaudeの両方がサポートするLLM APIレベルの標準です。
MCP(Model Context Protocol)はFunction Callingの上に構築された「ツール標準化パッケージ層」です——ツールがどのように記述・発見・異なるLLMとフレームワーク間で再利用されるかを定義します。シンプルな比喩:Function Callingは「HTTPプロトコル」のようなもので通信方法を定義し;MCPは「REST API仕様」のようなもので、HTTP上でリソースと操作をどのように整理するかを定義します。MCPがあれば、ツールを一度書くだけで、MCP対応のすべてのシステム(Claude・GPT・LangChain・ElizaOS)で使用できます。
初心者への実際的なアドバイス:単にAgentにツールを呼び出させたいだけなら、フレームワーク(LangChainの@toolデコレータ・ElizaOSのActionプラグイン)を使えば十分で、自分でMCPを実装する必要はありません。
LLMに「いつツールを呼び出すべきか、いつ直接答えるべきか」をどうやって知らせますか?
答えはツールの「説明文」にあります——LLMは各ツールに書いた説明に基づいていつ呼び出すかを判断します。LLMに正確な判断をさせるためのいくつかの設計原則:
第一、ツールの説明は「適用シナリオ」を指定する:ツールが何をするかだけでなく、いつ使うべきかを明確にします。良い説明:「ETHの現在のUSD価格を照会する。ユーザーが暗号資産の現在価格・最新見積もりについて質問したとき、またはこのツールを価格比較に使う必要があるときに呼び出す。」悪い説明:「ETHの価格を取得する。」
第二、LLMにいつツールを呼び出さないかを知らせる:AgentにSystem Promptで各ツールの使用境界を明確にします。例:「リアルタイムデータが必要なときだけツールを呼び出す;質問が概念説明に関するものであれば(例:「DeFiとは何か」)、ツールを呼び出さずに直接答える。」
第三、ツールが多すぎないように:LLMに渡すツールが多ければ多いほど、読むべきツールの説明が増え(トークンを消費)、大量のツールから正しいものを選ぶのが難しくなります。第四、LLMの実際の選択を観察する:開発段階ではverboseモードを有効にして、どのような状況でどのツールを選択するかを観察します。
Function Callingのセキュリティ設計の基本原則は何ですか?特にクリプトAgentシナリオでは
LLM自体はツールを実行しないため(実行はバックエンドで行われる)、セキュリティ設計の核心はバックエンドの「実行層」にあります。クリプトAgentのためのいくつかの基本的なセキュリティ原則:
第一、読み取りツールと書き込みツールを厳格に分類する:ツールを2つのカテゴリに分けます——読み取り専用ツール(データ照会・オンチェーン状態の読み取り;エラーの結果は情報誤り)と書き込みツール(トランザクション署名・資金移動;エラーの結果は資産損失)。バックエンド実行層での2つのカテゴリの認可要件が異なり、混在させてはなりません。
第二、書き込みツールにはパラメータ検証が必須:バックエンドで書き込みツールを実行する前に、LLMが渡したパラメータが合理的かを検証します——金額は設定上限内か?アドレスはホワイトリストにあるか?操作タイプは許可されているか?
第三、大額操作には人工確認が必要:閾値を超えた書き込み操作には、バックエンドに人工確認ステップを追加します。
第四、すべてのツール呼び出しを記録する:各ツール呼び出しの完全な記録をログに書き込みます。
Function Callingの最小動作例:AgentにETH現在価格を照会させる
以下はLangChain(Python)でのFunction Callingの実装の最もシンプルな例で、ツール定義からAgent実行までの完全なフローを示します。
まず、ツールを定義する:@toolデコレータでPython関数をマークし——関数のdocstringがツールの説明で、LLMはいつ呼び出すかを決定するためにこの説明を読みます。関数自体はCoinGecko APIを呼び出してETHの実際の現在価格を取得し、フォーマットされた結果文字列を返します。
次に、Agentを初期化する:ツールリストとLLM(例:Claude Sonnet)をLangChainのAgentに渡し、最大イテレーション回数を設定し、AgentのロールをSystem Promptで定義します。
最後に、タスクを実行する:ユーザーが「ETHの現在価格はいくらですか?」と入力すると、AgentのThoughtステップが「get_eth_priceツールを呼び出す必要がある」と判断 → ツール呼び出しJSONを出力 → バックエンドがPython関数を実行 → 結果がLLMに返される → LLMが自然言語の応答を生成:「ETHの現在価格は$3,420.50です。」
この例はFunction Callingの完全なループを示しています:LLMは「何を呼び出すかを決定する」ことのみを担当し、バックエンドが「実際に実行」し、結果はLLMに返されて最終応答が生成されます。
Function Callingの核心的なトレードオフは「柔軟性 vs 予測可能性」です。LLMが自律的にいつツールを呼び出すかを決定することで、Agentが様々な予期しない状況に対処できますが、LLMがツールを呼び出すべきでないときに呼び出したり(例:概念説明の質問にはツールが不要ですが、LLMは依然として呼び出そうとする)、ツールを使うべきときに記憶から答えたりする可能性もあります(学習データの古くなった可能性のある数字を使用)。もう一つのトレードオフは「ツール数 vs 選択精度」:より多くのツールを提供するとAgentの能力が高まりますが、より多くのオプションから正しいツールを選択するLLMの精度が低下し、トークンも多く消費します。