第6章 AIエージェント概論

更新日:2025年12月16日

本章では、AIエージェントの基礎概念について解説する。エージェントの定義と歴史、LLMを用いたエージェントの特徴、ReActパターン、Function Callingによるツール呼び出しの仕組みを学び、エージェント開発の基盤を理解する。

1. エージェントとは

AIエージェントは、与えられた目標を達成するために、環境を認識し、判断を下し、行動を実行する自律的なシステムである。単純なAPI呼び出しやRAGとは異なり、エージェントは複数のステップを動的に計画・実行し、フィードバックに基づいて行動を調整する能力を持つ。

1.1 定義と歴史

エージェントの概念は、人工知能研究の初期から存在していた。1990年代には、ルールベースのエキスパートシステムや強化学習エージェントが研究されていた。LLMの登場により、自然言語による指示理解、推論、計画立案が可能になり、より柔軟で汎用的なエージェントの構築が可能になった。

Table 1. エージェントの進化

世代 特徴
第1世代 ルールベース エキスパートシステム
第2世代 機械学習ベース 強化学習エージェント
第3世代 LLMベース ReActエージェント、AutoGPT

1.2 LLMエージェント

LLMエージェントは、LLMを「頭脳」として使用し、自然言語で推論・計画を行うエージェントである。従来のエージェントとの最大の違いは、タスクの解釈と計画立案を自然言語で行える点にある。

Fig 1. LLMエージェントの基本構造

┌─────────────────────────────────────┐
│           LLMエージェント            │
├─────────────────────────────────────┤
│  ┌─────────┐                        │
│  │   LLM   │ ← 推論・計画・判断     │
│  └────┬────┘                        │
│       │                             │
│  ┌────▼────┐  ┌──────────┐         │
│  │  Memory │  │  Tools   │         │
│  └─────────┘  └──────────┘         │
│   状態保持      外部機能             │
└─────────────────────────────────────┘

LLMエージェントの主要な構成要素は、LLM(推論エンジン)、Memory(状態・履歴の保持)、Tools(外部機能へのアクセス)の3つである。これらを組み合わせることで、複雑なタスクを自律的に遂行できる。

2. ReActパターン

ReAct(Reasoning and Acting)は、LLMエージェントの基本的な動作パターンである。2022年にGoogle Researchが提案したこの手法は、「推論」と「行動」を交互に行うことで、複雑なタスクを段階的に解決する。

Fig 2. ReActの思考プロセス

ユーザー: 「東京の今日の天気と、傘が必要か教えて」

Thought 1: 東京の天気を調べる必要がある
Action 1: search_weather(location="東京")
Observation 1: 晴れ、降水確率10%

Thought 2: 降水確率が低いので傘は不要だと判断できる
Action 2: final_answer("東京は晴れで降水確率10%です。傘は必要ないでしょう。")
Observation 2: [完了]

ReActパターンでは、LLMが「Thought(思考)」で次のアクションを推論し、「Action(行動)」でツールを呼び出し、「Observation(観察)」で結果を受け取るというサイクルを繰り返す。このプロセスは、目標が達成されるまで続く。

Table 2. ReActの各フェーズ

フェーズ 役割 内容
Thought 推論 現状の分析、次の行動の計画
Action 実行 ツールの呼び出し、パラメータの指定
Observation 観察 ツールの実行結果の取得

3. ツール呼び出し

ツール呼び出しは、LLMが外部の機能やAPIを使用するための仕組みである。LLM自体は計算やデータベースアクセス、Web検索などを行えないが、ツールを通じてこれらの能力を獲得できる。

3.1 Function Calling

Function Callingは、OpenAIが導入したLLMからの関数呼び出し機能である。LLMは、利用可能な関数の定義(名前、説明、パラメータスキーマ)を受け取り、ユーザーの入力に基づいて適切な関数と引数を選択する。

Fig 3. Function Callingの流れ

1. 関数定義をLLMに提供
   tools = [{"name": "get_weather", "parameters": {...}}]

2. ユーザー入力
   "東京の天気は?"

3. LLMが関数呼び出しを決定
   function_call: {"name": "get_weather", "arguments": {"location": "東京"}}

4. アプリケーションが関数を実行
   result = get_weather("東京")  # "晴れ、25度"

5. 結果をLLMに返却
   
6. LLMが最終回答を生成
   "東京は現在晴れで、気温は25度です。"

Fig 4. OpenAI APIでのFunction Calling

from openai import OpenAI

client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "指定された場所の現在の天気を取得する",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "都市名(例: 東京、大阪)"
                    }
                },
                "required": ["location"]
            }
        }
    }
]

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "東京の天気を教えて"}],
    tools=tools,
    tool_choice="auto"
)

3.2 Tool定義

LangChainでは、@toolデコレータを使用してToolを定義する。docstringとタイプヒントから自動的に関数のスキーマが生成される。

Fig 5. LangChainでのTool定義

from langchain_core.tools import tool
from typing import Optional

@tool
def search_web(query: str, num_results: int = 5) -> str:
    """Web検索を実行して結果を返す。
    
    Args:
        query: 検索クエリ
        num_results: 取得する結果の数(デフォルト: 5)
        
    Returns:
        検索結果のテキスト
    """
    # 実際の検索処理
    return f"'{query}'の検索結果: ..."

@tool
def calculate(expression: str) -> str:
    """数式を計算して結果を返す。
    
    Args:
        expression: 計算する数式(例: "2 + 3 * 4")
        
    Returns:
        計算結果
    """
    try:
        result = eval(expression)  # 本番では安全な評価器を使用
        return str(result)
    except Exception as e:
        return f"エラー: {e}"

# Toolの情報確認
print(search_web.name)        # "search_web"
print(search_web.description) # docstringから生成
print(search_web.args_schema.schema())  # JSONスキーマ

Table 3. Tool定義のベストプラクティス

項目 推奨
関数名 動詞_名詞形式(search_web、calculate)
docstring LLMが判断できる明確な説明
パラメータ 型ヒントと説明を必ず付与
戻り値 文字列で返す(LLMが処理しやすい)
エラー処理 例外をキャッチしてエラーメッセージを返す

4. エージェントの課題

LLMエージェントは強力だが、いくつかの課題がある。これらを理解し、適切に対処することが実用的なエージェント開発には不可欠である。

Table 4. LLMエージェントの主な課題

課題 説明 対策
ループ 同じ行動を繰り返す 最大ステップ数制限、履歴チェック
幻覚 存在しないツールを呼び出す ツール選択の検証
コスト 多数のAPI呼び出し キャッシュ、安価なモデルの併用
レイテンシ 複数ステップで遅延蓄積 並列実行、ストリーミング
安全性 意図しない操作の実行 承認フロー、サンドボックス

特に本番環境では、エージェントの行動を監視・制御する仕組みが重要である。LangGraphでは、Human-in-the-loop(人間による承認)や条件付き実行などの制御機構を組み込むことができる。次章では、LangGraphを使用したより高度なエージェント構築について解説する。

参考・免責事項
本コンテンツは2025年12月時点の情報に基づいて作成されています。エージェントの安全な運用には十分な検証とモニタリングが必要です。