AIエージェントとは何か
「AIエージェント」という言葉は2024〜2025年にかけて急速に広まったが、定義が曖昧なまま使われることが多い。本記事では「LLMが外部環境とやり取りしながら、複数ステップのタスクを自律的にこなすシステム」をAIエージェントと定義して話を進める。
単純なQ&Aシステムと何が違うかというと、エージェントは「行動→観察→次の行動」というループを持つ点だ。ウェブを検索し、結果を読み、次の検索クエリを立て、最終的に回答をまとめる——この一連の流れをLLM自身が制御する。
ReAct——思考と行動を交互に繰り返す
ReActは2022年にGoogle Brainが発表したフレームワークで、現在のほぼすべてのAIエージェント実装の基礎になっている。名前はReasoning(推論)とActing(行動)を合わせたものだ。
基本的なループはこうなっている。
- Thought(思考): LLMが現在の状況と次にすべきことを考える
- Action(行動): ツールを呼び出す(検索、計算、APIコールなど)
- Observation(観察): ツールの結果を受け取る
- Thought(思考): 結果を踏まえて次の行動を決める
このループをタスクが完了するまで繰り返す。プロンプトに「まず考えてから行動せよ」と指示するだけで、ReActに近い挙動を引き出せることが多い。
from anthropic import Anthropic
client = Anthropic()
tools = [
{
"name": "web_search",
"description": "ウェブを検索して最新情報を取得する",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "検索クエリ"}
},
"required": ["query"]
}
}
]
def run_agent(task):
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=4096,
tools=tools,
messages=messages
)
if response.stop_reason == "end_turn":
return response.content[0].text
# ツール呼び出しを処理してループを継続
tool_results = execute_tools(response)
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": tool_results})
Toolformer——ツール呼び出しをモデル自身に学習させる
Metaが2023年に発表したToolformerは、ReActとは別のアプローチをとる。事前学習データにツール呼び出しのサンプルを組み込み、モデル自体がいつ・どのツールを使うかを学習する。
ReActがプロンプトエンジニアリングでツール使用を誘導するのに対し、Toolformerはモデルの重みにその能力を焼き込む。「計算はPythonに任せる」「日付は専用ツールで取る」という判断をモデルが自然に行うようになる。
Toolformerの考え方はその後、GPT-4のCode Interpreterやfunction callingの設計に大きな影響を与えた。現在のClaude・GPT-4・Geminiはいずれもツール呼び出しを組み込みの能力として持っており、ある意味Toolformerの発展形と言える。
Function Calling / Tool Use の仕様
AnthropicのTool UseとOpenAIのFunction Callingは、仕様上かなり似ている。どちらもツールの定義をJSONスキーマで渡し、モデルがツールを呼び出すべきだと判断したときにJSONレスポンスを返す形式だ。
重要なのは「モデルがツールを実行するわけではない」という点だ。モデルは「このツールをこの引数で呼び出せ」という指示を返すだけで、実際の実行は呼び出し側のコードが担う。モデルはサンドボックスの外に出ない。
# Claudeのtool_useブロックを処理する例
for block in response.content:
if block.type == "tool_use":
tool_name = block.name
tool_input = block.input
if tool_name == "web_search":
result = search_web(tool_input["query"])
elif tool_name == "read_file":
result = open(tool_input["path"]).read()
# 結果をモデルに返す
tool_result = {
"type": "tool_result",
"tool_use_id": block.id,
"content": result
}
MCP(Model Context Protocol)の仕組み
Anthropicが2024年末にオープンソースとして公開したMCP(Model Context Protocol)は、ツール統合の標準規格を定めようとする試みだ。詳細は別記事で解説するが、ここではエージェントアーキテクチャの観点から位置付けを整理する。
MCP以前は、各AIアプリケーションが独自のツール統合を実装していた。Claude CodeにGitHub連携を追加したければClaude Code用のコードを書き、同じ機能をCursorに追加したければCursor用のコードを書く必要があった。
MCPはこの重複をなくす。MCPサーバーとして一度実装すれば、MCPに対応したどのクライアントからでも使える。ツール開発者にとっては一度書けばいい、AIアプリ開発者にとっては既存のMCPサーバーを接続するだけという状況を作る。
Claude Codeのエージェント動作
Claude Codeはどのようにエージェントとして動いているか。公開情報から読み取れる範囲で整理する。
Claude Codeはファイル読み書き、シェルコマンド実行、ウェブ検索などのツールをClaude 3.5/3.7 Sonnetに渡している。ユーザーから「このバグを直して」という指示を受けると、まず関連ファイルを読み込み、問題を特定し、修正を加え、テストを実行し、結果を確認するというループを自律的に回す。
「CLAUDE.md」はこのエージェントのコンテキストとして機能する。プロジェクトの慣習、使ってよいコマンド、避けるべきパターンなどをここに書いておくと、モデルがタスクをこなす際の判断基準になる。
また、Claude Codeは実行前に「これをやっていいか」と確認するパターンを持つ。破壊的な操作(ファイル削除、git reset等)は自動実行せず、ユーザーの承認を求める。これはReActのObservationフェーズの前に人間の判断を挟む「Human-in-the-loop」の実装と見ることができる。
マルチエージェントシステムの設計パターン
単一エージェントでは限界があるタスクに対して、複数エージェントを組み合わせるアプローチが広まっている。
「Orchestrator-Worker」パターンは最もシンプルだ。オーケストレーターがタスクを分解し、各ワーカーエージェントにサブタスクを割り当て、結果を統合する。Claude Codeがサブエージェントを起動してタスクを並列処理させるのはこのパターンだ。
「Peer Review」パターンでは、あるエージェントが生成したアウトプットを別のエージェントがレビューする。コードのバグ検出や文章の品質チェックに使われる。
「Debate」パターンでは、複数のエージェントが互いに意見を出し合い、最終的に合意に至る形で答えを収束させる。単一モデルの偏りを減らす効果がある。
現時点での限界
AIエージェントは急速に実用化が進んでいるが、まだいくつかの根本的な限界がある。
ループが止まらない問題がある。タスクが完了したかどうかをモデルが正確に判断できず、無限ループや過剰な行動を取ることがある。最大ステップ数の制限や、外部からの停止機構が必要だ。
コンテキスト汚染も課題だ。長いエージェントセッションでは、過去の観察結果がコンテキストを埋め尽くし、判断の精度が落ちる。重要な情報を要約して引き継ぐ仕組みが必要になる。
エラーの連鎖も起きやすい。途中のツール呼び出しで想定外の結果が返ると、その後の判断が全て狂う可能性がある。チェックポイントを設けてリトライできる設計が重要だ。
まとめ
AIエージェントのアーキテクチャはReActという基礎の上に、Function Calling、MCPなどの標準化された仕組みが積み重なって現在の形に至っている。Claude Codeのような実用ツールは、これらの設計思想の産物だ。
自前でエージェントシステムを構築する場合は、まずシンプルなReActループから始め、複雑さは必要に応じて追加するのが定石だ。マルチエージェントは強力だが、デバッグが難しくなるのでシングルエージェントで解決できないか最初に検討した方がいい。