AIエージェントとは何か

「AIエージェント」という言葉は2024〜2025年にかけて急速に広まったが、定義が曖昧なまま使われることが多い。本記事では「LLMが外部環境とやり取りしながら、複数ステップのタスクを自律的にこなすシステム」をAIエージェントと定義して話を進める。

単純なQ&Aシステムと何が違うかというと、エージェントは「行動→観察→次の行動」というループを持つ点だ。ウェブを検索し、結果を読み、次の検索クエリを立て、最終的に回答をまとめる——この一連の流れをLLM自身が制御する。

ReAct——思考と行動を交互に繰り返す

ReActは2022年にGoogle Brainが発表したフレームワークで、現在のほぼすべてのAIエージェント実装の基礎になっている。名前はReasoning(推論)とActing(行動)を合わせたものだ。

基本的なループはこうなっている。

  1. Thought(思考): LLMが現在の状況と次にすべきことを考える
  2. Action(行動): ツールを呼び出す(検索、計算、APIコールなど)
  3. Observation(観察): ツールの結果を受け取る
  4. 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ループから始め、複雑さは必要に応じて追加するのが定石だ。マルチエージェントは強力だが、デバッグが難しくなるのでシングルエージェントで解決できないか最初に検討した方がいい。