CrewAIの使い方を日本語で解説。インストールからAgent・Task・Crewの概念、リサーチ→ライティングチームの実装例、カスタムツール作成、LangChainとの違いまで網羅的に紹介します。
使い方ガイド
公開: by ToolCraft Lab 約9分で読めます

CrewAI入門 — Pythonでマルチエージェントシステムを構築する完全ガイド【2026年版】

CrewAIの使い方を日本語で解説。インストールからAgent・Task・Crewの概念、リサーチ→ライティングチームの実装例、カスタムツール作成、LangChainとの違いまで網羅的に紹介します。

#CrewAI#マルチエージェント#Python

「1つのAIに全部やらせるのではなく、役割分担させたチームで動かす。それがマルチエージェントの発想です。」 CrewAIを使えば、Pythonで複数のAIエージェントが協調して動くシステムを驚くほどシンプルに構築できます。

本記事では、CrewAIの基本概念(Agent / Task / Crew)から、実際にリサーチ→ライティングチームを構築する実装例、カスタムツールの作成方法、そしてLangChainとの違いまで、日本語で丁寧に解説します。

CrewAIとは

CrewAIは、複数のAIエージェントがチームとして協調してタスクを遂行するマルチエージェントフレームワークです。AIエージェントの基本概念を押さえたい方は、まず「AIエージェントとは?」を読むことをおすすめします。Pythonベースで、直感的なAPIを通じてエージェントの役割・目標・ツールを定義し、チームとして動かすことができます。

CrewAIの特徴

特徴説明
ロールベース設計各エージェントに役割・目標・背景を設定できる
柔軟なプロセスSequential(順次)、Hierarchical(階層型)の実行モード
ツール統合Web検索、ファイル操作、API呼び出し等のツールを装備可能
メモリ機能エージェント間の情報共有、長期記憶に対応
LLM非依存OpenAI、Anthropic、ローカルLLM等を切り替え可能

3つのコア概念

CrewAIを理解するには、以下の3つの概念を押さえれば十分です。

Agent(エージェント): 特定の役割を持つAIメンバー
    ↓ 担当する
Task(タスク): エージェントが遂行する具体的な作業
    ↓ まとめて実行する
Crew(クルー): エージェントとタスクをまとめたチーム

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

前提条件

  • Python 3.10以上
  • OpenAI APIキー(デフォルトのLLM)

インストール

# CrewAIのインストール
pip install crewai

# ツール群も一緒にインストール(推奨)
pip install 'crewai[tools]'

環境変数の設定

# .envファイルに記載
OPENAI_API_KEY=sk-your-api-key-here

# Anthropicを使う場合
ANTHROPIC_API_KEY=sk-ant-your-key-here

プロジェクトの作成(CLI)

CrewAIにはプロジェクトの雛形を生成するCLIが用意されています。

# 新規プロジェクト作成
crewai create crew my-research-crew

# ディレクトリ構成
my-research-crew/
├── src/
   └── my_research_crew/
       ├── config/
   ├── agents.yaml
   └── tasks.yaml
       ├── crew.py
       ├── main.py
       └── tools/
           └── custom_tool.py
├── pyproject.toml
└── README.md

Agent — エージェントの定義

Agentは、特定の役割と目標を持つAIメンバーです。

基本的なエージェント定義

from crewai import Agent

researcher = Agent(
    role="シニアリサーチャー",
    goal="指定されたトピックについて最新かつ正確な情報を収集する",
    backstory="""あなたは10年以上の経験を持つテクノロジーリサーチャーです。
    複雑な技術トピックを調査し、重要なポイントを簡潔にまとめる能力に優れています。
    常に一次情報源に当たり、正確性を最優先にします。""",
    verbose=True,
    allow_delegation=False
)

Agentの主要パラメータ

パラメータ説明必須
roleエージェントの役割
goal達成すべき目標
backstory役割の背景・スキル
tools使用可能なツールのリスト×
llm使用するLLMモデル×
verbose実行過程を表示するか×
allow_delegation他エージェントに作業を委任できるか×
memoryメモリ機能を有効にするか×

LLMの指定

LLMのAPIを使ったPython開発の基礎は「ChatGPT API Pythonガイド」でも解説しています。

from crewai import Agent, LLM

# Anthropic Claudeを使用する場合
agent = Agent(
    role="コードレビュアー",
    goal="Pythonコードの品質を改善する提案を行う",
    backstory="経験豊富なPythonエンジニアです。",
    llm=LLM(
        model="anthropic/claude-sonnet-4-20250514",
        temperature=0.3
    )
)

# ローカルLLM(Ollama)を使用する場合
agent = Agent(
    role="要約担当",
    goal="テキストを簡潔に要約する",
    backstory="要約の専門家です。",
    llm=LLM(
        model="ollama/llama3.2",
        base_url="http://localhost:11434"
    )
)

Task — タスクの定義

Taskは、エージェントが遂行する具体的な作業を定義します。

基本的なタスク定義

from crewai import Task

research_task = Task(
    description="""以下のトピックについて詳細な調査レポートを作成してください。

    トピック: {topic}

    調査すべき項目:
    1. 概要と定義
    2. 最新のトレンドと動向
    3. 主要なプレイヤーとツール
    4. メリットとデメリット
    5. 今後の展望""",
    expected_output="構造化された調査レポート(2000字以上)",
    agent=researcher
)

Taskの主要パラメータ

パラメータ説明必須
descriptionタスクの詳細な説明
expected_output期待される出力の形式
agentタスクを担当するエージェント
toolsこのタスクで使用するツール×
context参照する先行タスクのリスト×
output_file結果を保存するファイルパス×
output_jsonJSON形式で出力する場合のPydanticモデル×

タスク間の依存関係

context パラメータで、先行タスクの結果を参照できます。

writing_task = Task(
    description="""リサーチ結果をもとに、技術ブログ記事を執筆してください。

    記事の要件:
    - タイトルは読者の興味を引くものにする
    - 初中級者が理解できるレベルで書く
    - コード例を含める
    - H2/H3の見出し構成で読みやすくする""",
    expected_output="Markdown形式の技術ブログ記事(3000字以上)",
    agent=writer,
    context=[research_task],  # リサーチ結果を参照
    output_file="output/article.md"
)

Crew — チームの構成と実行

Crewは、エージェントとタスクをまとめて実行するチームです。

基本的なCrew定義

from crewai import Crew, Process

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

# 実行
result = crew.kickoff(inputs={"topic": "2026年のAIエージェント技術動向"})

print(result.raw)           # 最終出力のテキスト
print(result.token_usage)   # トークン使用量

プロセスタイプ

プロセス説明適したケース
Process.sequentialタスクを定義順に実行パイプライン型の処理
Process.hierarchicalマネージャーエージェントが自動でタスクを振り分け複雑なプロジェクト

Hierarchicalプロセスの例

from crewai import Crew, Process

crew = Crew(
    agents=[researcher, writer, editor],
    tasks=[research_task, writing_task, editing_task],
    process=Process.hierarchical,
    manager_llm="gpt-4o",  # マネージャーのLLM
    verbose=True
)

実装例: リサーチ→ライティングチーム

実際に動くマルチエージェントシステムを構築してみましょう。テーマに関する調査を行い、その結果をもとにブログ記事を執筆するチームです。

完全なコード

from crewai import Agent, Task, Crew, Process, LLM
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
)

# エージェント2: ライター
writer = Agent(
    role="テクニカルライター",
    goal="調査結果を元に、初中級エンジニアが理解しやすいブログ記事を執筆する",
    backstory="""あなたはテクニカルライティング歴10年のプロのライターです。
    複雑な技術トピックを平易な言葉で解説するスキルに定評があります。
    SEOを意識した構成で、実用的なコード例を交えた記事を書きます。""",
    verbose=True
)

# エージェント3: エディター
editor = Agent(
    role="シニアエディター",
    goal="記事の品質を最終チェックし、読みやすさと正確性を向上させる",
    backstory="""あなたは技術メディアで編集長を務めた経験があります。
    文章の論理構成、技術的正確性、読者目線での分かりやすさを
    バランスよくチェックし、改善提案を行います。""",
    verbose=True
)

# タスク1: リサーチ
research_task = Task(
    description="""以下のトピックについて包括的な調査を行ってください。

    トピック: {topic}

    調査項目:
    1. 技術の概要と背景
    2. 最新のトレンドとアップデート
    3. 主要なツール・サービスの比較
    4. 実際のユースケース
    5. メリット・デメリット
    6. 今後の展望

    複数の情報源から調査し、一次情報を優先してください。""",
    expected_output="構造化された調査レポート(日本語、2000字以上)",
    agent=researcher
)

# タスク2: ライティング
writing_task = Task(
    description="""リサーチ結果をもとに、技術ブログ記事を執筆してください。

    記事の要件:
    - 冒頭にフック文を配置(太字)
    - H2/H3の見出し構成でSEOを意識
    - 初中級エンジニアが理解できるレベル
    - コード例を最低3つ含める
    - 比較表を1つ以上含める
    - 「です・ます」調で統一
    - 3000字以上""",
    expected_output="Markdown形式の技術ブログ記事",
    agent=writer,
    context=[research_task]
)

# タスク3: 編集
editing_task = Task(
    description="""記事の最終レビューを行い、以下の観点でチェック・修正してください。

    チェック項目:
    1. 技術的な正確性
    2. 文章の論理構成
    3. 誤字脱字
    4. コード例の動作確認
    5. SEO観点(見出し構成、キーワード配置)
    6. 読者目線での分かりやすさ""",
    expected_output="レビュー済みの完成版ブログ記事(Markdown形式)",
    agent=editor,
    context=[writing_task],
    output_file="output/final_article.md"
)

# Crewの構成と実行
crew = Crew(
    agents=[researcher, writer, editor],
    tasks=[research_task, writing_task, editing_task],
    process=Process.sequential,
    verbose=True
)

# 実行
result = crew.kickoff(inputs={
    "topic": "2026年のAIエージェント開発フレームワーク最新動向"
})

print("=" * 50)
print("最終出力:")
print(result.raw)
print(f"\nトークン使用量: {result.token_usage}")

実行結果の例

python main.py

# 出力例:
# [リサーチャー] 調査を開始します...
# [リサーチャー] Web検索: "AI agent framework 2026 trends"
# [リサーチャー] 調査レポートを作成しました
# [ライター] リサーチ結果をもとに記事を執筆します...
# [ライター] 記事の執筆が完了しました
# [エディター] 最終レビューを行います...
# [エディター] レビュー完了。output/final_article.md に保存しました

カスタムツールの作成

CrewAIでは、独自のツールを作成してエージェントに装備させることができます。

基本的なカスタムツール

from crewai.tools import BaseTool
from pydantic import Field
import requests

class QiitaSearchTool(BaseTool):
    """Qiitaの記事を検索するカスタムツール"""
    name: str = "Qiita検索"
    description: str = "Qiitaの技術記事を検索し、関連する記事のタイトルとURLを返します"

    def _run(self, query: str) -> str:
        """検索を実行"""
        url = "https://qiita.com/api/v2/items"
        params = {
            "query": query,
            "per_page": 5
        }
        headers = {
            "Authorization": f"Bearer {os.getenv('QIITA_TOKEN')}"
        }

        response = requests.get(url, params=params, headers=headers)
        articles = response.json()

        results = []
        for article in articles:
            results.append(
                f"- [{article['title']}]({article['url']}) "
                f"(LGTM: {article['likes_count']})"
            )

        return "\n".join(results) if results else "記事が見つかりませんでした"

デコレータを使った簡易定義

from crewai.tools import tool

@tool("GitHub リポジトリ検索")
def github_search(query: str) -> str:
    """GitHubのリポジトリを検索し、スター数順で上位5件を返します"""
    url = "https://api.github.com/search/repositories"
    params = {
        "q": query,
        "sort": "stars",
        "per_page": 5
    }

    response = requests.get(url, params=params)
    repos = response.json().get("items", [])

    results = []
    for repo in repos:
        results.append(
            f"- {repo['full_name']}{repo['stargazers_count']} "
            f"({repo['description'][:80]})"
        )

    return "\n".join(results)

カスタムツールの装備

researcher = Agent(
    role="リサーチャー",
    goal="技術トピックの調査",
    backstory="技術リサーチの専門家です。",
    tools=[QiitaSearchTool(), github_search]
)

CrewAIとLangChainの違い

CrewAIとLangChainはどちらもAIアプリケーション開発に使われますが、アプローチが大きく異なります。

比較表

観点CrewAILangChain
設計思想マルチエージェント協調LLMアプリのビルディングブロック
抽象レベル高レベル(Agent/Task/Crew)低〜中レベル(Chain/Agent/Tool)
学習コスト低い(直感的なAPI)高い(概念が多い)
柔軟性エージェント協調に特化汎用的で何でも作れる
メモリ組み込みで対応別途設定が必要
ユースケースチームワーク型タスク単一エージェント〜複雑なパイプライン

使い分けの指針

  • 「複数の専門家が協力して1つのアウトプットを作る」 → CrewAI
  • 「LLMを組み込んだカスタムアプリケーションを作る」 → LangChain
  • 「両方の良さを使いたい」 → CrewAI内でLangChainのツールを利用
# LangChainのツールをCrewAIで使う例
from langchain_community.tools import DuckDuckGoSearchRun
from crewai import Agent

ddg_search = DuckDuckGoSearchRun()

agent = Agent(
    role="リサーチャー",
    goal="情報収集",
    backstory="調査のプロです。",
    tools=[ddg_search]  # LangChainのツールをそのまま渡せる
)

メモリ機能

CrewAIのメモリ機能を使うと、エージェント間の情報共有や、過去の実行結果の記憶が可能です。

メモリの種類

メモリタイプ説明
Short-term Memory現在のCrew実行内での情報共有
Long-term Memory実行をまたいだ学習・記憶
Entity Memory登場する人物・組織・概念の記憶

メモリの有効化

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    memory=True,  # メモリ機能を有効化
    verbose=True
)

メモリを有効にすると、エージェントは過去の実行結果を学習し、回を重ねるごとに出力品質が向上していきます。

デバッグとトラブルシューティング

verbose出力の活用

# 詳細な実行ログを確認
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    verbose=True  # 各エージェントの思考過程が表示される
)

よくあるエラーと解決策

APIキーのエラー

# 環境変数が正しく設定されているか確認
echo $OPENAI_API_KEY

# python-dotenvを使う場合
pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()

ツールの実行エラー

# ツールのテストを個別に実行
tool = SerperDevTool()
result = tool.run("test query")
print(result)

トークン上限のエラー

# max_tokensを明示的に設定
agent = Agent(
    role="ライター",
    goal="記事を書く",
    backstory="ライターです。",
    max_iter=5,  # 最大反復回数を制限
    llm=LLM(
        model="gpt-4o",
        max_tokens=4096
    )
)

実用的なユースケース

CrewAIは以下のようなシナリオで特に威力を発揮します。

1. コンテンツ制作パイプライン

リサーチャー → ライター → エディター → SEO担当

2. コードレビューチーム

セキュリティ担当 → パフォーマンス担当 → レビューまとめ担当

3. 市場調査チーム

データ収集担当 → 分析担当 → レポート作成担当

4. カスタマーサポート

問い合わせ分類担当 → 回答作成担当 → 品質チェック担当

まとめ — CrewAIでマルチエージェント開発を始めよう

CrewAIは、マルチエージェントシステムの構築を驚くほどシンプルにしてくれるフレームワークです。

  • 3つの概念だけ: Agent・Task・Crewを理解すれば始められる
  • ロールベース: 各エージェントに専門的な役割を割り当てて協調させる
  • ツール拡張: カスタムツールやLangChainのツールを自由に組み合わせ可能
  • プロダクション対応: メモリ機能やエラーハンドリングで本番運用にも対応

CrewAI・AutoGen・LangGraphの違いが気になる方は「CrewAI vs AutoGen vs LangGraph 比較」も参考にしてください。まずは本記事のリサーチ→ライティングチームの例をそのまま動かしてみてください。マルチエージェントの可能性を実感できるはずです。複雑なタスクを「チームで解決する」というアプローチは、AI活用の次のステージを切り開く鍵になるでしょう。エージェント開発のより包括的な入門は「AIエージェント開発入門」をご覧ください。