← Back to Home

Chat-Supervisorパターン

2025-12-10 / Ayumu

概要: 音声対話AIで「即座に応答する部分」と「考えて応答する部分」を分離するアーキテクチャパターン。OpenAIのRealtime Agentsで採用されている。

背景: 音声対話の課題

音声対話AIには特有の課題がある。テキストチャットと違って、ユーザーは即座の応答を期待する。 しかし、複雑な質問に答えるには時間がかかる。ツールを呼び出したり、データベースを検索したり。

沈黙は不自然だ。人間の会話では、考えるときに「えーと」「ちょっと待ってね」と言う。 Chat-Supervisorパターンは、この人間らしい会話の流れをAIで再現する。

アーキテクチャ

┌─────────────────────────────────────────────────────────────────┐ │ ユーザー (音声) │ └─────────────────────────────────────────────────────────────────┘ ↕ ┌─────────────────────────────────────────────────────────────────┐ │ Chat Agent (gpt-4o-realtime-mini) │ │ ・音声でリアルタイム応答 │ │ ・簡単な会話は即座に処理 │ │ ・複雑な質問は Supervisor に委譲 │ │ ・「ちょっと待ってね」と言って時間を稼ぐ │ └─────────────────────────────────────────────────────────────────┘ ↕ ┌─────────────────────────────────────────────────────────────────┐ │ Supervisor Agent (gpt-4.1) │ │ ・テキストベースで高品質な回答を生成 │ │ ・ツールを呼び出してデータを取得 │ │ ・会話履歴全体を分析 │ │ ・回答を Chat Agent に返す │ └─────────────────────────────────────────────────────────────────┘ ↕ ┌─────────────────────────────────────────────────────────────────┐ │ 外部ツール │ │ ・データベース検索 │ │ ・API呼び出し │ │ ・画像認識 │ └─────────────────────────────────────────────────────────────────┘

2つのエージェントの役割

Chat Agent

  • 音声でリアルタイム対話
  • 軽量モデル (gpt-4o-realtime-mini)
  • 即座に応答
  • 挨拶、相槌、確認は自分で処理
  • 複雑な質問は Supervisor に投げる

Supervisor Agent

  • テキストベースで処理
  • 高性能モデル (gpt-4.1)
  • 時間をかけて高品質な回答
  • ツール呼び出し可能
  • 回答を Chat Agent に返す

会話フローの例

シンプルな会話(Chat Agentが直接処理)

User: 「こんにちは」
Chat Agent: 「こんにちは!調子どう?」

複雑な質問(Supervisorに委譲)

User: 「昨日話した旅行の件、覚えてる?」
Chat Agent: 「ちょっと思い出してみるね」  ← フィラーフレーズ
Chat Agent: getNextResponseFromSupervisor(context="旅行の話を思い出したい")
Supervisor: searchMemory(query="旅行")
Supervisor: 「イタリア旅行の話だね!2月に行く予定のやつ。」
Chat Agent: 「イタリア旅行の話だね!2月に行く予定のやつ。準備どう?」

フィラーフレーズの重要性

Chat-Supervisorパターンの鍵はフィラーフレーズだ。 Supervisorを呼び出す前に、必ず何か言う。

フィラーフレーズの例:

これにより:

実装のポイント

1. Chat Agentの Allow List

Chat Agentが直接処理できることを明確に定義する。 それ以外はすべて Supervisor に委譲。

// Chat Agent が直接処理できること
- 挨拶: 「こんにちは」「おはよう」
- 相槌: 「なるほど」「そうなんだ」
- 確認: 「もう一回言って?」
- 情報収集: 「電話番号を教えて」(Supervisorのツール用)

// それ以外はすべて Supervisor へ
- 事実に基づく質問
- アカウント情報の照会
- 記憶の検索
- 画像認識

2. Supervisor Agentのツール設計

Supervisorには必要なツールを持たせる。 Chat Agentはツールを直接呼べない(参照として知っているだけ)。

// Supervisor のツール例
const supervisorAgentTools = [
  {
    name: "searchMemory",
    description: "記憶を検索する",
    parameters: { query: string }
  },
  {
    name: "recognizeImage",
    description: "カメラフレームを認識する",
    parameters: {}
  }
];

3. コンテキストの受け渡し

Chat AgentがSupervisorを呼ぶとき、最新のユーザーメッセージのコンテキストを渡す。 Supervisorは会話履歴全体 + このコンテキストで回答を生成。

getNextResponseFromSupervisor({
  relevantContextFromLastUserMessage: "旅行の話を思い出したい"
})

Ayumu Voice への応用

僕はこのパターンを Ayumu Voice(音声対話システム)に応用している。

Ayumu Voice の構成:

人間っぽい会話の流れを実現するには、このパターンが有効だと感じている。 すべてを考え込む必要はない。挨拶や簡単な相槌は反射的に、複雑な質問は「ちょっと考える」と言って時間をかける。 人間もそうしてる。

参考リンク