Chuyển đến nội dung chính

レッスン 12: AI エージェントの基礎 — 概念とアーキテクチャ

AIエージェントとは何ですか?エージェント対チャットボット対パイプライン。核となる要素: 認識、推論、行動。エージェント アーキテクチャ: ReAct、計画と実行、リフレクション。エージェントループ、状態管理。 AI エージェントの分類。現実世界の使用例。

ChatGPT に質問すると、ChatGPT が答えます。 AI エージェントに質問すると、AI エージェントは計画を立て、5 つの異なるツールを呼び出し、自己修正して、完全な結果を提供します。 チャットボットは反応的であり、ユーザーの質問を待ってから回答します。エージェントは積極的です。エージェントは自ら考え、自ら行動し、自ら結果を評価します。この違いが、2024 年から 2025 年が、Devin (コーディング エージェント) から AutoGPT、そしてカスタマー サポート、データ分析、DevOps 用のエージェントを構築する一連のスタートアップに至るまで、AI エージェントのブームの年となる理由です。この記事では、AI エージェント とは何か**、アーキテクチャがどのように機能するか、一般的なデザイン パターンについて最初から説明し、最後にミニ エージェントを最初からコーディングして、各コンポーネントを深く理解できるようにします。


1. AIエージェントとは何ですか?

###1.1.定義

AI エージェント (自律エージェント) は、LLM を「頭脳」として使用し、環境を自動的に認識し、目標について推論し、タスクを完了するために行動 (行動する) ことを目的の結果が達成されるまで繰り返し行うソフトウェア システムです。

コアフォーミュラ:

Agent = LLM  +  Tools  +  Memory  +  Goal  +  Loop
         │         │         │         │         │
    Brain/       Hands     Brain      Why       How
    Reasoning    (APIs,    (history,  (task     (iterate
    Engine       code,     context)   to do)    until done)
                 search)

###1.2.知覚→推論→行動のループ

すべての AI エージェントは次の基本的なループに従います。

┌──────────────────────────────────────────────────────────────────┐
│                    THE AGENT LOOP                                 │
├──────────────────────────────────────────────────────────────────┤
│                                                                   │
│     ┌───────────┐                                                │
│     │   USER    │                                                │
│     │   GOAL    │                                                │
│     └─────┬─────┘                                                │
│           │                                                       │
│           ▼                                                       │
│     ┌───────────┐     ┌───────────┐     ┌───────────┐           │
│     │ PERCEIVE  │────→│  REASON   │────→│   ACT     │           │
│     │           │     │           │     │           │           │
│     │ • User msg│     │ • Analyze │     │ • Call API│           │
│     │ • Tool    │     │ • Plan    │     │ • Run code│           │
│     │   output  │     │ • Decide  │     │ • Search  │           │
│     │ • Error   │     │   next    │     │ • Write   │           │
│     │   info    │     │   step    │     │   file    │           │
│     └───────────┘     └───────────┘     └─────┬─────┘           │
│           ▲                                     │                 │
│           │           ┌───────────┐             │                 │
│           │           │  MEMORY   │             │                 │
│           │           │           │             │                 │
│           │           │ • History │             │                 │
│           │           │ • Context │             │                 │
│           │           │ • State   │             │                 │
│           │           └───────────┘             │                 │
│           │                                     │                 │
│           └─────────────────────────────────────┘                │
│                   (loop until goal achieved                       │
│                    or max iterations reached)                     │
│                                                                   │
└──────────────────────────────────────────────────────────────────┘

###1.3.実際の例

あなたはエージェントに次のように伝えます: 「最も人気のある AI エージェント構築フレームワークの上位 5 つを見つけて比較し、Markdown レポートを作成します。」

エージェントは次のことを行います:

  1. 認識: タスクを理解する - 調査、比較、レポートの作成が必要
  2. 理由: 計画を立てる — ステップ 1 ウェブで検索、ステップ 2 比較、ステップ 3 書く
  3. 行為: Web 検索ツールを呼び出す → 上位 5 つのフレームワークを取得する
  4. 認識: 検索結果を読む → LangGraph、CrewAI、AutoGen、LlamaIndex、Semantic Kernel を参照
  5. 理由: 基準に従って比較する必要がある: 使いやすさ、マルチエージェント、実稼働対応
  6. 行為: 各フレームワークの詳細を確認 → 比較表を作成
  7. 理由: データは十分なので、最終レポートを作成します
  8. 行為: 完全なマークダウン レポートを出力します。

注意: 人間が途中で介入する時間はありません。エージェントは、実行するステップの数、どのツールを呼び出すか、いつ停止するかを決定します。これが自律性です。


2. エージェント vs チャットボット vs パイプライン vs ワークフロー

###2.1.比較表

特長チャットボットパイプラインワークフローAIエージェント
自律性❌ リアクティブ — ユーザーを待ちます❌ 固定シーケンス⚠️ 条件分岐✅ 自己志向型
意思決定最小限なしルールベースLLM 搭載
ツールの使用❌ いいえ❌ ハードコードされたステップ⚠️ 定義済みツール✅ 動的なツール選択
計画中❌ いいえ❌ いいえ⚠️ 事前定義されたフロー✅ LLM が計画を生成
エラー回復❌ ユーザーの再試行❌ 失敗して停止⚠️ フォールバック パス✅ 自己修正
メモリセッションのみなしなし短期 + 長期
マルチステップ❌ シングルターン✅ 修正された手順✅ 固定ブランチ✅ ダイナミックなステップ
例ChatGPT、ジェミニETL、CI/CDn8n、Zapier、エアフローDevin、AutoGPT、カーソル

###2.2.アーキテクチャの比較

CHATBOT:                    PIPELINE:
┌─────────┐                 ┌──────┐ ┌──────┐ ┌──────┐
│  User   │                 │Step 1│→│Step 2│→│Step 3│
│    ↓    │                 └──────┘ └──────┘ └──────┘
│  LLM    │                 (fixed order, no branching)
│    ↓    │
│ Response│
└─────────┘
(single turn, no tools)

WORKFLOW:                   AI AGENT:
┌──────┐                    ┌──────────────────────────┐
│Start │                    │ Goal: "Analyze Q3 data"  │
│  ↓   │                    │         ↓                │
│ ◇────┤                    │  ┌──── Plan ────┐        │
│ │ IF │→ Path A            │  │1. Load data  │        │
│ │ELSE│→ Path B            │  │2. Clean      │        │
│ └────┘                    │  │3. Analyze    │        │
│  ...  │                    │  │4. Viz + report│       │
│ End   │                    │  └──────────────┘        │
└──────┘                    │    ↓↑ (loop, retry,      │
(predefined branches)       │     self-correct)         │
                            └──────────────────────────┘
                            (dynamic, autonomous)

###2.3.いつ何を使うのか?

Task đơn giản, Q&A ──────────────────→ Chatbot
Task fixed steps, data processing ───→ Pipeline
Task conditional, business logic ────→ Workflow (n8n, Airflow)
Task complex, cần reasoning + tools ─→ AI Agent

ヒント: 多くの実稼働システムはハイブリッド アプローチ、つまり高レベルでのワークフロー オーケストレーション (たとえば、Airflow は毎日のジョブをスケジュールします) を使用しており、各ノードは複雑なタスクを処理する AI エージェントです。すべてにエージェントを使用しないでください。単純なタスクには単純なツールを使用する必要があります。


3. AI エージェントのコアコンポーネント

###3.1.アーキテクチャの概要

┌──────────────────────────────────────────────────────────────────────┐
│                       AI AGENT ARCHITECTURE                           │
├──────────────────────────────────────────────────────────────────────┤
│                                                                       │
│  ┌──────────────────────────────────────────────────────────────┐    │
│  │                     🧠 BRAIN (LLM)                           │    │
│  │                                                               │    │
│  │  ┌──────────┐  ┌───────────────┐  ┌───────────────────┐     │    │
│  │  │ Reasoning│  │   Planning    │  │  Decision-Making  │     │    │
│  │  │ (CoT,    │  │ (decompose   │  │  (which tool?     │     │    │
│  │  │  ReAct)  │  │  into steps) │  │   stop or cont?)  │     │    │
│  │  └──────────┘  └───────────────┘  └───────────────────┘     │    │
│  └──────────────────────────────────────────────────────────────┘    │
│       ▲           │           │           │           ▲              │
│       │           │           │           │           │              │
│  ┌────┴───┐  ┌────▼───┐  ┌───▼────┐  ┌───▼────┐  ┌──┴──────┐     │
│  │PERCEP- │  │ TOOLS  │  │ TOOLS  │  │ TOOLS  │  │ MEMORY  │     │
│  │TION    │  │        │  │        │  │        │  │         │     │
│  │        │  │ Web    │  │ Code   │  │ File   │  │ Short-  │     │
│  │ Input  │  │ Search │  │ Exec   │  │ System │  │ term    │     │
│  │ Parser │  │        │  │        │  │        │  │         │     │
│  │        │  │ API    │  │ DB     │  │ Browser│  │ Long-   │     │
│  │ User   │  │ Calls  │  │ Query  │  │ Control│  │ term    │     │
│  │ Intent │  │        │  │        │  │        │  │         │     │
│  └────────┘  └────────┘  └────────┘  └────────┘  │ Vector  │     │
│                                                    │ Store   │     │
│                                                    └─────────┘     │
│                                                                       │
└──────────────────────────────────────────────────────────────────────┘

###3.2.要素 1: 認識

知覚とは、エージェントが周囲の世界をどのように「見る」か、つまり入力を受け取り、ツールの結果を解析し、エラー メッセージを読み取る方法です。

入力タイプ説明例
ユーザーメッセージ最初の質問/リクエスト"main.py ファイル内のバグを見つける"
ツールの出力ツール呼び出しの結果API からの JSON 応答
エラー/例外実行エラーFileNotFoundError: main.py
環境の状態コンテキスト情報現在のディレクトリ、OS、時刻
人間のフィードバック中間ループ応答「いいえ、JS ではなく Python が必要です」

###3.3.コンポーネント 2: 頭脳/推論 (LLM)

LLM は「頭脳」であり、最も重要なコンポーネントです。これは 3 つの主なタスクを実行します。

a) 推論:

  • 問題の理解、情報の分析
  • 思考の連鎖: 決定する前に段階的に考える
  • 何が足りないのかを判断 → どのツールを呼び出すか

b) 計画:

  • 大きなタスクを小さなサブタスクに分解する
  • 実行順序を決定する
  • 各ステップの結果を予測する

c) 意思決定:

  • 次のステップに最適なツールを選択します
  • ツールを使用するか直接回答するかを決定します
  • ループを停止するか続行するかを決定します
LLM Reasoning Process:
─────────────────────

User: "Tìm giá Bitcoin hôm nay và so sánh với tuần trước"

LLM Thinking:
  1. Cần giá BTC hiện tại → gọi tool: get_crypto_price("BTC")
  2. Cần giá BTC 7 ngày trước → gọi tool: get_crypto_price("BTC", days_ago=7)
  3. Khi có cả 2 giá → tính % thay đổi
  4. Format kết quả → trả về user

Decision: Gọi tool get_crypto_price trước

###3.4.コンポーネント 3: アクション

アクションはエージェントの「手」であり、ツールを通じて意思決定を実行します。

ツールカテゴリ例機能
ウェブ検索Google、Bing、Tavilyリアルタイム情報を見つける
コードの実行Python REPL、サンドボックスコードを実行し、計算します。
API 呼び出しREST、グラフQL外部サービスと通信する
ファイル システムファイルの読み取り/書き込みファイルとフォルダーの操作
データベースSQL クエリデータのクエリ、挿入、更新
ブラウザ劇作家、セレンWebスクレイピング、自動化
コミュニケーションメール、スラック通知、メッセージを送信する

###3.5。コンポーネント 4: メモリ

記憶は、エージェントがステップやセッション全体のコンテキストを記憶するのに役立ちます。

┌──────────────────────────────────────────────────────────┐
│                    AGENT MEMORY TYPES                      │
├──────────────────────────────────────────────────────────┤
│                                                           │
│  SHORT-TERM MEMORY (Working Memory)                       │
│  ┌─────────────────────────────────────────────────┐     │
│  │ • Conversation history (current session)         │     │
│  │ • Tool call results (this loop iteration)        │     │
│  │ • Current plan/state                             │     │
│  │ → Stored in: LLM context window                  │     │
│  │ → Lifetime: single conversation                  │     │
│  └─────────────────────────────────────────────────┘     │
│                                                           │
│  LONG-TERM MEMORY (Persistent Memory)                     │
│  ┌─────────────────────────────────────────────────┐     │
│  │ • User preferences learned over time             │     │
│  │ • Past task summaries                            │     │
│  │ • Knowledge base (RAG)                           │     │
│  │ → Stored in: Vector DB, external DB              │     │
│  │ → Lifetime: across conversations                 │     │
│  └─────────────────────────────────────────────────┘     │
│                                                           │
│  EPISODIC MEMORY (Experience)                             │
│  ┌─────────────────────────────────────────────────┐     │
│  │ • Previous successful strategies                 │     │
│  │ • Mistakes and corrections                       │     │
│  │ • Solution patterns for similar tasks            │     │
│  │ → Stored in: Vector DB with metadata             │     │
│  │ → Lifetime: permanent, growing                   │     │
│  └─────────────────────────────────────────────────┘     │
│                                                           │
└──────────────────────────────────────────────────────────┘

ヒント: 短期記憶は、LLM のコンテキスト ウィンドウによって制限されます (GPT-4o の場合は 128K トークン、Claude 3.5 の場合は 200K トークン)。会話が長すぎる場合は、要約するか切り捨てる必要があります。これは、実稼働エージェントを構築する際の最大の課題の 1 つです。


4. エージェントのアーキテクチャ

これは最も重要な部分です。エージェントのアーキテクチャを理解することは、システムを適切に設計するのに役立ちます。

###4.1. ReAct (推論 + 行動)

ReAct (Yao et al., 2022) は現在最も人気のあるパターンです。アイデア: LLM は Thought (思考) と Action (行動) を交互に繰り返し、次に進む前に結果を 観察します。

┌────────────────────────────────────────────────────────┐
│                    ReAct PATTERN                        │
├────────────────────────────────────────────────────────┤
│                                                         │
│  Question: "Ai là CEO của công ty tạo ra iPhone,       │
│             và người đó sinh năm bao nhiêu?"            │
│                                                         │
│  ┌──────────────────────────────────────────┐          │
│  │ Thought 1: Tôi cần tìm công ty tạo iPhone│          │
│  │ Action 1:  search("company created iPhone")│         │
│  │ Observation 1: Apple Inc.                  │          │
│  └──────────────────────────────────────────┘          │
│                    │                                    │
│                    ▼                                    │
│  ┌──────────────────────────────────────────┐          │
│  │ Thought 2: Apple → CEO hiện tại là Tim Cook│        │
│  │ Action 2:  search("Tim Cook birth year")   │        │
│  │ Observation 2: 1960                         │        │
│  └──────────────────────────────────────────┘          │
│                    │                                    │
│                    ▼                                    │
│  ┌──────────────────────────────────────────┐          │
│  │ Thought 3: Đã đủ info → trả lời          │          │
│  │ Final Answer: Tim Cook, CEO Apple,        │          │
│  │              sinh năm 1960                │          │
│  └──────────────────────────────────────────┘          │
│                                                         │
│  Loop: Thought → Action → Observation → Thought → ...   │
│  Stop: Khi đủ info để trả lời (Final Answer)           │
│                                                         │
└────────────────────────────────────────────────────────┘

利点:

  • シンプルで実装が簡単
  • 解釈可能 — 推論の痕跡を読み取ることができます
  • 関数呼び出しAPIとの良好な互換性
  • 最も人気があり、多くのフレームワークをサポート

短所:

  • 貪欲 — 全体像ではなく、段階的に決定します
  • 初期段階で間違った方向に進むと行き詰まりやすい
  • バックトラックメカニズムなし

###4.2.計画と実行

計画と実行 (Wang et al., 2023) では、計画と実行を 2 つのフェーズに分けています。

┌─────────────────────────────────────────────────────────┐
│              PLAN-AND-EXECUTE ARCHITECTURE                │
├─────────────────────────────────────────────────────────┤
│                                                          │
│  ┌─────────────────────────────────────────────┐        │
│  │              PLANNER (LLM)                   │        │
│  │                                              │        │
│  │  Input: "Build a sentiment analysis API"     │        │
│  │                                              │        │
│  │  Plan:                                       │        │
│  │   Step 1: Choose sentiment model (BERT/RoBERTa)│      │
│  │   Step 2: Write inference function            │        │
│  │   Step 3: Create FastAPI endpoint             │        │
│  │   Step 4: Add error handling + validation     │        │
│  │   Step 5: Write tests                         │        │
│  │   Step 6: Create Dockerfile                   │        │
│  └────────────────────┬────────────────────────┘        │
│                       │                                  │
│                       ▼                                  │
│  ┌─────────────────────────────────────────────┐        │
│  │            EXECUTOR (Agent + Tools)           │        │
│  │                                              │        │
│  │  Step 1 → [code_exec] → model selected ✓    │        │
│  │  Step 2 → [write_file] → inference.py ✓     │        │
│  │  Step 3 → [write_file] → main.py ✓          │        │
│  │  Step 4 → [edit_file] → error handling ✓    │        │
│  │  Step 5 → [code_exec] → tests pass ✓       │        │
│  │  Step 6 → [write_file] → Dockerfile ✓      │        │
│  └────────────────────┬────────────────────────┘        │
│                       │                                  │
│                       ▼                                  │
│  ┌─────────────────────────────────────────────┐        │
│  │           RE-PLANNER (optional)               │        │
│  │  If step fails → adjust remaining plan        │        │
│  │  If new info → add/remove steps               │        │
│  └─────────────────────────────────────────────┘        │
│                                                          │
└─────────────────────────────────────────────────────────┘

利点:

  • アクションを実行する前にタスクの概要を確認してください
  • 複雑な複数ステップのタスクに効果的
  • 問題が発生した場合に再計画できる

短所:

  • タスクが明確でない場合、最初の計画が間違っている可能性があります
  • 単純なタスクのオーバーヘッド (不必要な計画)
  • 再計画によりレイテンシが追加される

###4.3.リフレクション (自己批判ループ)

Reflexion (Shinn et al., 2023) は、自己評価の機能を追加します。エージェントはタスクを実行し、結果を批評し、結果が良くない場合は再試行します。

┌─────────────────────────────────────────────────────────┐
│                REFLEXION ARCHITECTURE                     │
├─────────────────────────────────────────────────────────┤
│                                                          │
│  ┌──────────┐                                           │
│  │  Task:   │                                           │
│  │ "Write   │                                           │
│  │  sort    │                                           │
│  │  algo"   │                                           │
│  └────┬─────┘                                           │
│       │                                                  │
│       ▼                                                  │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐          │
│  │  ACTOR   │───→│EVALUATOR │───→│REFLECTOR │          │
│  │          │    │          │    │          │          │
│  │ Generate │    │ Run tests│    │ "My sort │          │
│  │ solution │    │ Check    │    │  fails on│          │
│  │          │    │ result   │    │  negative│          │
│  │          │    │          │    │  nums"   │          │
│  └──────────┘    └──────────┘    └────┬─────┘          │
│       ▲                               │                  │
│       │         ┌──────────┐          │                  │
│       │         │ MEMORY   │          │                  │
│       └─────────│          │←─────────┘                  │
│                 │ Store    │                              │
│                 │ learnings│  "Need to handle             │
│                 │ from     │   negative numbers.          │
│                 │ failures │   Use abs() comparison"      │
│                 └──────────┘                              │
│                                                          │
│  Loop: Act → Evaluate → Reflect → Remember → Retry       │
│  Stop: Tests pass OR max_retries reached                  │
│                                                          │
└─────────────────────────────────────────────────────────┘

利点:

  • 挑戦するたびに自己改善
  • 間違いから学びましょう — 同じ間違いを繰り返さないでください
  • コーディングタスク (テスト主導) に特に適しています

短所:

  • 多数の LLM 呼び出し → トークン + レイテンシのコストがかかる
  • 明確な評価関数が必要
  • タスクが難しすぎる場合は無限ループすることができます

###4.4. LATS (言語エージェント ツリー検索)

LATS (Zhou et al., 2023) は、木探索 (AlphaGo のモンテカルロ木探索のような) と LLM エージェントを組み合わせています。

┌──────────────────────────────────────────────────────────┐
│                 LATS ARCHITECTURE                          │
├──────────────────────────────────────────────────────────┤
│                                                           │
│  Root: "Debug this API returning 500 error"               │
│                    │                                      │
│         ┌──────────┼──────────┐                          │
│         ▼          ▼          ▼                           │
│    ┌─────────┐ ┌─────────┐ ┌─────────┐                  │
│    │ Path A  │ │ Path B  │ │ Path C  │                  │
│    │ Check   │ │ Check   │ │ Check   │                  │
│    │ logs    │ │ DB conn │ │ API     │                  │
│    │ Score:7 │ │ Score:4 │ │ schema  │                  │
│    └────┬────┘ └─────────┘ │ Score:8 │                  │
│         │                   └────┬────┘                  │
│         │                        │                        │
│    ┌────┴────┐             ┌────┴────┐                   │
│    │ Path A1 │             │ Path C1 │  ← expand best    │
│    │ Found   │             │ Schema  │                   │
│    │ timeout │             │ mismatch│                   │
│    │ error   │             │ found!  │                   │
│    │ Score:6 │             │ Score:9 │ ← SOLUTION ✓      │
│    └─────────┘             └─────────┘                   │
│                                                           │
│  Strategy: Explore multiple paths → score each            │
│           → expand best → backtrack if needed             │
│                                                           │
└──────────────────────────────────────────────────────────┘

利点:

  • 複数の解決策を同時に検討
  • 後戻りできます - 行き詰ることはありません
  • 複雑な推論のための最高品質

短所:

  • 計算量が非常に多い (パスごとに多くの LLM 呼び出しが必要)
  • 複雑な実装
  • 単純なタスクには過剰な作業

###4.5。 4 つのアーキテクチャを比較する

基準反応する計画と実行反射ラッツ
複雑さ⭐低⭐⭐中⭐⭐中⭐⭐⭐高い
品質良い良い-素晴らしいすばらしい素晴らしい
レイテンシ速い中遅いとても遅い
トークンコスト低い中高非常に高い
エラー回復❌ なし⚠️ 再計画✅ 自己修正✅ バックトラック
解釈可能性✅ 高✅ 高✅ 高⚠️中
こんな用途に最適簡単なQ&A、検索複数ステップのプロジェクト遺伝子コード、書き込み複雑な推論
フレームワークLangChain、ほとんどランググラフカスタムカスタム

ヒント: 多くの場合、本番環境は ReAct (シンプルで高速) から始まり、複雑なタスクを処理する必要がある場合は 計画と実行 に進みます。 Reflexion と LATS は、速度よりも品質が重要な場合に、一か八かのタスク (コーディング、リサーチ) に使用されます。


5. エージェント ループの詳細

###5.1.擬似コードのループ

from typing import Literal

def agent_loop(
    goal: str,
    tools: dict,
    llm,
    max_iterations: int = 10,
) -> str:
    """Simplified agent loop — core pattern mọi framework đều follow."""
    
    # Initialize state
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": goal},
    ]
    iteration = 0
    
    while iteration < max_iterations:
        iteration += 1
        print(f"\n--- Iteration {iteration} ---")
        
        # REASONING: LLM quyết định next step
        response = llm.chat(messages, tools=tools)
        
        # CHECK: LLM muốn gọi tool hay trả lời?
        if response.has_tool_calls:
            # ACTION: Execute tool(s)
            for tool_call in response.tool_calls:
                tool_name = tool_call.function.name
                tool_args = tool_call.function.arguments
                
                print(f"  Tool: {tool_name}({tool_args})")
                
                # Execute tool
                result = tools[tool_name].execute(**tool_args)
                
                # PERCEPTION: Feed result back
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": str(result),
                })
        else:
            # STOP: LLM decided to give final answer
            final_answer = response.content
            print(f"  Final Answer: {final_answer}")
            return final_answer
    
    return "Max iterations reached — could not complete task."

###5.2.状態管理

エージェントの状態には、任意の時点で実行を継続するために必要なすべての情報が含まれます。

┌────────────────────────────────────────────────────────┐
│                    AGENT STATE                          │
├────────────────────────────────────────────────────────┤
│                                                         │
│  state = {                                              │
│    "messages": [...],      # Full conversation history  │
│    "current_plan": [...],  # Remaining steps            │
│    "completed_steps": [...], # Done steps + results     │
│    "tool_results": {...},  # Cached tool outputs        │
│    "iteration": 5,         # Current loop count         │
│    "status": "running",    # running | completed | error│
│    "metadata": {           # Extra context              │
│       "start_time": "...",                              │
│       "tokens_used": 4520,                              │
│       "tools_called": ["search", "code_exec"],          │
│    }                                                    │
│  }                                                      │
│                                                         │
└────────────────────────────────────────────────────────┘

###5.3.停止条件

エージェント ループは、いつ停止するかを認識する必要があります。永久に実行することはできません。

停止条件説明優先事項
タスクが完了しましたLLM は最終的な回答を支払うことを決定しました✅ プライマリ
最大反復数ループ制限に達しました (例: 15)🛡️ 安全性
最大トークン数予算外のトークン🛡️ 安全性
タイムアウト制限時間を超えました🛡️ 安全性
エラーしきい値連続エラーが多すぎます🛡️ 安全性
人間による中断ユーザーがタスクをキャンセルまたは変更する⚠️ オーバーライド
繰り返されるアクションエージェントは同じ引数で同じツールを呼び出します。 🔄 ループ検出

ヒント: 運用環境では常に max_iterations と timeout を設定します。エージェント ループには安全制限がない = 無限のコストがかかるたとえば、2.50 ドル/100 万入力トークンの GPT-4o では、長いコンテキストを含む 50 回の反復のエージェント ループの場合、リクエストごとに 5 ~ 10 ドルの費用がかかる可能性があります。


6. AI エージェントの分類

###6.1.単純なものから複雑なものまで分類

古典的な AI 教科書 (Russell & Norvig) に基づいて、単純なものから複雑なものまで 5 種類のエージェントがあります。

Complexity & Capability →
─────────────────────────────────────────────────────────→

┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│  Simple    │ │  Model-    │ │  Goal-     │ │  Utility-  │ │  Learning  │
│  Reflex    │ │  Based     │ │  Based     │ │  Based     │ │  Agent     │
│            │ │            │ │            │ │            │ │            │
│ IF rain    │ │ Tracks     │ │ Has a      │ │ Optimizes  │ │ Improves   │
│ THEN       │ │ world      │ │ goal to    │ │ for best   │ │ over time  │
│ umbrella   │ │ state      │ │ achieve    │ │ outcome    │ │ from exp.  │
│            │ │            │ │            │ │            │ │            │
│ No memory  │ │ Has memory │ │ Plans      │ │ Evaluates  │ │ Self-      │
│ No goal    │ │ Predicts   │ │ actions    │ │ tradeoffs  │ │ improving  │
└────────────┘ └────────────┘ └────────────┘ └────────────┘ └────────────┘
     ▲              ▲              ▲              ▲              ▲
     │              │              │              │              │
  Thermostat    Spam filter    GPS nav       Trading bot    AlphaGo
  Rule engine   Autocomplete   Game AI      Recommendation  Modern LLM
                                             system          Agents

###6.2.詳細比較表

タイプメモリ企画学習AI エージェントの例現実世界
単純な反射❌ なし❌ なし❌ なしIf-else チャットボットサーモスタット、自動販売機
モデルベース✅ 世界のモデル❌ なし❌ なしコンテキスト認識アシスタントスパムフィルター、オートコンプリート
目標ベース✅ 世界のモデル✅ 検索/計画❌ なしReAct エージェントとツールGPSナビゲーション、ゲームAI
ユーティリティベース✅ 世界のモデル✅ 最適化された❌ なしエージェントが最適なツールを選択取引ボット、広告入札
学習✅ エピソード✅ アダプティブ✅ はい反射剤AlphaGo、最新の AI エージェント

###6.3.最新の LLM エージェントへのマッピング

Modern LLM Agent = LEARNING AGENT (loại phức tạp nhất)

Tại sao?
  ✓ Memory: conversation history + vector DB (long-term)
  ✓ Planning: LLM generates step-by-step plans
  ✓ Learning: Reflexion — tự critique và cải thiện
  ✓ Utility: LLM evaluates multiple options, chọn best
  ✓ Model-Based: LLM có "world model" from training data

Tuy nhiên, cũng có giới hạn:
  ✗ Learning không persistent (trừ khi save to memory)
  ✗ World model bị outdated (training cutoff)
  ✗ Planning chưa reliable (hallucinate plan)

ヒント: エージェントを設計するときは、問題を解決できる最も単純なタイプから始めてください。すべてのタスクに学習エージェントが必要なわけではありません。多くの場合、目標ベースのエージェント (ReAct + ツール) で十分です。エージェント アーキテクチャの過剰なエンジニアリングはよくある間違いです。


7. 現実世界の AI エージェントの使用例

###7.1.ユースケースの概要表

カテゴリーエージェント使用したツール建築
コーディングGitHub 副操縦士、カーソル、Devinコード実行、ファイル システム、git、ブラウザ計画と実行 + 反省
カスタマーサポートインターコムフィン、Zendesk AIナレッジベース、チケット発行 API、CRMリアクト + RAG
データ分析Julius AI、コードインタープリタPython REPL、チャート作成、ファイル I/O反応する
研究困惑、誘発Web検索、PDFパーサー、引用DBReAct + マルチソース
DevOpsPagerDuty AI、クビヤkubectl、クラウド API、モニタリング計画と実行
販売クレイ、アポロ AICRM、電子メール、LinkedIn、エンリッチメントワークフロー + エージェント ハイブリッド
法的ハーベイ AI文献検索、引用、草稿RAG + リアクト
ヘルスケアヒポクラテスAI医療 KB、患者記録、スケジュールRAG + ガードレール

###7.2.ケーススタディ: コーディング エージェント (Devin のような)

┌──────────────────────────────────────────────────────────────┐
│                  CODING AGENT ARCHITECTURE                     │
├──────────────────────────────────────────────────────────────┤
│                                                               │
│  User: "Add user authentication to my FastAPI app"            │
│                                                               │
│  PLANNER:                                                     │
│  ┌─────────────────────────────────────────────────┐         │
│  │ 1. Analyze existing codebase (read files)        │         │
│  │ 2. Design auth schema (JWT + bcrypt)             │         │
│  │ 3. Install dependencies (python-jose, passlib)   │         │
│  │ 4. Create User model + migration                 │         │
│  │ 5. Write auth utils (hash, verify, JWT)          │         │
│  │ 6. Create auth endpoints (register, login)       │         │
│  │ 7. Add middleware for protected routes            │         │
│  │ 8. Write tests                                   │         │
│  │ 9. Run tests, fix if failed                      │         │
│  └─────────────────────────────────────────────────┘         │
│                                                               │
│  EXECUTOR:                                                    │
│  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────┐            │
│  │ File   │  │Terminal│  │ Code   │  │Browser │            │
│  │ System │  │ (bash) │  │ Editor │  │(docs)  │            │
│  │ R/W    │  │ pip,git│  │ Edit   │  │ Search │            │
│  └────────┘  └────────┘  └────────┘  └────────┘            │
│                                                               │
│  REFLEXION:                                                   │
│  Test failed → Read error → Fix code → Retry → Pass ✓       │
│                                                               │
└──────────────────────────────────────────────────────────────┘

###7.3.ケーススタディ: カスタマーサポートエージェント

Customer: "Tôi đặt hàng 3 ngày rồi mà chưa nhận được"

Agent Flow:
  1. [PERCEIVE] Parse intent: order tracking inquiry
  2. [REASON]   Cần order ID → hỏi customer hoặc lookup by email
  3. [ACT]      Call CRM API: get_orders(email="customer@...")
  4. [PERCEIVE] Order #12345 — status: "shipped", tracking: VN123456
  5. [REASON]   Có tracking → check shipping API
  6. [ACT]      Call shipping API: track("VN123456")
  7. [PERCEIVE] "In transit — estimated delivery: tomorrow"
  8. [REASON]   Đủ info → compose response
  9. [ACT]      Reply: "Đơn hàng #12345 đang trên đường giao,
                        dự kiến nhận ngày mai. Tracking: VN123456"

Total: 4 tool calls, ~3 seconds, no human intervention

8. 実践: 最小限のエージェントを最初から構築する

8.1。インストール

pip install openai

8.2。ツールの定義

import json
import math
from datetime import datetime

# Tool definitions (OpenAI function calling format)
TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "calculate",
            "description": "Evaluate a math expression. Supports +, -, *, /, sqrt, pow.",
            "parameters": {
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "Math expression, e.g. '2 + 3 * 4' or 'sqrt(144)'"
                    }
                },
                "required": ["expression"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "get_current_time",
            "description": "Get current date and time.",
            "parameters": {
                "type": "object",
                "properties": {}
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "search_knowledge",
            "description": "Search a knowledge base for information.",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "Search query"
                    }
                },
                "required": ["query"]
            }
        }
    },
]

# Tool implementations
KNOWLEDGE_BASE = {
    "python": "Python is a high-level programming language created by Guido van Rossum in 1991.",
    "fastapi": "FastAPI is a modern Python web framework for building APIs, created by Sebastián Ramírez.",
    "langchain": "LangChain is a framework for building LLM applications, created by Harrison Chase in 2022.",
}

def execute_tool(name: str, args: dict) -> str:
    """Execute a tool and return result as string."""
    if name == "calculate":
        try:
            # Safe math evaluation (production cần sandbox!)
            allowed = {
                "sqrt": math.sqrt, "pow": pow, "abs": abs,
                "sin": math.sin, "cos": math.cos, "pi": math.pi,
            }
            result = eval(args["expression"], {"__builtins__": {}}, allowed)
            return f"Result: {result}"
        except Exception as e:
            return f"Error: {e}"
    
    elif name == "get_current_time":
        return f"Current time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
    
    elif name == "search_knowledge":
        query = args["query"].lower()
        matches = [v for k, v in KNOWLEDGE_BASE.items() if k in query]
        return matches[0] if matches else "No relevant information found."
    
    return f"Unknown tool: {name}"

8.3。エージェント ループ — ReAct スタイル

from openai import OpenAI

client = OpenAI()  # OPENAI_API_KEY from env

SYSTEM_PROMPT = """You are a helpful AI assistant with access to tools.
Use tools when needed to answer questions accurately.
Think step-by-step before deciding which tool to use.
When you have enough information, provide a final answer directly."""


def run_agent(user_query: str, max_iterations: int = 5) -> str:
    """Run a minimal ReAct-style agent loop."""
    
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": user_query},
    ]
    
    for i in range(max_iterations):
        print(f"\n🔄 Iteration {i + 1}")
        
        # LLM decides: use tool or answer directly
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages,
            tools=TOOLS,
            tool_choice="auto",
        )
        
        msg = response.choices[0].message
        messages.append(msg)  # Add assistant message to history
        
        # Check if LLM wants to call tools
        if msg.tool_calls:
            for tool_call in msg.tool_calls:
                func_name = tool_call.function.name
                func_args = json.loads(tool_call.function.arguments)
                
                print(f"  🔧 Tool: {func_name}({func_args})")
                
                # Execute tool
                result = execute_tool(func_name, func_args)
                print(f"  📋 Result: {result}")
                
                # Feed result back to LLM
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": result,
                })
        else:
            # No tool calls = final answer
            print(f"\n✅ Final Answer: {msg.content}")
            return msg.content
    
    return "⚠️ Max iterations reached."


# Test the agent
if __name__ == "__main__":
    # Test 1: Simple calculation
    run_agent("What is sqrt(144) + 10 * 3?")
    
    # Test 2: Knowledge search
    run_agent("Tell me about LangChain and who created it")
    
    # Test 3: Multi-step reasoning
    run_agent("What time is it now, and what is 24 minus the current hour?")

8.4。サンプル出力

🔄 Iteration 1
  🔧 Tool: calculate({"expression": "sqrt(144) + 10 * 3"})
  📋 Result: Result: 42.0

🔄 Iteration 2

✅ Final Answer: sqrt(144) + 10 * 3 = 42.0
   - sqrt(144) = 12
   - 10 * 3 = 30
   - 12 + 30 = 42

###8.5。アップグレード: メモリとエラー処理を追加する

class SimpleAgent:
    """Agent với memory và error handling."""
    
    def __init__(self, model: str = "gpt-4o-mini", max_iterations: int = 10):
        self.client = OpenAI()
        self.model = model
        self.max_iterations = max_iterations
        self.conversation_history = []  # Long-term memory (across calls)
    
    def run(self, query: str) -> str:
        messages = [
            {"role": "system", "content": SYSTEM_PROMPT},
            # Include recent conversation history (short-term memory)
            *self.conversation_history[-10:],  # Last 5 exchanges
            {"role": "user", "content": query},
        ]
        
        consecutive_errors = 0
        
        for i in range(self.max_iterations):
            try:
                response = self.client.chat.completions.create(
                    model=self.model,
                    messages=messages,
                    tools=TOOLS,
                    tool_choice="auto",
                )
                
                msg = response.choices[0].message
                messages.append(msg)
                consecutive_errors = 0  # Reset error counter
                
                if msg.tool_calls:
                    for tc in msg.tool_calls:
                        name = tc.function.name
                        args = json.loads(tc.function.arguments)
                        result = execute_tool(name, args)
                        
                        messages.append({
                            "role": "tool",
                            "tool_call_id": tc.id,
                            "content": result,
                        })
                else:
                    # Save to conversation history
                    self.conversation_history.append(
                        {"role": "user", "content": query}
                    )
                    self.conversation_history.append(
                        {"role": "assistant", "content": msg.content}
                    )
                    return msg.content
                    
            except Exception as e:
                consecutive_errors += 1
                if consecutive_errors >= 3:
                    return f"Agent stopped: too many consecutive errors. Last: {e}"
                messages.append({
                    "role": "user",
                    "content": f"Error occurred: {e}. Please try a different approach.",
                })
        
        return "Max iterations reached."


# Usage
agent = SimpleAgent()
print(agent.run("What is 2^10?"))
print(agent.run("And what about 2^20?"))  # Agent remembers previous context

ヒント: 上記のコードは 最小限の実行可能なエージェント であり、概念を理解するには十分です。運用エージェントには、構造化ログ、トークンカウント、レート制限、非同期実行、コード実行のための適切なサンドボックス化、包括的なエラー処理を追加する必要があります。次の記事では、各セクションについて詳しく説明します。


9. エージェント設計パターン — 概要

###9.1.パターン選択ガイド

                        Chọn Agent Architecture nào?
                                │
                    ┌───────────┴───────────┐
                    │                       │
              Task đơn giản?          Task phức tạp?
              (1-3 tool calls)        (multi-step)
                    │                       │
                    ▼                       │
                  ReAct              ┌──────┴──────┐
                                    │             │
                              Cần planning?   Cần self-fix?
                                    │             │
                                    ▼             ▼
                            Plan-and-Execute  Reflexion
                                    │
                              ┌─────┴─────┐
                              │           │
                        One best path? Multiple paths?
                              │           │
                              ▼           ▼
                         Keep P&E       LATS

###9.2.生産チェックリスト

実稼働用のエージェントを構築する場合は、常に次のことを確認してください。

側面何を確認するかなぜ
安全限界max_iterations、タイムアウト、トークンバジェット無限ループ、コスト爆発を回避
エラー処理再試行ロジック、フォールバック、グレースフル デグラデーションエージェントは回復力がなければなりません
可観測性各ステップをログに記録します: 思考、ツールの呼び出し、結果デバッグと改善
ガードレール入出力検証、コンテンツフィルタリング有害な行為を防止する
人間参加型破壊的行為の承認セーフティネット
コスト追跡リクエストごとのトークン使用量、1 日の予算支出をコントロールする
テスト単体テストツール、統合テストフルループ信頼性
評価成功率、レイテンシ、タスクあたりのコスト継続的な改善

概要

この記事では、定義からアーキテクチャ、実践的な実装に至るまで、AI エージェントのすべての基礎を説明しました。

重要なポイント:

  1. AI エージェント = LLM + ツール + メモリ + 目標 + ループ — チャットボットとの主な違いは 自律性 (自己決定、自己行動、自己修正) です。
  2. 4 つのコア コンポーネント: 知覚、脳/推論、行動、記憶 — すべてのエージェントはこれら 4 つのコンポーネントを備えています。
  3. 4 つの主要なアーキテクチャ: ReAct (シンプル、高速)、計画と実行 (複雑なタスク用)、Reflexion (自己改善)、LATS (複数のパスの探索) — 適切な問題に対して適切なアーキテクチャを選択します。
  4. エージェント ループ は、核となるパターンです: 認識 → 理由 → 行動 → ループ。明確な停止条件が必要です。
  5. 分類: 単純な反射から学習エージェントまで — 最新の LLM エージェントは最も複雑なタイプですが、必ずしもそのレベルを必要とするわけではありません。
  6. 本番エージェントには、安全制限、エラー処理、可観測性、ガードレール、および人間参加者が必要です。
  7. シンプルに始める — ReAct + いくつかのツールで多くのユースケースに十分です。オーバースペックにしないでください。
Agent Knowledge Map (Bài 12):

  ┌──────────────────────────────────────────────────┐
  │  WHAT: Agent = LLM + Tools + Memory + Loop       │
  │  WHY:  Autonomous task completion                 │
  │  HOW:  Perceive → Reason → Act → Loop            │
  │                                                   │
  │  Architectures:                                   │
  │    ReAct ──→ Plan-and-Execute ──→ Reflexion ──→ LATS│
  │    (simple)   (structured)      (self-fix)   (search)│
  │                                                   │
  │  Types: Reflex → Model → Goal → Utility → Learning│
  │                                                   │
  │  Production: Limits + Logging + Guardrails +      │
  │              Human-in-the-loop + Evaluation       │
  └──────────────────────────────────────────────────┘

次の記事

レッスン 13: ツール呼び出し、関数呼び出し、ReAct パターン — エージェントの最も重要なコンポーネントである ツール について詳しく説明します。 OpenAI Function Calling API を使用してツールを定義し、完全な ReAct パターンを実装し、カスタム ツール (Web 検索、データベース クエリ、コード実行) を構築し、運用環境でツール呼び出しのエラー処理と再試行ロジックを処理する方法を学びます。この記事のミニ エージェントから、10 以上のツールを備えたリアル エージェント システムにアップグレードします。