😺

[AI Agent Jump Start 基礎編#5] 設計演習

に公開

前回はマルチエージェント連携や MCP(Modular Code Processing)の考え方を紹介しました。
本稿は 演習形式 で、最小構成のチャットボット設計を自分の手で作って理解を深めるためのガイドです。

前回の記事はこちら
[AI Agent Jump Start 基礎編#4] マルチエージェントの理解と実装
https://zenn.dev/dxclab/articles/9946cec99cad80


🎯 演習課題(到達目標)

以下のリクエストに対応できるチャットボットの 設計(ルーティング方針・サブタスク分解・エージェント分担) を作成してください。

  1. 「こんにちは」などの挨拶 → 定型文で返答(Formatter Agent)
  2. 一般的な質問 → Web検索(Web Search Agent)→ 要約(Summary Agent) の連携で応答
  3. 特定のリクエスト → MCP Agent で翻訳(外部API or 自前MCP) を実行して返答

🧭 参考アーキテクチャ(演習の土台)

以下のフローチャートをベースに、自分の要件に合わせてノード名や分岐条件を調整してください。

🔄 ケース別に考える(手を動かす演習)

ケース1:挨拶(定型応答)

入力例:「こんにちは」

期待挙動:

  • Router → 定型文カテゴリ に分類
  • Planner → 追加分解なし(単一タスク)
  • Formatter Agent → 「こんにちは。ご用件をお伺いします。」のようなテンプレ返答を生成

課題:

  • どのキーワード/意図で挨拶と判定する?(例:正規表現/意図分類)
  • 多言語の挨拶(Hello, Hi, Bonjour…)はどう扱う?

ケース2:一般質問(検索→要約)

入力例:「IBMのwatsonx製品群について教えて」

期待挙動:

  • Router → 検索が必要 と判断
  • Planner → サブタスク分解
    • T1: Web検索(クエリ生成・上位N件取得) → Search Agent
    • T2: 検索結果の要約(構造化出力) → Summary Agent
  • 最終応答 → Summary Agentの出力を整形(必要なら Formatter で体裁調整)

課題:

  • 検索クエリ生成のルール(名詞抽出/句読点除去/OR/ANDの付与など)
  • 要約のスキーマ(見出し・箇条書き・引用元リンク)をどう定義する?

ケース3:翻訳(MCPで外部処理)

入力例:「この文を英語に翻訳して:私は寿司が好きです」

期待挙動:

  • Router → 翻訳カテゴリ と判断
  • Planner → サブタスク分解
    • T1: 翻訳のターゲット言語推定(指定なければ既定値)
    • T2: 翻訳実行(MCP Agent にハンドオフ)
  • MCP Agent → 事前に用意した MCP サーバー(例:DeepL/自前辞書)へ安全にリクエスト
  • 最終応答 → 「I like sushi.」

課題:

  • 入力言語/出力言語の解決(明示指定 or 自動判定)
  • エラー(利用制限・タイムアウト)の例外設計とフォールバック

🧩 ルーター/プランナーの設計チェックリスト

  • ルーター(Router Agent)

    • 意図分類:挨拶 / 検索 / 翻訳 / その他 の最低4カテゴリ
    • 優先度衝突時の決定規則(例:翻訳キーワードがあるときは翻訳優先)
    • 不確実性(低スコア)時の再質問ポリシー(確認プロンプト)
  • プランナー(Planner Agent)

    • サブタスク分解のスキーマ(name, inputs, tool/agent, depends_on)
    • 並列化可能なタスクの検討(検索→要約は直列、要出典整理は並列可 など)
    • 失敗時のリトライ/代替タスク(翻訳API落ち→簡易辞書での暫定翻訳 など)

🧱 I/O スキーマ例(ミニ仕様)

  • Search Agent(入力→出力)

    • 入力:{ query: string, top_k: number }
    • 出力:{ items: [{ title, snippet, url } * top_k] }
  • Summary Agent

    • 入力:{ items: SearchResult[], style: "bulleted" | "brief" }
    • 出力:{ summary: string, outline?: [{heading, bullets[]}] }
  • MCP Translate Agent

    • 入力:{ text: string, target_lang: string, source_lang?: string }
    • 出力:{ translation: string, provider: "deepl" | "custom" }
  • Formatter Agent

    • 入力:任意のテキスト + スタイル指定
    • 出力:テンプレに沿った文章(例:「挨拶テンプレ」「要約テンプレ」)

🧪 想定テスト(手動でOK)

  1. 挨拶:「やぁ」「こんにちは」「Hello」→ テンプレ返答が来るか
  2. 質問:「watsonx とは?」→ 検索→要約の流れで、3点の要点が返るか
  3. 翻訳:「和→英」「英→和」→ MCP 経由で翻訳されるか(明示/自動判定の両方)

まとめ(次への布石)

  • 役割を分離し、Router/Planner/Worker の三層で考えると拡張しやすい。
  • 検索・要約・翻訳は、それぞれ 独立エージェント として実装・差し替え可能にしておく。
  • 次回はこの設計をもとに、各エージェントの実装と FastAPI でのAPI化 を行います(MCP翻訳の実コード含む)。
DXC Lab

Discussion