A
AIエージェントの仕組み
ch6-s1 · What is Agent

エージェントとは

約 12 分

この回のゴール

1. エージェントの定義

古典 AI(第 1 章)の定義

「エージェントとは、環境を認識し、目標達成のために行動する システム」

数式で書くと:

$$ \text{agent} : (\text{観測}1, \text{観測}_2, \ldots, \text{観測}_t) \to \text{行動}{t+1} $$

時間軸で「観測 → 行動 → 観測 → 行動 → ...」を繰り返す存在。

現代の AI エージェント

この定式の 「意思決定部分」を LLM にした もの:

     ┌─────────────────────────────────────────────────┐
     │                     LOOP                         │
     │                                                 │
  ┌─────┐    ツール呼び出し    ┌────────┐             │
  │ LLM  │────────────────────▶│ ツール  │             │
  │      │                    └────┬───┘             │
  │      │                         │  結果           │
  │      │◀────────────────────────┘                 │
  │      │    観測                                    │
  │      │                                            │
  └──┬──┘                                             │
     │                                                │
     │    「完了」と判断したら break                    │
     └────────────────────────────────────────────────┘
                      │
                      ▼
                   [最終回答]

2. 第 4 章との比較

第 4 章: 1 回で終わる tool_use

[質問] ─▶ [Claude] ─▶ [ツール] ─▶ [Claude] ─▶ [最終回答]
           1回目        結果       2回目

API 往復: 固定の 2 回。複雑なタスクはできない。

第 6 章: ループで続くエージェント

[質問] ─▶ [Claude] ─▶ [ツールA] ─▶ [Claude] ─▶ [ツールB] ─▶ ... ─▶ [最終回答]
           往復1       結果        往復2        結果

API 往復: Claude が決める。必要なだけツールを呼び続ける。自律性 がここの核。

3. なぜループが必要か

例: 「ネオテック社の有給制度を調べて、勤続 10 年の私が今年分を取得したらどれくらいの経済的価値?」

1 往復では無理:

  1. まず RAG で調べる 必要がある(勤続 5 年で 25 日、10 年も同じと判明)
  2. 次に 給与をツールで取得 しないと金額が計算できない
  3. 最後に calculator で日給 × 25 日 を計算

これが「複数ステップ」。Claude 自身がどの順でどのツールを使うかを計画・実行 します。

4. エージェントの 3 要素(古典 AI の語彙)

要素 現代エージェントでの正体
状態 (State) 会話履歴 + これまでのツール結果
行動 (Action) tool_use(ツール呼び出し)
観測 (Observation) tool_result(ツールの戻り値)

これは マルコフ決定過程 (MDP) の枠組みとほぼ同じです。ただし LLM エージェントは: - 状態遷移の明示モデル がない - 報酬関数 もない(目標は自然言語で曖昧) - 価値関数 もない(ヒューリスティクスは LLM の「判断」)

にも関わらず、自然言語の柔軟性 で広範なタスクが解けます。

5. 最小の自作エージェントループ

Claude API を使った最小エージェント:

def run_agent(user_question: str, tools, tool_impls, max_iter=10):
    messages = [{"role": "user", "content": user_question}]

    for _ in range(max_iter):
        response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            tools=tools,
            messages=messages,
        )

        # ツール呼び出しが無ければ終了
        if response.stop_reason == "end_turn":
            return response

        # ツールを実行
        tool_results = []
        for block in response.content:
            if block.type == "tool_use":
                result = tool_impls[block.name](**block.input)
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": str(result),
                })

        messages.append({"role": "assistant", "content": response.content})
        messages.append({"role": "user", "content": tool_results})

    return response  # max_iter 到達

たったこれだけ でエージェントは動きます。 実際の LangChain / LlamaIndex / Anthropic の tool_runner もこれの発展形です。


まとめ

この回の限界(次への動機)

ループは動くが、Claude が「何をなぜするか」を 明示しないと 浅い行動・誤選択が増える。 👉 次回「ReAct パターン」で、思考 (Thought) を明示させる方法を学びます。

参考文献

📝 理解度クイズ (3 問) 💡 ログインすると進捗が保存されます

💬 このサブステップの Q&A

まだ質問はありません。最初の質問を投稿してみましょう。

質問の投稿にはログインが必要です。