CrewAIでマルチエージェントシステムを開発する完全ガイド2026 - 役割分担AIチームの構築


はじめに

CrewAIは、複数のAIエージェントが役割を分担して協調作業するマルチエージェントフレームワークです。人間のチームのように、それぞれ専門スキルを持つエージェントがタスクを分担して複雑な問題を解決します。

2026年、AIエージェントの実用化が進む中、CrewAIは最も人気のある多エージェントフレームワークの一つになっています。

CrewAIとは

コアコンセプト

               ┌─────────────────────────────────┐
               │            Crew(クルー)          │
               │  ┌──────────┐  ┌──────────┐      │
               │  │Agent     │  │Agent     │      │
               │  │リサーチャー│  │ライター   │      │
               │  └──────────┘  └──────────┘      │
               │       ↓              ↓            │
               │  ┌──────────┐  ┌──────────┐      │
               │  │Task      │  │Task      │      │
               │  │情報収集   │  │記事作成   │      │
               │  └──────────┘  └──────────┘      │
               └─────────────────────────────────┘

主要コンポーネント:

  • Agent: 役割・目標・バックストーリーを持つAIエージェント
  • Task: エージェントが実行する具体的なタスク
  • Crew: エージェントとタスクをまとめるオーケストレーター
  • Tool: エージェントが使用できるツール(検索、コード実行など)
  • Process: タスクの実行順序(Sequential / Hierarchical)

インストール

pip install crewai crewai-tools

# または最新版
pip install 'crewai[tools]'

基本的な使い方

シンプルなクルーの作成

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, WebsiteSearchTool
from langchain_openai import ChatOpenAI

# ツールの準備
search_tool = SerperDevTool()  # Google検索ツール

# エージェントの定義
researcher = Agent(
    role="シニアリサーチャー",
    goal="指定されたトピックについて最新かつ正確な情報を収集する",
    backstory="""あなたは10年以上の経験を持つリサーチャーです。
    常に信頼できるソースから情報を収集し、データに基づいた洞察を提供します。
    最新のAI技術トレンドに精通しています。""",
    verbose=True,
    allow_delegation=False,
    tools=[search_tool],
    llm=ChatOpenAI(model="gpt-4o")
)

writer = Agent(
    role="テクニカルライター",
    goal="複雑な技術情報を分かりやすい日本語記事にまとめる",
    backstory="""あなたは技術系メディアで活躍するライターです。
    エンジニア読者を対象に、実践的で読みやすい技術記事を書くことを得意としています。
    SEOも意識した構成で記事を作成します。""",
    verbose=True,
    allow_delegation=False,
    llm=ChatOpenAI(model="gpt-4o")
)

# タスクの定義
research_task = Task(
    description="""2026年のAIエージェント開発トレンドについて調査してください。
    特に以下の点に焦点を当ててください:
    1. 主要なフレームワーク(LangGraph、CrewAI、AutoGen)の特徴
    2. 企業での実用事例
    3. 今後6ヶ月の予測

    調査結果は箇条書きで整理してください。""",
    expected_output="調査結果のレポート(箇条書き、500文字以上)",
    agent=researcher
)

writing_task = Task(
    description="""リサーチャーの調査結果を基に、エンジニア向けの技術記事を作成してください。

    記事の要件:
    - タイトル:SEOキーワードを含む
    - 長さ:1000〜1500文字
    - 構成:導入→本文(3セクション)→まとめ
    - コード例を1つ以上含める
    - 読者:Webエンジニア(経験3年以上)""",
    expected_output="完成した技術記事(マークダウン形式)",
    agent=writer,
    context=[research_task]  # research_taskの結果を使用
)

# クルーの作成と実行
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,  # タスクを順番に実行
    verbose=True
)

result = crew.kickoff()
print(result)

Hierarchicalプロセス(マネージャー型)

from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI

# マネージャーが各エージェントに仕事を割り当てる
manager = Agent(
    role="プロジェクトマネージャー",
    goal="チーム全体の作業を調整し、最高品質の成果物を届ける",
    backstory="シニアPMとして、複数プロジェクトを同時管理してきた経験者。",
    allow_delegation=True,  # 他エージェントへの委任を許可
    llm=ChatOpenAI(model="gpt-4o")
)

developer = Agent(
    role="フルスタックエンジニア",
    goal="要件を満たす高品質なコードを実装する",
    backstory="React/Node.jsを得意とするフルスタックエンジニア。",
    tools=[],
    llm=ChatOpenAI(model="gpt-4o")
)

reviewer = Agent(
    role="コードレビュアー",
    goal="コードの品質・セキュリティ・パフォーマンスをレビューする",
    backstory="セキュリティとパフォーマンスに詳しいシニアエンジニア。",
    tools=[],
    llm=ChatOpenAI(model="gpt-4o")
)

# タスク
implementation_task = Task(
    description="""ユーザー認証システムをTypeScriptで実装してください。
    要件:
    - JWT認証
    - パスワードのbcryptハッシュ化
    - ログイン・ログアウト・リフレッシュトークン
    - Express.js使用""",
    expected_output="TypeScriptの実装コード",
    agent=developer
)

review_task = Task(
    description="実装されたコードのセキュリティレビューを実施してください。",
    expected_output="レビューレポートと改善提案",
    agent=reviewer,
    context=[implementation_task]
)

# Hierarchical処理でマネージャーが調整
crew = Crew(
    agents=[manager, developer, reviewer],
    tasks=[implementation_task, review_task],
    process=Process.hierarchical,  # マネージャーが調整
    manager_llm=ChatOpenAI(model="gpt-4o"),
    verbose=True
)

result = crew.kickoff()

カスタムツールの作成

from crewai_tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
import requests

class GitHubSearchInput(BaseModel):
    query: str = Field(description="GitHubで検索するクエリ")
    language: str = Field(description="プログラミング言語でフィルタ", default="")

class GitHubSearchTool(BaseTool):
    name: str = "GitHub検索ツール"
    description: str = "GitHubのリポジトリを検索します。コード例やOSSプロジェクトを探す際に使います。"
    args_schema: Type[BaseModel] = GitHubSearchInput

    def _run(self, query: str, language: str = "") -> str:
        url = "https://api.github.com/search/repositories"
        params = {"q": query, "sort": "stars"}
        if language:
            params["q"] += f" language:{language}"

        try:
            response = requests.get(url, params=params, timeout=10)
            data = response.json()
            items = data.get("items", [])[:3]
            results = []
            for item in items:
                results.append(
                    f"- {item['name']}{item['stargazers_count']}: {item['description']}"
                )
            return "\n".join(results) if results else "結果が見つかりませんでした"
        except Exception as e:
            return f"エラー: {str(e)}"

# エージェントにカスタムツールを追加
github_tool = GitHubSearchTool()

oss_researcher = Agent(
    role="OSSリサーチャー",
    goal="最新のOSSプロジェクトトレンドを調査する",
    backstory="GitHub上のトレンドを日々追っているOSSコミュニティメンバー。",
    tools=[github_tool],
    llm=ChatOpenAI(model="gpt-4o")
)

入力変数と動的タスク

from crewai import Agent, Task, Crew

# 変数を使ったタスク定義
analysis_task = Task(
    description="""以下の製品について市場分析を実施してください:

    製品名: {product_name}
    ターゲット市場: {target_market}
    分析期間: {time_period}

    競合他社との比較、市場機会、リスクを含む分析レポートを作成してください。""",
    expected_output="市場分析レポート(マークダウン形式)",
    agent=researcher
)

# 実行時に変数を渡す
result = crew.kickoff(inputs={
    "product_name": "CrewAI Enterprise Edition",
    "target_market": "日本のエンタープライズ企業",
    "time_period": "2026年Q1-Q2"
})

実践例: コンテンツ生成パイプライン

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, FileWriterTool
from langchain_anthropic import ChatAnthropic

# ツール
search = SerperDevTool()
file_writer = FileWriterTool()

# Claudeを使ったエージェント
keyword_researcher = Agent(
    role="SEOキーワードリサーチャー",
    goal="検索ボリュームが高く競合が少ないキーワードを特定する",
    backstory="SEO専門家として、Google検索アルゴリズムを熟知しています。",
    tools=[search],
    llm=ChatAnthropic(model="claude-sonnet-4-6")
)

content_strategist = Agent(
    role="コンテンツストラテジスト",
    goal="SEOと読者のニーズを両立した記事構成を設計する",
    backstory="コンテンツマーケターとして、バイラルコンテンツを多数制作した経験を持つ。",
    tools=[],
    llm=ChatAnthropic(model="claude-sonnet-4-6")
)

technical_writer = Agent(
    role="テクニカルライター",
    goal="エンジニアが実際に役立てられる技術記事を執筆する",
    backstory="エンジニア出身のライターで、実装経験に基づいた記事を得意とする。",
    tools=[file_writer],
    llm=ChatAnthropic(model="claude-sonnet-4-6")
)

# パイプラインのタスク
keyword_task = Task(
    description="「{topic}」に関連するSEOキーワードを10個リストアップし、月間検索ボリュームと競合度を評価してください。",
    expected_output="キーワードリスト(各キーワードに検索ボリュームと競合度の評価付き)",
    agent=keyword_researcher
)

outline_task = Task(
    description="SEOキーワードと読者ニーズを基に、技術記事の構成案を作成してください。H2/H3ヘッダーを含む詳細な目次を提供してください。",
    expected_output="記事構成案(見出し一覧とそれぞれのポイント)",
    agent=content_strategist,
    context=[keyword_task]
)

writing_task = Task(
    description="""提供された構成案に従って、以下の条件で技術記事を執筆してください:
    - 文字数:2000〜3000文字
    - コード例を3つ以上含める
    - 実践的なユースケースを含める
    - SEOキーワードを自然に含める
    完成したらMarkdownファイルとして保存してください。""",
    expected_output="完成した技術記事(マークダウン形式、2000文字以上)",
    agent=technical_writer,
    context=[keyword_task, outline_task]
)

# コンテンツ生成クルー
content_crew = Crew(
    agents=[keyword_researcher, content_strategist, technical_writer],
    tasks=[keyword_task, outline_task, writing_task],
    process=Process.sequential,
    verbose=True
)

# 実行
result = content_crew.kickoff(inputs={"topic": "TypeScript 5.8の新機能"})
print(result)

メモリとコンテキスト管理

from crewai import Crew, Process

# メモリを有効化
crew_with_memory = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,
    memory=True,          # エージェント間でメモリを共有
    embedder={
        "provider": "openai",
        "config": {"model": "text-embedding-3-small"}
    },
    verbose=True
)

# 後続の実行でも過去の会話を参照できる
result1 = crew_with_memory.kickoff(inputs={"topic": "Python最新情報"})
result2 = crew_with_memory.kickoff(inputs={"topic": "先ほどのPython記事を英語に翻訳してください"})

LangGraph vs CrewAI vs AutoGen 比較

観点CrewAILangGraphAutoGen
難易度⭐⭐ 簡単⭐⭐⭐ 中級⭐⭐⭐ 中級
柔軟性
状態管理シンプル精緻会話ベース
適用場面役割分担タスク複雑なワークフロー対話型協調
エンタープライズ
Python
JavaScript✅(JS版)

選択の指針:

  • CrewAI: 役割が明確なビジネスタスク(コンテンツ生成、分析レポート)
  • LangGraph: 状態管理が重要な複雑なエージェント(カスタマーサポート、長期タスク)
  • AutoGen: 対話的な問題解決が必要な場合

まとめ

CrewAIは人間のチームを模倣したマルチエージェントシステムを最短時間で構築できるフレームワークです。

CrewAIが特に向いているシナリオ:

  • 複数のステップに分解できるビジネスタスク
  • コンテンツ生成、リサーチ、データ分析パイプライン
  • 専門知識を持つ役割分担が明確なワークフロー

次のステップ:

  • pip install crewaiでまず試してみる
  • シンプルな2エージェントのクルーから始める
  • カスタムツールで業務システムと連携

関連記事