はじめに

マルチエージェントAIシステムは、AI自動化の次なる進化を代表するものです。単一のAIがすべてを処理するのではなく、それぞれ異なる役割、目標、ツールを持つ専門エージェントが協力して、複雑なタスクをより効果的に解決します。

CrewAIは、このようなシステムの構築を簡単にするPythonフレームワークです。このチュートリアルでは、技術トピックを自動的に調査し、市場トレンドを分析し、プロフェッショナルなレポートを作成するリサーチクルーを構築します。

学習内容

  • CrewAIプロジェクトをゼロから構築
  • 専門的な役割とツールを持つエージェントの定義
  • 依存関係と期待される出力を持つタスクの作成
  • マルチエージェントワークフローのオーケストレーション
  • Web検索とカスタムツールの統合
  • 前提条件

  • Python 3.10+
  • OpenAI APIキー
  • Pythonの基本知識
  • ---

    ステップ1: 環境セットアップ

    新しいプロジェクトを作成し、依存関係をインストールします:

    mkdir tech-research-crew && cd tech-research-crew
    

    python -m venv venv

    source venv/bin/activate # Windows: venv\Scripts\activate

    pip install crewai crewai-tools langchain-openai python-dotenv

    APIキー用の.envファイルを作成します:

    # .env
    

    OPENAI_API_KEY=sk-your-api-key-here

    SERPER_API_KEY=your-serper-key-here # Web検索用

    ---

    ステップ2: エージェントの定義

    agents.pyを作成します。各エージェントには役割、目標、バックストーリーがあります:

    # agents.py
    

    from crewai import Agent

    from crewai_tools import SerperDevTool, WebsiteSearchTool

    # ツール

    search_tool = SerperDevTool()

    web_tool = WebsiteSearchTool()

    # エージェント1: リサーチスペシャリスト

    researcher = Agent(

    role="シニアテクノロジーリサーチャー",

    goal="新興技術に関する包括的で正確な情報を見つける",

    backstory="""あなたはトップコンサルティングファームで15年の経験を持つ

    ベテラン技術リサーチャーです。信頼性の高い情報源を見つけ、

    主要トレンドを特定し、誇大広告と実態を区別することに優れています。""",

    tools=[search_tool, web_tool],

    verbose=True,

    allow_delegation=False,

    max_iter=5,

    )

    # エージェント2: データアナリスト

    analyst = Agent(

    role="テクノロジーマーケットアナリスト",

    goal="技術トレンドを分析し、データ駆動型のインサイトを提供する",

    backstory="""あなたはテクノロジー市場分析を専門とするデータ駆動型の

    アナリストです。生のリサーチを実用的なインサイトに変換し、

    パターンを特定し、エビデンスに基づいた予測を行います。""",

    verbose=True,

    allow_delegation=False,

    )

    # エージェント3: テクニカルライター

    writer = Agent(

    role="シニアテクニカルライター",

    goal="明確で魅力的、構造化された技術レポートを作成する",

    backstory="""あなたは複雑なトピックをわかりやすくすることで知られる

    受賞歴のあるテクニカルライターです。エグゼクティブとエンジニアの

    両方が価値を見出すレポートを作成します。""",

    verbose=True,

    allow_delegation=False,

    )

    ---

    ステップ3: タスクの作成

    tasks.pyを作成します。タスクは各エージェントが達成すべきことを定義します:

    # tasks.py
    

    from crewai import Task

    from agents import researcher, analyst, writer

    def create_research_tasks(topic: str):

    """指定トピックのリサーチタスクシーケンスを作成"""

    # タスク1: リサーチ

    research_task = Task(

    description=f"""以下のトピックについて徹底的に調査: {topic}

    調査内容:

    1. 技術の現状

    2. 主要プレイヤーと企業

    3. 最近の動向(過去6ヶ月)

    4. ユースケースと実世界での応用

    5. 技術的課題と制限事項

    すべてのソースのURLを提供してください。""",

    expected_output="""詳細なリサーチドキュメント:

    - エグゼクティブサマリー(2-3文)

    - 主要な発見(5-7箇条書き)

    - 各調査分野の詳細セクション

    - 検証用ソースURL""",

    agent=researcher,

    )

    # タスク2: 分析(リサーチに依存)

    analysis_task = Task(

    description=f"""リサーチ結果を分析: {topic}

    分析内容:

    1. SWOT分析

    2. 市場導入タイムライン予測

    3. 競合技術との比較

    4. エンタープライズ導入のリスク評価

    5. アーリーアダプターのROI可能性""",

    expected_output="""構造化された分析ドキュメント:

    - SWOTマトリックス

    - 導入タイムライン(フェーズ付き)

    - 競合比較表

    - リスクマトリックス

    - ROI予測""",

    agent=analyst,

    context=[research_task],

    )

    # タスク3: レポート作成(両方に依存)

    writing_task = Task(

    description=f"""プロフェッショナルな技術レポートを作成: {topic}

    レポート要件:

    1. エグゼクティブサマリーで開始

    2. 論理的な流れで結果を提示

    3. 分析フレームワークを含める

    4. 実行可能な推奨事項を提供

    5. 次のステップで締めくくる

    形式: Markdown、明確な見出し、箇条書き、表を使用""",

    expected_output="""完成されたMarkdownレポート(2000-3000語):

    - タイトルと日付

    - エグゼクティブサマリー

    - 調査結果

    - 分析とインサイト

    - 推奨事項(優先順位付き)

    - ソース付録""",

    agent=writer,

    context=[research_task, analysis_task],

    output_file="output/report.md",

    )

    return [research_task, analysis_task, writing_task]

    ---

    ステップ4: クルーの組み立て

    main.pyを作成します:

    # main.py
    

    import os

    from dotenv import load_dotenv

    from crewai import Crew, Process

    from agents import researcher, analyst, writer

    from tasks import create_research_tasks

    load_dotenv()

    os.makedirs("output", exist_ok=True)

    def run_research_crew(topic: str):

    tasks = create_research_tasks(topic)

    crew = Crew(

    agents=[researcher, analyst, writer],

    tasks=tasks,

    process=Process.sequential,

    verbose=True,

    memory=True,

    max_rpm=10,

    )

    result = crew.kickoff()

    print(f"\nレポート保存先: output/report.md")

    print(f"使用トークン数: {crew.usage_metrics}")

    return result

    if __name__ == "__main__":

    topic = input("リサーチトピックを入力: ") or "エンタープライズにおけるAIエージェント"

    result = run_research_crew(topic)

    ---

    ステップ5: カスタムツールの追加

    tools.pyでカスタムツールを作成します:

    # tools.py
    

    from crewai_tools import tool

    import json

    from datetime import datetime

    @tool("JSONレポート保存")

    def save_json_report(content: str, filename: str) -> str:

    """構造化データをJSONレポートファイルとして保存します。

    Args:

    content: JSON文字列としてのレポート内容

    filename: 出力ファイル名(拡張子なし)

    """

    try:

    data = json.loads(content)

    except json.JSONDecodeError:

    data = {"raw_content": content}

    report = {

    "generated_at": datetime.now().isoformat(),

    "data": data,

    }

    filepath = f"output/{filename}.json"

    with open(filepath, "w") as f:

    json.dump(report, f, indent=2, ensure_ascii=False)

    return f"レポートを{filepath}に保存しました"

    ---

    ステップ6: 階層型プロセス

    複雑なワークフローでは、マネージャーエージェントが委任する階層型を使用します:

    # hierarchical_crew.py
    

    from crewai import Crew, Process

    from langchain_openai import ChatOpenAI

    manager_llm = ChatOpenAI(model="gpt-4o", temperature=0.1)

    crew = Crew(

    agents=[researcher, analyst, writer],

    tasks=tasks,

    process=Process.hierarchical,

    manager_llm=manager_llm,

    verbose=True,

    )

    result = crew.kickoff()

    階層モードでは、CrewAIがマネージャーエージェントを自動作成し、タスクの割り当てと品質管理を行います。

    ---

    ステップ7: 実行とテスト

    python main.py
    
    

    # 出力例:

    # > Agent: シニアテクノロジーリサーチャー

    # > Task: AIエージェントについて調査中...

    # > ツール使用: インターネット検索

    # > ...

    # > Agent: テクノロジーマーケットアナリスト

    # > Task: リサーチ結果を分析中...

    # > ...

    # > CREW EXECUTION COMPLETE

    # > レポート保存先: output/report.md

    ---

    まとめ

    | 概念 | 説明 |

    |------|------|

    | Agent | 役割、目標、ツールを持つ自律AIエンティティ |

    | Task | 期待される出力とコンテキストを持つ具体的な課題 |

    | Crew | タスクに協力して取り組むエージェントのグループ |

    | Process | 実行戦略(順次または階層型) |

    | Tools | エージェントが外部と対話するための関数 |

    | Memory | タスク実行間で維持される共有コンテキスト |

    ---

    ベストプラクティス

    1. 具体的な役割 — 広範ではなく、狭く明確に定義された役割をエージェントに与える

    2. 明確な期待値expected_outputを正確に定義する

    3. タスク依存関係contextを使用してタスクをチェーンする

    4. レート制限max_rpmでAPIレート制限を回避

    5. エラーハンドリングmax_iterで無限ループを防止

    6. モデル選択 — 複雑な推論にはGPT-4o、シンプルなタスクにはGPT-3.5

    ---

    参考リソース

  • CrewAI公式ドキュメント
  • CrewAI GitHubリポジトリ
  • CrewAIサンプル集

Techsfree発行 — テクノロジーイノベーションのパートナー