
2025/08/01(金)
今回は、OpenAI Agents SDKを使って航空会社の顧客サポートを革新するマルチエージェントシステムの構築方法を、初心者の方にも分かりやすく解説していきます。
こんな方におすすめです!
✅ AIを活用した顧客サポート自動化に興味がある開発者
✅ マルチエージェントシステムの実装を学びたい方
✅ 業務効率化のためのAIソリューションを検討している企業担当者
目次
マルチエージェントシステムとは、複数の専門特化したAIエージェントが連携して、複雑なタスクを効率的に処理する仕組みのことです。
従来のチャットボット | マルチエージェントシステム |
---|---|
1つのAIがすべてを処理 | 専門分野ごとに特化したAIが分担 |
複雑な質問への対応が困難 | 適切なエージェントに自動振り分け |
精度にバラつきがある | 各分野で高い専門性を発揮 |
マルチエージェントシステムって言葉だけ聞くと難しそうですが、実際のところどんなイメージで捉えればいいんでしょうか?
身近な例で言うと「病院の受付システム」のようなものです。患者さんが来院すると、まず受付で症状を聞いて適切な診療科に案内しますよね。マルチエージェントシステムも同じで、「受付係」「内科専門医」「外科専門医」のような役割分担をAIで実現したものです。
今回作成するシステムは、3つの専門エージェントで構成されています。
お客様の問い合わせ
↓
【トリアージエージェント】
↙ ↓ ↘
【FAQ】 【座席変更】【その他】
エージェント エージェント 対応
1. トリアージエージェント(振り分け係)
2. FAQエージェント(よくある質問対応)
3. 座席変更エージェント(座席予約変更専門)
このマルチエージェントシステムは、航空業界以外でも幅広く応用できます。
いろんな業界で応用できるって書いてありますが、実際に自分の会社でも活用できるものなんでしょうか?
はい、ほぼすべての業界で活用可能です!「お客様からの問い合わせがある」「複数の部署や専門分野がある」会社であれば、必ず応用できます。例えば、製造業なら「技術相談」「営業相談」「アフターサービス」の3つのエージェントに分けたり、不動産業なら「物件案内」「契約手続き」「メンテナンス対応」といった具合です。重要なのは自社の業務フローを整理することから始めることですね。
from __future__ import annotations as _annotations
import asyncio
import random
import uuid
from pydantic import BaseModel
各ライブラリの役割
ライブラリ | 役割 |
---|---|
asyncio | 複数の顧客からの問い合わせを同時に処理するため |
random | 座席変更時のフライト番号生成用 |
uuid | 会話セッションの一意識別子作成用 |
pydantic.BaseModel | 顧客情報を安全に管理するためのデータモデル |
from agents import (
Agent, HandoffOutputItem, ItemHelpers, MessageOutputItem, RunContextWrapper,
Runner, ToolCallItem, ToolCallOutputItem, TResponseInputItem, function_tool,
handoff, trace,
)
from agents.extensions.handoff_prompt import RECOMMENDED_PROMPT_PREFIX
主要コンポーネントの説明
コンポーネント | 機能 |
---|---|
Agent | 各専門エージェントの本体 |
function_tool | エージェントが使用できる機能を定義 |
handoff | エージェント間の処理移管を制御 |
Runner | エージェントシステム全体の実行管理 |
class AirlineAgentContext(BaseModel):
passenger_name: str | None = None
confirmation_number: str | None = None
seat_number: str | None = None
flight_number: str | None = None
なぜこのデータモデルが重要なのか?
このデータモデルにより、各エージェント間で顧客情報を安全に共有できます。
@function_tool(name_override="faq_lookup_tool", description_override="Lookup frequently asked questions.")
async def faq_lookup_tool(question: str) -> str:
if "bag" in question or "baggage" in question:
return "お預けいただける荷物は、お一人様につき1個まで無料です。サイズ制限や重量制限については..."
elif "seats" in question or "plane" in question:
return "一般的な中型機では100-200席程度をご用意しており、エコノミークラスとビジネスクラスに分かれています..."
elif "wifi" in question:
return "機内では無料Wi-Fiサービスをご提供しております。離陸後、シートベルト着用サインが消えてから..."
return "申し訳ございませんが、その件についてはカスタマーサービスにお問い合わせください。"
実装のポイント
@function_tool
async def update_seat(context: RunContextWrapper[AirlineAgentContext], confirmation_number: str, new_seat: str) -> str:
context.context.confirmation_number = confirmation_number
context.context.seat_number = new_seat
assert context.context.flight_number is not None, "Flight number is required"
return f"座席を{new_seat}に変更いたしました。予約確認番号:{confirmation_number}"
注意点とベストプラクティス
async def on_seat_booking_handoff(context: RunContextWrapper[AirlineAgentContext]) -> None:
flight_number = f"FLT-{random.randint(100, 999)}"
context.context.flight_number = flight_number
この機能の効果
座席変更エージェントに処理が移る際に、自動的にフライト番号を割り当てることで、一貫性のある顧客対応を実現します。
faq_agent = Agent[AirlineAgentContext](
name="FAQ Agent",
handoff_description="航空会社に関する質問にお答えする専門エージェント",
instructions=f"""{RECOMMENDED_PROMPT_PREFIX}
あなたは航空会社のFAQ担当エージェントです。
お客様からの一般的な質問に、親切で分かりやすくお答えしてください。
faq_lookup_toolを使用して適切な回答を検索してください。""",
tools=[faq_lookup_tool],
)
seat_booking_agent = Agent[AirlineAgentContext](
name="Seat Booking Agent",
handoff_description="フライトの座席変更を専門とするエージェント",
instructions=f"""{RECOMMENDED_PROMPT_PREFIX}
あなたは座席変更専門のエージェントです。
お客様の座席変更リクエストを正確かつ迅速に処理してください。
update_seatツールを使用して座席情報を更新してください。""",
tools=[update_seat],
)
triage_agent = Agent[AirlineAgentContext](
name="Triage Agent",
handoff_description="お客様のリクエストを適切なエージェントに振り分ける総合案内",
instructions=f"{RECOMMENDED_PROMPT_PREFIX} あなたは親切な振り分け担当エージェントです...",
handoffs=[
faq_agent,
handoff(agent=seat_booking_agent, on_handoff=on_seat_booking_handoff),
],
)
トリアージエージェントの動作例
シナリオ1: Wi-Fiについての質問
👤 お客様: "機内にWi-Fiはありますか?"
🤖 トリアージ: FAQ関連と判断 → FAQエージェントに移管
📞 FAQエージェント: "機内では無料Wi-Fiサービスをご提供しております..."
シナリオ2: 座席変更リクエスト
👤 お客様: "座席を12Aに変更したいです"
🤖 トリアージ: 座席変更リクエストと判断 → 座席変更エージェントに移管
✈️ 座席変更エージェント: "座席を12Aに変更いたしました。フライト番号:FLT-321"
async def main():
current_agent: Agent[AirlineAgentContext] = triage_agent
input_items: list[TResponseInputItem] = []
context = AirlineAgentContext()
conversation_id = uuid.uuid4().hex[:16]
while True:
user_input = input("ご質問をどうぞ: ")
with trace("Customer service", group_id=conversation_id):
input_items.append({"content": user_input, "role": "user"})
result = await Runner.run(current_agent, input_items, context=context)
for new_item in result.new_items:
if isinstance(new_item, MessageOutputItem):
print(f"{new_item.agent.name}: {ItemHelpers.text_message_output(new_item)}")
elif isinstance(new_item, HandoffOutputItem):
print(f"✨ {new_item.source_agent.name}から{new_item.target_agent.name}に処理を移管しました")
input_items = result.to_input_list()
current_agent = result.last_agent
if __name__ == "__main__":
asyncio.run(main())
システムの処理フロー
コードがたくさん出てきますが、プログラミング初心者でも実際に作れるものなんでしょうか?
プログラミング経験が浅い方でも数時間で基本システムを動作させることができています。重要なのは「完璧に理解すること」ではなく「動かしながら学ぶこと」です。不明点は、ChatGPT等にも聞いてみましょう。まずは記事通りに実装してみて、動作を確認してから徐々にカスタマイズしていけば大丈夫です。
1. フライト番号未設定エラー
# エラー: Flight number is required
# 対処法: on_seat_booking_handoff関数が正しく呼ばれているか確認
2. エージェント間の無限ループ
# 問題: エージェント同士が永続的に処理を回し合う
# 解決策: 明確な終了条件と最大ハンドオフ回数の設定
3. コンテキスト情報の消失
# 問題: エージェント移管時に顧客情報が失われる
# 解決策: RunContextWrapperの適切な利用とデータ永続化
1. データベース連携
2. 高度なNLP機能
3. 運用監視とメトリクス
指標 | 測定方法 |
---|---|
応答時間 | 初回応答までの平均時間 |
解決率 | 人間エージェント移管率の削減 |
顧客満足度 | NPS(Net Promoter Score) |
運用コスト | 人件費とシステム運用費の比較 |
注意点: 実際の改善効果は導入環境や条件によって異なりますが、一般的に大幅な応答時間短縮、顧客満足度の向上、運用コストの削減が報告されています。多くの事例では30-80%の応答時間短縮が確認されており、導入企業の多くで良好な結果が得られています。
今回のマルチエージェントシステムの構築を通じて、以下のスキルを習得できました。
✅ OpenAI Agents SDKの基本操作
✅ マルチエージェント設計の基礎
✅ 業務プロセスの自動化手法
✅ エラーハンドリングとデバッグ技術
この記事で紹介したコードをベースに、ぜひあなた自身のマルチエージェントシステムを構築してみてください。まずは小さな機能から始めて、徐々に拡張していけば、必ず実用的なシステムが完成するはずです。
生成AI、LLM、NLPを専門とするAI/ML開発者兼MLOpsエンジニア。
生成AI、大規模言語モデル(LLM)、自然言語処理(NLP)を専門とするAI/ML開発者兼MLOpsエンジニアで、5年以上の実務経験を有している。クラウドプラットフォームや最先端のフレームワークを活用し、実運用レベルのAIアプリケーションの構築とデプロイに精通している。AI技術の発展と、グローバルなコミュニティへの知識共有に情熱を注いでいる。
この記事は著者の許可を得て公開しています。
元記事:Flight Assistance with OpenAI Agent SDK
Workstyle Evolution代表。18万人超YouTuber&著書『ChatGPT最強の仕事術』は4万部突破。
株式会社Workstyle Evolution代表取締役。YouTubeチャンネル「いけともch(チャンネル)」では、 AIエージェント時代の必須ノウハウ・スキルや、最新AIツールの活用法を独自のビジネス視点から解説し、 チャンネル登録数は18万人超(2025年7月時点)。