この回のゴール
- 「AI エージェント」の定義を、自律ループという観点から理解する
- 第 4 章の tool_use(1 往復) と 何が違うか を体感する
- 状態・行動・観測 というエージェントの 3 要素を掴む
- なぜ「エージェント」という言葉が現代でバズっているのかを自分の言葉で説明できる
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 往復では無理:
- まず RAG で調べる 必要がある(勤続 5 年で 25 日、10 年も同じと判明)
- 次に 給与をツールで取得 しないと金額が計算できない
- 最後に 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 もこれの発展形です。
まとめ
- AI エージェント = 「LLM がツールを使って 自律的にループ」する系
- 第 4 章 (1 往復 tool_use) との違いは 継続的に判断を続けるか
- 3 要素: 状態 (会話履歴+結果) / 行動 (tool_use) / 観測 (tool_result)
- 最小実装は 数十行の Python ループ だけで成立
この回の限界(次への動機)
ループは動くが、Claude が「何をなぜするか」を 明示しないと 浅い行動・誤選択が増える。 👉 次回「ReAct パターン」で、思考 (Thought) を明示させる方法を学びます。
参考文献
- Russell & Norvig AIMA Ch.2 Intelligent Agents
- Anthropic Blog: Building effective agents