結論: 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ウェビナー
- 【5/23(土) 14:00-17:00】AI活用入門講座 — ChatGPT・Gemini・Claude・NotebookLM・Manus 全部触る3時間(早割 ¥3,000、5/16締切 / 通常 ¥4,000)
- 【5/24(日)】Claude Code 活用講座【実践編】 — 活用事例50選と業務実装テクニック(早割 ¥3,000)
講師: 株式会社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": "日本語",
})
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種以上の組み込みツールが利用可能で、カスタムツールも簡単に作成できます。
主要組み込みツール
| ツール | 用途 | 必要な環境変数 |
|---|---|---|
| SerperDevTool | Google検索(SerpAPI経由) | SERPER_API_KEY |
| WebsiteSearchTool | 指定URLの内容をRAGで検索 | なし |
| FileReadTool | ローカルファイルの読み取り | なし |
| FileWriterTool | ローカルファイルへの書き込み | なし |
| CSVSearchTool | CSVファイルのRAG検索 | なし |
| PDFSearchTool | PDFファイルのRAG検索 | なし |
| DirectoryReadTool | ディレクトリ構造の読み取り | なし |
| GitHubSearchTool | GitHubリポジトリの検索 | GITHUB_TOKEN |
| EXASearchTool | Exa.ai による意味的Web検索 | EXA_API_KEY |
| CodeInterpreterTool | Pythonコードの安全な実行 | なし |
カスタムツールの作成
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 Memory | 1回の実行内 | ChromaDB(インメモリ) | 同一セッション内でエージェント間の文脈共有 |
| Long-term Memory | 実行をまたぐ | SQLite3(ファイル永続化) | 過去の成果・学習結果を次回実行に活かす |
| Entity Memory | 1回の実行内 | 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.14 | LangGraph 1.1 | AutoGen v0.7.5 | OpenAI Agents SDK |
|---|---|---|---|---|
| 設計思想 | 役割ベースのチーム | 状態機械グラフ | エージェント間会話 | Handoff型エージェント連鎖 |
| GitHub Stars | 49,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-loop | task.human_input=True | interrupt() / Command | UserProxyAgent | カスタム実装必要 |
| メモリ | 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フレームワークを実際のプロジェクトで使い分けた経験から、設計思想の本質的な違いをお伝えします。
| 観点 | CrewAI | LangGraph | AutoGen |
|---|---|---|---|
| メタファー | 人事部門が採用した社員チーム | 業務フローチャート / 回路図 | グループチャット / 会議室 |
| コードの直感性 | 高(人間の組織に近い) | 低(グラフ理論の知識が必要) | 中(chat/replyの概念) |
| 制御の透明性 | 中(Task順序は明確) | 高(グラフで全フロー可視化) | 低(会話の流れが動的) |
| 拡張性 | 高(Flowsで複雑化対応) | 高(任意のノード追加可) | 中(保守モードで停滞) |
まとめ:今日から始める3つのアクション
- 今日やること:
pip install crewai crewai-toolsでインストールし、Agent + Task + Crewの最小構成(リサーチャー + ライター の2エージェント)を30分で動かしてみる - 今週中: Sequential Processで自社の業務ワークフロー(レポート生成・コードレビュー・コンテンツ制作など)に合わせた3〜5エージェントのCrew を設計する。まずHierarchicalは使わず、Sequentialで動作確認してから判断する
- 今月中: 本番投入を検討する場合、LangGraphとの比較検証を行う。複雑な条件分岐・リトライロジックが必要な場合は、CrewAIのFlowsを使うか、LangGraphのStateGraphで外側を包む「LangGraph + CrewAI ハイブリッド」構成を検討する
あわせて読みたい:
- LangGraph完全ガイド — 状態機械型のグラフ設計でより複雑なフローを制御
- AutoGen完全ガイド — エージェント同士の会話を基本単位にしたGroupChat設計
- OpenAI Agents SDK完全ガイド — OpenAI公式のHandoff型エージェント設計
- AIエージェントセキュリティ完全ガイド:OWASP LLM Top 10対応、4層モデル、本番運用30項目チェックリスト
- AIエージェント観測・評価完全ガイド:LangSmith/Langfuse/RAGAS/DeepEvalで本番品質を可視化
- AIエージェントMemory完全ガイド:Mem0/Zep/Lettaで永続記憶を実装、Core/Archival/Recall 3層モデル
- AI Voiceエージェント7強完全比較:Vapi/Retell/ElevenLabs/Deepgramほか電話AI比較
- AIカスタマーサポート7強完全比較:Decagon/Sierra/Intercom Fin等のCS AI基盤比較
- 士業のAI活用完全ガイド:税理士/社労士/弁護士/司法書士/行政書士の実践プロンプト10選
- Codex×経理 自動化プロンプト10選:経理特化10シーンで最大80%削減
- Codex×Excel自動化プロンプト10選:VBA/Apps Script/Power Query代替
- Codex×業務15選 部署別ガイド:営業/マーケ/人事/法務/経企/情シス/CSの15シーン
参考・出典
- GitHub - crewAIInc/crewAI — crewAI公式リポジトリ(参照日: 2026-05-07)
- Processes — CrewAI公式ドキュメント — Sequential / Hierarchical プロセス解説(参照日: 2026-05-07)
- Memory — CrewAI公式ドキュメント — 3種類のメモリシステム解説(参照日: 2026-05-07)
- Tools — CrewAI公式ドキュメント — crewai-tools 組み込みツール一覧(参照日: 2026-05-07)
- CrewAI vs LangGraph vs AutoGen — DataCamp — 3フレームワーク比較(参照日: 2026-05-07)
- CrewAI 1.1.0 リリースノート — CrewAI Community — 最新リリース情報(参照日: 2026-05-07)
著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー約10万人)。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。
ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。











