コンテンツへスキップ

media AI活用の最前線

ツール比較・実践ガイド 26分で読めます

【2026年最新】CrewAI完全ガイド|役割ベースのマルチエージェント協調設計

結論: CrewAI(現在の安定版 v1.14.x)は、エージェントに「役割(Role)・目標(Goal)・背景(Backstory)」を与えてチームとして協調させる、役割ベースのマルチエージェントOSSフレームワークです。LangGraphが状態グラフで制御フローを明示的に設計するのに対し、CrewAIは「人事マネジメントの感覚でAIチームを編成する」設計思想を持ちます。GitHub Stars 49,900+(2026年5月時点)はOSSエージェントフレームワーク最多水準。

この記事の要点:

  • Agent(Role/Goal/Backstory)+ Task + Crew の3要素と、Sequential / Hierarchical の2プロセスを実装コード付きで完全解説
  • Flows(v0.85+)によるイベント駆動パイプラインと、Short-term / Long-term / Entity の3種メモリ管理を実装例つきで紹介
  • CrewAI vs LangGraph vs AutoGen vs OpenAI Agents SDK の4軸比較表で、「どれを選ぶか」の判断基準を整理

対象読者: Pythonエンジニア・AIエージェント設計中の開発者・OSSフレームワーク選定中の技術担当
読了後にできること: 今日中にAgent + Task + Crewで最初のマルチエージェントチームを動かし、Sequential / Hierarchical の使い分けを判断できる


「LangGraphでグラフを設計するより、チームメンバーを雇う感覚でエージェントを組みたい」

先日、顧問先のプロダクト開発会社(従業員60名)のCTOから、こんな相談を受けました。社内のリサーチレポート自動生成システムを設計する際に、「リサーチャー」「アナリスト」「ライター」という3つの役割を持つエージェントに協調させたい、でもLangGraphのStateGraphを学ぶ工数が取れないというんです。

「それはCrewAIが向いています。Agentに役割を与えてCrewに渡すだけで、チームが動き始めますよ」と即答しました。実際にその会社でCrewAIを導入し、2日でプロトタイプを動かせました。LangGraphなら1週間以上かかっていたはずです。

この記事では、CrewAI v1.14.xのAgent・Task・Crew・Process・Flows・Memoryを徹底解説します。役割ベース設計の利点と落とし穴、Hierarchical ProcessでManager Agentを使う実装ノウハウ、本番運用でのデバッグ難しさまで、コード付きで全公開します。


📅 5月開催|Uravation主催 Zoomウェビナー

講師: 株式会社Uravation代表 佐藤傑(X @SuguruKun_ai) / Yusei Tataka


まず5分で動かす:Agent + Task + Crewの最小構成

AIエージェントの全体像については、AIエージェント導入完全ガイドで体系的にまとめています。まずCrewAIの具体的なコードから始めましょう。

インストールとセットアップ

# CrewAI本体 + ツールパッケージをインストール
pip install crewai crewai-tools

# バージョン確認
python -c "import crewai; print(crewai.__version__)"
# → 0.114.x (2026年5月時点の安定版)

最小構成:2エージェントのリサーチチーム

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool

# ツール定義
search_tool = SerperDevTool()  # SERPER_API_KEY環境変数が必要

# エージェント定義(Role / Goal / Backstory の3要素)
researcher = Agent(
    role="シニアリサーチャー",
    goal="与えられたトピックについて最新かつ正確な情報を収集し、要点をまとめる",
    backstory=(
        "10年以上の調査経験を持つリサーチャー。"
        "複雑なトピックを素早く理解し、信頼性の高い情報源を特定する能力に長けている。"
        "常に一次情報を優先し、憶測では報告しない。"
    ),
    tools=[search_tool],
    verbose=True,
)

writer = Agent(
    role="テクニカルライター",
    goal="リサーチ結果をもとに、読者が理解しやすい技術記事を日本語で執筆する",
    backstory=(
        "5年以上の技術文書執筆経験を持つライター。"
        "複雑な技術概念を平易な言葉で説明することが得意。"
        "構造化された文章と具体的な例を多用する。"
    ),
    verbose=True,
)

# タスク定義
research_task = Task(
    description=(
        "以下のトピックについてリサーチを実施せよ: {topic}\n"
        "最新の情報、統計データ、専門家の見解を収集し、"
        "重要なポイントを箇条書きで最低10項目まとめること。"
    ),
    expected_output="トピックの要点を箇条書きでまとめたリサーチレポート(日本語)",
    agent=researcher,
)

writing_task = Task(
    description=(
        "リサーチャーが収集した情報をもとに、"
        "読者が理解しやすい技術記事を1,500字程度で執筆せよ。"
        "導入・本文・まとめの構成で記述すること。"
    ),
    expected_output="構造化された技術記事(日本語、1,500字程度)",
    agent=writer,
    context=[research_task],  # research_taskの出力を参照
)

# クルー編成(Sequential: リサーチ完了後にライティング開始)
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,
    verbose=True,
)

# 実行
result = crew.kickoff(inputs={"topic": "CrewAI 1.14の新機能"})
print(result.raw)

これだけで「リサーチャーが情報収集 → ライターが記事執筆」という2エージェント協調チームが動きます。LangGraphのStateGraph定義やAutoGenのGroupChat設定と比較して、コードの直感性が圧倒的に高いのがCrewAIの最大の強みです。

CrewAIの3大コンポーネント:Agent / Task / Crew

1. Agent(役割の担い手)

CrewAIのAgentは、組織のメンバーをモデルにした設計です。3つの必須パラメータと、複数のオプションパラメータで構成されます。

from crewai import Agent

agent = Agent(
    # === 必須3要素(Role / Goal / Backstory) ===
    role="データサイエンティスト",          # 役割名(チーム内での立場)
    goal="データから意思決定に役立つ洞察を導き出す",  # 目標(何を達成すべきか)
    backstory=(                            # 背景(どんな経験・価値観を持つか)
        "統計学と機械学習の博士号を持つデータサイエンティスト。"
        "大手金融機関でリスクモデルを設計した経験から、"
        "数値の裏にあるビジネス意味を常に意識している。"
    ),

    # === ツール設定 ===
    tools=[search_tool],        # 使用可能なツールのリスト

    # === LLM設定(デフォルトはGPT-4o) ===
    llm="gpt-4o",               # または任意のLiteLLM対応モデル

    # === 委任制御 ===
    allow_delegation=False,      # 他のエージェントへの作業委任を禁止(デフォルト: True)

    # === 最大反復回数 ===
    max_iter=15,                 # エージェントの最大試行回数(デフォルト: 20)
    max_rpm=10,                  # 1分あたりの最大API呼び出し数

    # === メモリ設定 ===
    memory=True,                 # エージェントレベルのメモリを有効化

    # === 出力形式 ===
    verbose=True,                # 実行ログを詳細表示
)

BackstoryはPrompt Engineering: BackstoryはAgentのシステムプロンプトに変換されます。「5年以上の経験」「大手企業でのXX経験」など、具体的な経歴を書くほど、LLMが「そのキャラクター」に沿った判断をします。抽象的な「優秀なエージェント」より、具体的なペルソナを設定してください。

2. Task(エージェントへの指示書)

from crewai import Task

task = Task(
    # === 指示の核心 ===
    description=(
        "以下のCSVファイルを分析し、売上トレンドを特定せよ: {filename}\n"
        "月別の売上変化率、トップ3製品カテゴリ、季節性パターンを含めること。\n"
        "不足している情報があれば、最初に質問してから分析を開始すること。"  # 事故防止句
    ),

    # === 期待される出力の定義 ===
    expected_output=(
        "売上分析レポート(Markdown形式):\n"
        "1. 月別売上変化率の表\n"
        "2. トップ3製品カテゴリとその理由\n"
        "3. 季節性パターンの解説\n"
        "4. 推奨アクション3点"
    ),

    # === 担当エージェント ===
    agent=data_scientist,

    # === 依存タスク(このタスクの入力として使う) ===
    context=[data_loading_task],   # 前のタスクの出力を文脈として参照

    # === 出力先 ===
    output_file="analysis_report.md",  # 結果をファイルに保存

    # === 構造化出力(Pydantic) ===
    # output_pydantic=SalesReport,  # 型安全な出力を強制する場合
)

3. Crew(チーム編成)

from crewai import Crew, Process

crew = Crew(
    agents=[researcher, analyst, writer],  # チームメンバー
    tasks=[research_task, analysis_task, writing_task],  # タスクリスト

    # === プロセスタイプ(後述) ===
    process=Process.sequential,    # または Process.hierarchical

    # === 全体LLM設定(個別上書き可能) ===
    # manager_llm="gpt-4o",        # Hierarchical時のManagerエージェントのLLM

    # === メモリ設定 ===
    memory=True,                   # クルー全体のメモリを有効化

    # === 並列実行 ===
    max_rpm=10,                    # クルー全体のAPI呼び出し上限

    # === ログ ===
    verbose=True,
    output_log_file="crew_log.txt",  # 実行ログをファイルに保存
)

# 実行(inputs は description 内の {} プレースホルダーに対応)
result = crew.kickoff(inputs={
    "topic": "2026年のマルチエージェントフレームワーク動向",
    "language": "日本語",
})

AI活用、何から始めればいい?

100社以上の研修実績をもとに、30分の無料相談で貴社の課題を整理します。

無料相談はこちら 資料ダウンロード(無料)

Process:Sequential vs Hierarchical の使い分け

CrewAIのプロセスタイプは、チームの仕事の進め方を決定します。OSSエージェントフレームワークの中でも、この「プロセスの概念」はCrewAI独自の強みです。

Sequential Process(直列実行 — デフォルト)

タスクが定義順に一つずつ実行されます。前のタスクの出力が次のタスクの `context` として自動的に渡されます。

from crewai import Crew, Process, Agent, Task

# Sequential: ニュースレター作成パイプライン
topic_researcher = Agent(
    role="トピックリサーチャー",
    goal="今週の生成AI業界の重要ニュースを5件選定する",
    backstory="AI業界を10年ウォッチしている技術ジャーナリスト",
)

summarizer = Agent(
    role="要約エキスパート",
    goal="各ニュースを読者が3分で読めるサマリーに変換する",
    backstory="テック系ニュースレターの編集経験5年。要点を簡潔にまとめる専門家",
)

editor = Agent(
    role="ニュースレターエディター",
    goal="全体のトーンとスタイルを統一し、最終版ニュースレターを完成させる",
    backstory="10年以上のメディア編集経験。読者エンゲージメントを最大化する編集が得意",
)

# タスク定義(直列で実行される)
research_task = Task(
    description="今週の生成AI業界ニュースを調査し、重要度の高い5件を選定して詳細をまとめよ",
    expected_output="5件のニュースそれぞれの概要(各300字程度)",
    agent=topic_researcher,
)

summarize_task = Task(
    description="リサーチャーが選定した5件のニュースを、読者が3分で読めるサマリーに変換せよ",
    expected_output="5件のニュースサマリー(各100字程度、箇条書き)",
    agent=summarizer,
    context=[research_task],  # research_taskの出力を参照
)

edit_task = Task(
    description="サマリーを受け取り、ニュースレター全体のトーンを統一し、最終版を完成させよ",
    expected_output="配信可能なニュースレター最終版(Markdown形式)",
    agent=editor,
    context=[summarize_task],
    output_file="newsletter_2026.md",
)

crew = Crew(
    agents=[topic_researcher, summarizer, editor],
    tasks=[research_task, summarize_task, edit_task],
    process=Process.sequential,
    verbose=True,
)

result = crew.kickoff()

Hierarchical Process(階層型 — Managerエージェントが采配)

Hierarchical ProcessではManagerエージェントが自動的に作成され、タスクの割り当て・進捗監視・品質チェックを担います。タスクに担当エージェントを明示的に指定しなくても、ManagerがRoleとGoalを判断して最適なエージェントに委任します。

from crewai import Crew, Process, Agent, Task

# Hierarchical: 複雑なコード開発チーム
architect = Agent(
    role="ソフトウェアアーキテクト",
    goal="要件定義とシステム設計を担当し、技術的な整合性を確保する",
    backstory="15年のシステム設計経験。大規模分散システムの設計が専門",
)

frontend_dev = Agent(
    role="フロントエンドエンジニア",
    goal="React/TypeScriptで高品質なUIを実装する",
    backstory="React専門のフロントエンドエンジニア。UXと実装品質を両立させる",
)

backend_dev = Agent(
    role="バックエンドエンジニア",
    goal="Python/FastAPIで堅牢なAPIエンドポイントを実装する",
    backstory="Python/FastAPI専門エンジニア。セキュリティとパフォーマンスを重視",
)

qa_engineer = Agent(
    role="QAエンジニア",
    goal="実装されたコードの品質を検証し、バグを特定・報告する",
    backstory="10年のQA経験。自動テストとリグレッションテストの設計が得意",
)

# Hierarchicalではタスクにagentを明示しなくてもManager が割り当てる
implementation_task = Task(
    description=(
        "ユーザー認証機能を実装せよ。要件:\n"
        "- JWT認証、リフレッシュトークン対応\n"
        "- フロントエンド: Reactのログインフォーム\n"
        "- バックエンド: FastAPIエンドポイント\n"
        "- テスト: ユニットテスト・E2Eテスト\n"
        "不足している情報があれば、最初に質問してから実装を開始すること。"
    ),
    expected_output="動作するJWT認証実装(コード + テスト + ドキュメント)",
    # agent を指定しない → Manager が最適なエージェントを選択
)

crew = Crew(
    agents=[architect, frontend_dev, backend_dev, qa_engineer],
    tasks=[implementation_task],
    process=Process.hierarchical,
    manager_llm="gpt-4o",  # ManagerエージェントのLLMを指定(必須)
    # または独自Managerエージェントを使う場合:
    # manager_agent=custom_manager,
    verbose=True,
)

result = crew.kickoff()

Sequential vs Hierarchical の使い分け基準

判断軸Sequential を選ぶHierarchical を選ぶ
タスクの依存関係直線的(A → B → C)複雑・動的(Aの結果次第でBかCへ)
タスク数3〜5個の明確なフェーズ多数・タスク追加が動的に発生
担当エージェントの明確性各タスクの担当が事前に決定できる状況に応じてManagerが判断すべき
コスト低(エージェントLLMコストのみ)高(ManagerLLMの追加コスト発生)
デバッグ難度低(実行順序が固定)高(Manager の判断が不透明になりやすい)
典型的ユースケースコンテンツ生成パイプライン、ETL、レポート生成ソフトウェア開発、複雑な意思決定、動的タスク割当

実際の現場から: 顧問先での経験では、「Hierarchicalを使ったら動きが見えなくてデバッグに3日かかった」という話が多いです。まずSequentialで設計し、タスクの動的割り当てが本当に必要と判断できた段階でHierarchicalに移行することをお勧めします。

crewai-tools:組み込みツール一覧と活用法

OpenAI Agents SDKのFunctionTool相当にあたるのが、CrewAIの `crewai-tools` パッケージです。30種以上の組み込みツールが利用可能で、カスタムツールも簡単に作成できます。

主要組み込みツール

ツール用途必要な環境変数
SerperDevToolGoogle検索(SerpAPI経由)SERPER_API_KEY
WebsiteSearchTool指定URLの内容をRAGで検索なし
FileReadToolローカルファイルの読み取りなし
FileWriterToolローカルファイルへの書き込みなし
CSVSearchToolCSVファイルのRAG検索なし
PDFSearchToolPDFファイルのRAG検索なし
DirectoryReadToolディレクトリ構造の読み取りなし
GitHubSearchToolGitHubリポジトリの検索GITHUB_TOKEN
EXASearchToolExa.ai による意味的Web検索EXA_API_KEY
CodeInterpreterToolPythonコードの安全な実行なし

カスタムツールの作成

from crewai.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type

# 入力スキーマの定義
class DatabaseQueryInput(BaseModel):
    """データベースクエリツールの入力スキーマ"""
    table: str = Field(description="クエリ対象のテーブル名")
    condition: str = Field(description="WHERE句の条件(例: 'status = active')")
    limit: int = Field(default=10, description="取得する最大行数")

# カスタムツールの実装
class DatabaseQueryTool(BaseTool):
    name: str = "データベースクエリツール"
    description: str = (
        "指定されたテーブルとWHERE条件でデータベースをクエリし、結果を返す。"
        "社内データベースの顧客情報、注文情報、在庫情報にアクセスできる。"
    )
    args_schema: Type[BaseModel] = DatabaseQueryInput

    def _run(self, table: str, condition: str, limit: int = 10) -> str:
        # 実際のDB接続ロジック(例: SQLAlchemy)
        # conn = create_engine(DATABASE_URL)
        # result = pd.read_sql(f"SELECT * FROM {table} WHERE {condition} LIMIT {limit}", conn)
        # return result.to_string()

        # サンプル実装
        return f"[{table}] WHERE {condition} の結果: {limit}行を取得しました(サンプル)"

# エージェントにカスタムツールを付与
data_agent = Agent(
    role="データアナリスト",
    goal="社内データベースを分析し、ビジネスインサイトを提供する",
    backstory="SQL専門のデータアナリスト。データから的確なビジネス判断を導く",
    tools=[DatabaseQueryTool(), SerperDevTool()],  # 複数ツールを組み合わせ
)

Flows:イベント駆動パイプラインで複雑なワークフローを制御する

CrewAI v0.85+で追加されたFlowsは、複数のCrewやLLM呼び出しをイベント駆動で連鎖させる上位レイヤーです。単純なCrewだけでは表現しにくい「条件分岐」「ループ」「並列実行」を、Pythonのデコレーターベースで定義できます。

LangGraphとAutogenの違いについては、LangGraph完全ガイドAutoGen完全ガイドで詳しく解説しています。Flowsの設計思想はLangGraphのStateGraphに近いですが、より直感的なAPIが特徴です。

from crewai.flow.flow import Flow, listen, start, router
from pydantic import BaseModel

# Flowの状態を定義(Pydanticモデル)
class ContentCreationState(BaseModel):
    topic: str = ""
    research_result: str = ""
    quality_score: float = 0.0
    final_content: str = ""
    retry_count: int = 0

class ContentCreationFlow(Flow[ContentCreationState]):

    @start()
    def receive_topic(self):
        """フローの開始点:トピックを受け取る"""
        print(f"コンテンツ作成開始: {self.state.topic}")
        return self.state.topic

    @listen(receive_topic)
    def research_phase(self, topic):
        """リサーチフェーズ:Research Crewを実行"""
        research_crew = Crew(
            agents=[researcher],
            tasks=[research_task],
            process=Process.sequential,
        )
        result = research_crew.kickoff(inputs={"topic": topic})
        self.state.research_result = result.raw
        return result.raw

    @router(research_phase)
    def quality_check(self, research_result):
        """品質チェック:スコアに応じてルーティング"""
        # LLMで品質スコアを評価(簡略化)
        word_count = len(research_result.split())
        self.state.quality_score = min(word_count / 100, 1.0)

        if self.state.quality_score >= 0.7:
            return "proceed_to_writing"   # 品質OK → ライティングへ
        elif self.state.retry_count < 2:
            return "retry_research"        # 品質低 + リトライ可能
        else:
            return "fallback_writing"      # リトライ上限 → フォールバック

    @listen("proceed_to_writing")
    @listen("fallback_writing")
    def writing_phase(self, _):
        """ライティングフェーズ:Writing Crewを実行"""
        writing_crew = Crew(
            agents=[writer, editor],
            tasks=[write_task, edit_task],
            process=Process.sequential,
        )
        result = writing_crew.kickoff(inputs={
            "research": self.state.research_result
        })
        self.state.final_content = result.raw
        return result.raw

    @listen("retry_research")
    def retry_research_phase(self, _):
        """リトライ:別の角度でリサーチし直す"""
        self.state.retry_count += 1
        print(f"リサーチをリトライ中... ({self.state.retry_count}回目)")
        return self.state.topic  # receive_topicから再実行

# Flowの実行
flow = ContentCreationFlow()
result = flow.kickoff(inputs={"topic": "CrewAI 2026年の展望"})
print(result)

FlowとCrewの使い分け: 単一のチームが直列/階層的にタスクをこなす場合は Crew だけで十分です。「複数のCrewを条件分岐でつなぐ」「ループ・リトライを含む複雑なワークフロー」「外部イベントトリガーで起動する」ケースで初めてFlowが必要になります。

Memory:3種類のメモリで知識を蓄積する

CrewAIは3種類のメモリシステムを提供し、エージェントがセッションをまたいで知識を蓄積できます。

from crewai import Crew, Process

# メモリを有効化したクルー
crew_with_memory = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,

    # メモリを有効化(3種類が自動的に初期化される)
    memory=True,

    # 埋め込みモデル設定(Short-term / Entity メモリで使用)
    embedder={
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small",
        }
    },

    verbose=True,
)

3種類のメモリの役割

メモリ種別スコープストレージ用途
Short-term Memory1回の実行内ChromaDB(インメモリ)同一セッション内でエージェント間の文脈共有
Long-term Memory実行をまたぐSQLite3(ファイル永続化)過去の成果・学習結果を次回実行に活かす
Entity Memory1回の実行内ChromaDB(インメモリ)人物・企業・概念のナレッジグラフ構築
# メモリをカスタム設定する高度な使い方
from crewai.memory import ShortTermMemory, LongTermMemory, EntityMemory
from crewai.memory.storage.rag_storage import RAGStorage

# Long-term Memoryを明示的に設定(永続化先を指定)
long_term_memory = LongTermMemory()  # デフォルトはSQLite ~/.crewai/long_term_memory_storage.db

# Short-term MemoryをChromaDBで設定
short_term_memory = ShortTermMemory(
    storage=RAGStorage(
        type="short_term",
        allow_reset=True,  # 実行間でクリアする場合
    )
)

crew = Crew(
    agents=[...],
    tasks=[...],
    memory=True,
    short_term_memory=short_term_memory,
    long_term_memory=long_term_memory,
    verbose=True,
)

非同期実行とバッチ処理

import asyncio
from crewai import Crew, Process

async def process_multiple_topics(topics: list[str]) -> list[str]:
    """複数トピックを並列で処理する"""

    async def process_one(topic: str) -> str:
        crew = Crew(
            agents=[researcher, writer],
            tasks=[research_task, writing_task],
            process=Process.sequential,
        )
        # kickoff_async で非同期実行
        result = await crew.kickoff_async(inputs={"topic": topic})
        return result.raw

    # 並列実行(最大同時実行数を制御する場合はsemaphoreを使う)
    semaphore = asyncio.Semaphore(3)  # 同時3件まで

    async def bounded_process(topic):
        async with semaphore:
            return await process_one(topic)

    results = await asyncio.gather(*[bounded_process(t) for t in topics])
    return results

# バッチ実行
topics = ["CrewAI", "LangGraph", "AutoGen", "OpenAI Agents SDK"]
results = asyncio.run(process_multiple_topics(topics))

# または kickoff_for_each でリスト処理
crew = Crew(agents=[...], tasks=[...])
results = crew.kickoff_for_each(inputs=[
    {"topic": t} for t in topics
])

本番運用での4つの落とし穴

落とし穴1:Hierarchical Processで無限ループ / Manager が迷子になる

実際に顧問先での導入事例でよく遭遇するのが、Hierarchical ProcessでManagerが「どのエージェントに何を委任すべきか」を決定できず、繰り返し質問し続ける問題です。

# NG: Manager が迷子になりやすい設定
bad_agent = Agent(
    role="汎用AI",                    # ← 曖昧すぎる役割
    goal="なんでもやる",              # ← 具体性なし
    backstory="何でもできる優秀なAI", # ← Managerが使い方を判断できない
)

# OK: Manager が明確に判断できる設定
good_agent = Agent(
    role="Python コードレビュアー",   # ← 明確な専門領域
    goal=(
        "提供されたPythonコードのバグ、セキュリティ問題、"
        "パフォーマンス改善点を特定し、具体的な修正提案を行う"
    ),
    backstory=(
        "10年のPython開発経験。金融系システムのコードレビューで"
        "100件以上のセキュリティ問題を発見した実績を持つ"
    ),
)

落とし穴2:Task の description が曖昧でエージェントが暴走する

# NG: 何を出力すべきか不明確
bad_task = Task(
    description="売上データを分析して",  # ← 何を分析?どんな形式で?
    expected_output="分析結果",           # ← 何が含まれるべきか不明
    agent=analyst,
)

# OK: description と expected_output を具体的に
good_task = Task(
    description=(
        "添付のCSVファイル(sales_2026.csv)を分析せよ。\n"
        "必須項目:\n"
        "1. 月別売上の前月比変化率(%)\n"
        "2. 売上上位3製品カテゴリとその理由\n"
        "3. 2026年Q2の売上予測(根拠を含む)\n"
        "数字と固有名詞は、根拠(出典/計算式)を添えること。"
    ),
    expected_output=(
        "売上分析レポート(Markdown形式):\n"
        "- 月別変化率テーブル(必須)\n"
        "- トップ3カテゴリの理由説明\n"
        "- 予測値と根拠の説明\n"
        "合計800字以上"
    ),
    agent=analyst,
)

落とし穴3:allow_delegation=True で意図しない委任連鎖が発生

CrewAIのデフォルトでは `allow_delegation=True` になっており、エージェントが他のエージェントに作業を委任できます。これにより「AがBに委任、BがCに委任、CがAに委任」という循環委任ループが発生することがあります。

# 本番環境では allow_delegation=False を基本に
production_agent = Agent(
    role="データアナリスト",
    goal="データ分析に特化した作業のみを実行する",
    backstory="...",
    allow_delegation=False,   # ← 委任を禁止(ループ防止)
    max_iter=10,              # ← 最大反復数を制限
)

# 委任が必要な場合は対象エージェントを明示
agent_with_controlled_delegation = Agent(
    role="プロジェクトリード",
    goal="...",
    backstory="...",
    allow_delegation=True,   # 委任を許可
    max_iter=15,             # より多くの反復を許容
)

落とし穴4:コスト爆発 — Hierarchical + verbose=True の本番投入

Hierarchical ProcessはタスクごとにManagerのLLM呼び出しが追加されます。さらに `verbose=True` のままだと、ログ出力のために追加のLLM呼び出しが発生することがあります。本番環境では必ずコスト計算をしてから移行してください。

# 本番環境のコスト最適化設定
production_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,  # 特別な理由がない限りSequential推奨
    verbose=False,               # 本番ではFalseに
    output_log_file="logs/crew_log.txt",  # ログはファイルに記録
    max_rpm=5,                   # APIレート制限(コスト管理)
)

# コスト試算の基準(GPT-4oの場合)
# Sequential: タスク数 × 平均2-3回のLLM呼び出し
# Hierarchical: 上記 + タスク数 × Manager呼び出し(追加コスト)
# 10タスク × Sequential → 約25回のGPT-4o呼び出し
# 10タスク × Hierarchical → 約40-50回のGPT-4o呼び出し(1.6〜2倍)

4大フレームワーク比較:CrewAI vs LangGraph vs AutoGen vs OpenAI Agents SDK

比較軸CrewAI v1.14LangGraph 1.1AutoGen v0.7.5OpenAI Agents SDK
設計思想役割ベースのチーム状態機械グラフエージェント間会話Handoff型エージェント連鎖
GitHub Stars49,900+(最多)42,000+56,800+(AutoGen全体)8,400+
学習コスト低(2-3日)高(1-2週間)中(3-5日)低(1-2日)
フレームワーク状態活発開発中活発開発中保守モード(MAFが後継)活発開発中
LLM依存なし(LiteLLM対応)なし(汎用)なし(汎用)OpenAI API前提
状態管理TaskのContextで連鎖TypedDict StateGraph会話履歴Contextオブジェクト
Human-in-the-looptask.human_input=Trueinterrupt() / CommandUserProxyAgentカスタム実装必要
メモリShort/Long/Entity 3種Checkpointer(外部DB)会話履歴バッファなし(カスタム実装)
デバッグverboseログのみ(弱め)LangSmith(最強)なし(ログ出力のみ)OpenAI Traces(良好)
得意なユースケース役割ベース協調・コンテンツ生成複雑フロー・本番ワークフローエージェント対話・ブレストOpenAI前提の軽量エージェント
プロトタイプ速度最速(2-3日)遅(10-14日)中(5-7日)速(1-3日)
本番信頼性中(重要タスクでは補強必要)高(62%タスク完了率)低(保守モード)高(OpenAI公式)

フレームワーク選定チートシート

# どのフレームワークを選ぶか? — 5問の診断
#
# Q1: LLMをOpenAI固定で使う?
#   YES → OpenAI Agents SDK 検討
#   NO  → Q2へ
#
# Q2: エージェントに「役割名・目標・背景」を付けて
#     チームとして協調させたい?
#   YES → CrewAI が最もフィット
#   NO  → Q3へ
#
# Q3: エージェント同士が「会話しながら」問題解決する?
#   YES → AutoGen(ただし保守モード注意、MAFへの移行も検討)
#   NO  → Q4へ
#
# Q4: 複雑な条件分岐・ループ・状態管理が必要?
#     本番環境でLangSmithでのデバッグが重要?
#   YES → LangGraph
#   NO  → Q5へ
#
# Q5: まず2-3日でプロトタイプを作って試したい?
#   YES → CrewAI(最速でプロト可能)
#   NO  → 要件を再整理してQ1から

AutoGen / LangGraph との設計思想の根本的な違い

3フレームワークを実際のプロジェクトで使い分けた経験から、設計思想の本質的な違いをお伝えします。

観点CrewAILangGraphAutoGen
メタファー人事部門が採用した社員チーム業務フローチャート / 回路図グループチャット / 会議室
コードの直感性高(人間の組織に近い)低(グラフ理論の知識が必要)中(chat/replyの概念)
制御の透明性中(Task順序は明確)高(グラフで全フロー可視化)低(会話の流れが動的)
拡張性高(Flowsで複雑化対応)高(任意のノード追加可)中(保守モードで停滞)

まとめ:今日から始める3つのアクション

  1. 今日やること: pip install crewai crewai-tools でインストールし、Agent + Task + Crewの最小構成(リサーチャー + ライター の2エージェント)を30分で動かしてみる
  2. 今週中: Sequential Processで自社の業務ワークフロー(レポート生成・コードレビュー・コンテンツ制作など)に合わせた3〜5エージェントのCrew を設計する。まずHierarchicalは使わず、Sequentialで動作確認してから判断する
  3. 今月中: 本番投入を検討する場合、LangGraphとの比較検証を行う。複雑な条件分岐・リトライロジックが必要な場合は、CrewAIのFlowsを使うか、LangGraphのStateGraphで外側を包む「LangGraph + CrewAI ハイブリッド」構成を検討する

あわせて読みたい:


参考・出典


著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー約10万人)。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。

ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。

佐藤傑
この記事を書いた人 佐藤傑

株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー10万人超)。100社以上の企業向けAI研修・導入支援を展開。著書累計3万部突破。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。

この記事をシェア

📧 週1回、AIツール最新情報をお届け

Claude Code・Codex・Cursorなど最新AI実務情報を、月8-12本の厳選記事から要約してメール配信。すでに3,000人以上のAI担当者が購読中です。

※ いつでも登録解除できます。配信頻度は週1〜2回程度。

AIエージェントを企業に安全に導入したい方へ

Claude Code・OpenClaw・Codex等のAIエージェントを、ガバナンス設計込みで導入支援。権限制御・監査ログ・停止条件まで含めた「ハーネス設計」で運用リスクをゼロに。

✓ 1対1のマンツーマン ✓ 全12回・3ヶ月 ✓ 実務ベースの指導
AIエージェント導入支援を見る まずは無料相談

contact お問い合わせ

生成AI研修や開発のご依頼、お見積りなど、
お気軽にご相談ください。

Claude Code 個別指導(1対1・12セッション)をご希望の方はこちらから別途お申し込みください

Claude Code 個別指導 無料相談