はじめに
ChatGPTのような単体のLLMを業務で使うケースはもはや当たり前になりました。しかし実務で自動化したいタスクは、「リサーチ→分析→レポート執筆→レビュー」のように複数の専門的な役割をまたぐことが多く、1つのLLMにすべてを任せると品質が安定しません。
そこで注目されているのが CrewAI です。複数のAIエージェントに役割を与え、チームとして協調させるためのPython製フレームワークです。本記事では、CrewAIの概要から実際のコードまで、エンジニアが読んでそのまま手を動かせるレベルで解説します。
CrewAIとは
CrewAIは、複数のAIエージェント(Agent)を役割分担させて、チーム(Crew)としてタスクを遂行させるためのオープンソースフレームワークです。Pythonで実装されており、2024年頃から急速に人気を集めています。
人間のチームに例えると分かりやすいです。
- リサーチャー:情報収集を担当
- アナリスト:収集した情報を分析
- ライター:分析結果を読みやすい文章にまとめる
これらを個別のエージェントとして定義し、互いに成果物を受け渡しながら一連のワークフローを自律的にこなさせます。
LangChainエージェントとの違い
似たツールとしてLangChainのエージェント機能やAutoGenが挙げられますが、CrewAIの特徴は以下の通りです。
| 観点 | LangChain Agents | CrewAI |
|---|---|---|
| 基本コンセプト | ツールを使う単一エージェント中心 | 役割ベースの複数エージェント連携 |
| 設計思想 | 汎用的なツールチェーン | 人間のチーム構造を模倣 |
| 記述量 | オーケストレーションを自前で組む必要あり | 宣言的にエージェントとタスクを定義 |
| 向いている用途 | 単一タスクの自動化 | 複数工程にまたがる複雑なワークフロー |
LangChainは「道具箱」、CrewAIは「組織図」に近いイメージです。なお、CrewAIはLangChain上に構築されているため、LangChainのツール群をそのまま利用できます。
4つのコアコンセプト
1. Agent(エージェント)
役割(role)、目標(goal)、背景(backstory)を持つ作業者です。LLMとツールを紐付けて定義します。
from crewai import Agent
researcher = Agent(
role="シニアリサーチャー",
goal="指定されたテーマについて信頼性の高い情報を収集する",
backstory="業界調査の経験が豊富なアナリスト。事実と推測を明確に区別する。",
verbose=True
)
backstoryは単なる飾りではありません。エージェントの振る舞いに影響を与えるため、出力品質を左右する重要な要素です。
2. Task(タスク)
エージェントに与える具体的な作業指示です。期待する出力形式(expected_output)を明確に書くことがポイントです。
from crewai import Task
research_task = Task(
description="AIエージェント市場の最新動向を調査し、主要プレイヤーと技術トレンドを整理する",
expected_output="主要プレイヤー5社とその特徴、直近の技術トレンド3点を箇条書きでまとめたレポート",
agent=researcher
)
3. Crew(クルー)
エージェントとタスクを束ねる実行単位です。タスクの実行順序(プロセス)を制御します。
from crewai import Crew, Process
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential # タスクを順番に実行
)
result = crew.kickoff()
4. Process(プロセス)
タスクの進行方式です。
- Sequential:定義した順に実行。最も基本的なパターン
- Hierarchical:マネージャー役のエージェントがタスクを割り振り・統括。複雑なワークフロー向け
実践:リサーチ&記事執筆クルーを動かす
環境構築
pip install crewai crewai-tools
export OPENAI_API_KEY="sk-..."
最小限の実装例
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
search_tool = SerperDevTool()
# エージェント定義
researcher = Agent(
role="リサーチャー",
goal="Web上から正確な情報を収集する",
backstory="ファクトチェックを厳密に行う調査のプロ",
tools=[search_tool],
verbose=True
)
writer = Agent(
role="テクニカルライター",
goal="技術情報を分かりやすい文章にまとめる",
backstory="エンジニア向けメディアでの執筆経験が豊富",
verbose=True
)
# タスク定義
task1 = Task(
description="CrewAIの最新機能について調査する",
expected_output="箇条書き形式の調査メモ",
agent=researcher
)
task2 = Task(
description="調査結果をもとに、エンジニア向けの解説記事を2000字程度で執筆する",
expected_output="Markdown形式の記事本文",
agent=writer
)
# クルー実行
crew = Crew(
agents=[researcher, writer],
tasks=[task1, task2],
process=Process.sequential,
verbose=True
)
result = crew.kickoff()
print(result)
実行すると、リサーチャーが検索ツールを使って情報を集め、その結果をライターが受け取って記事を執筆します。verbose=True にしておくとエージェントの思考過程がログで確認できるため、デバッグ時は必須です。
つまずきポイントと対策
実際に触ってみてハマりやすい点を共有します。
1. expected_output が曖昧だと出力がブレる
「レポートを書く」だけでは毎回構成が変わります。「見出し3つ、各300字以内、箇条書きは使わない」のように具体的に指定しましょう。
2. エージェントを増やせば良いわけではない
役割が重複したエージェントを増やすと、同じような成果物が繰り返されてトークンを無駄に消費します。まずは2〜3体のシンプルな構成から始めるのが鉄則です。
3. コスト管理
マルチエージェントは単体LLM呼び出しの何倍もトークンを消費します。開発中は gpt-4o-mini などの軽量モデルで試行し、本番で高性能モデルに切り替える運用がおすすめです。
4. YAMLベースの設定管理
エージェントやタスクの定義が増えてきたら、CrewAI公式が推奨するYAML設定ファイル方式に移行すると保守性が上がります。
# agents.yaml
researcher:
role: リサーチャー
goal: 正確な情報を収集する
backstory: 調査のプロ
どんな用途に向いているか
- 競合調査レポートの自動生成
- コードレビュー+ドキュメント整備の自動化
- 営業メールの個別最適化(リサーチ→文面作成)
- データ収集から分析、可視化レポートまでの一連のパイプライン
逆に、単発の質問応答やシンプルな分類タスクには過剰です。普通のLLM呼び出しで十分なケースを見極めることも重要です。
まとめ
- CrewAIは複数のAIエージェントをチームとして協調させるPythonフレームワーク
- Agent / Task / Crew / Process の4要素で構成される
- 人間の組織と同じ発想で設計できるため、複雑なワークフローを直感的に実装できる
- まずは2〜3体のシンプルな構成から始め、expected_outputを明確に書くことが成功の鍵
マルチエージェントの実装は、実際に手を動かして試行錯誤するのが一番の近道です。
📚 もっと深く学びたい方へ
AIエージェントやAIアプリ開発を実践的に学べるUdemy講座を公開しています。すべての講座が演習型で、手を動かしながら確実にスキルが身につく構成になっています。以下のリンクから割引価格で受講できますので、ぜひチェックしてみてください。
この記事が参考になったら、ストック・いいねをいただけると励みになります。質問やフィードバックはコメント欄でお待ちしています。