概要
CrewAIは、複数のAIにそれぞれ役割を持たせ、
チームのように協力しながらタスクを実行させることができるライブラリです。
本記事では、CrewAIとFlaskを組み合わせて、
商品ジャンル・特徴・ターゲット層を入力すると、AIが商品企画を自動で行うWebアプリを作成します。
市場調査・競合分析・ネーミング・キャッチコピー作成といった工程を、
役割の異なるAIエージェントが分担して担当することで、
人間のチームに近い形で企画を進める構成を紹介します。
「CrewAIを初めて触る方」や
「マルチエージェントの実装イメージを掴みたい方」向けに、
できるだけシンプルな構成で解説しています。
この記事では、CrewAI と Flask を使って、
複数のAIエージェントが商品企画を行うWebアプリを作成します。
- 「CrewAIを触ってみたいが、実用イメージが湧かない」
- 「Flaskと組み合わせた具体例が見たい」
という方向けです。
完成イメージ
ユーザーがフォームに以下を入力すると:
- 商品ジャンル
- 商品の特徴
- ターゲット層
AIが以下を自動生成します。
- 市場分析レポート
- 競合分析
- 商品名案(3案)
- キャッチコピー案(3案)
上記の回答生成を 役割の異なるAIエージェント が担当します。
使用技術
- Python 3.11
- Flask
- CrewAI
- LangChain(ChatOpenAI)
- OpenAI API(gpt-4o-mini)
ディレクトリ構成
project/
├─ app.py
├─ templates/
│ ├─ form.html
│ └─ result.html
└─ utils/
├─ makeAgent.py
├─ makeTask.py
└─ makeCrew.py
CrewAI関連処理は utils に切り出しています。
ユーティリティ
utilsフォルダ内のコード説明になります。
Agent生成(makeAgent.py)
タスクをこなすAIエージェントを生成します。
CrewAIの AIエージェント は、プロジェクトでいう「チームメンバー」です。
from crewai import Agent
def makeAgent(role_agent, gole_agent, backstory_agent, llm_agent):
return Agent(
role=role_agent,
goal=gole_agent,
backstory=backstory_agent,
tools=[],
llm=llm_agent
)
role(役割) / goal(目的) / backstory(役割の特長) をエージェントの引数として設定します。
各引数のイメージは以下になります。
-
role- エージェントの肩書き
-
goal- 何を達成すべきか
-
backstory- 専門性・文脈付与(roleがどんな分野に強いのかを詳しく設定することができます)
Task生成
AIエージェントが実際に作業するタスクを生成します。
CrewAIの Task は、プロジェクトでいう「担当者に割り振られた作業チケット(タスクチケット)」です。
from crewai import Task
def makeTask(description_agent, expected_output_agent, use_agent):
return Task(
description=description_agent,
expected_output=expected_output_agent,
agent=use_agent
)
description(プロンプト) / expected_output(出力の形式) / agent(エージェント) をタスクの引数として設定します。
各引数のイメージは以下になります。
-
description- 実際に LLM に渡される指示文
-
expected_output- 出力の形式を暗示
-
agent- タスクを担当するエージェント
Crew生成
Crewは、複数のAIエージェントとタスクをまとめて管理・実行するための単位です。
プロジェクトで例えると、「メンバー(Agent)と作業チケット(Task)を束ねたプロジェクトチーム」です。
from crewai import Crew
def makeCrew(agents_crew, tasks_crew):
return Crew(
agents=agents_crew,
tasks=tasks_crew
)
上記で設定したエージェントとタスクを引数として、セットします。
Flaskアプリ本体
フォーム表示
@app.route('/', methods=['GET'])
def index():
return render_template('form.html')
フォーム入力値の受け取り
@app.route('/generate', methods=['POST'])
def generate():
genre = request.form['genre']
features = request.form['features']
target = request.form['target']
product_info = f"・商品ジャンル:{genre}\n・特徴:{features}\n・ターゲット層:{target}"
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0.7,
max_completion_tokens=500
)
フォームから受け取った入力を1つのプロンプトとして全エージェントに共有します。
エージェント設計
market = makeAgent("市場調査員", "ターゲットのニーズを分析", "ニーズ分析が得意", llm)
competitor = makeAgent("競合分析官", "競合商品を調査", "ブランド分析が得意", llm)
namer = makeAgent("ネーミング担当", "商品名を考案", "コピー戦略の達人", llm)
copywriter = makeAgent("コピーライター", "キャッチコピーを考案", "SNS向け表現のプロ", llm)
目的とする出力の各分野の専門家をエージェントに設定します。
タスク設計
task1 = makeTask(f"{product_info} に対して市場分析を行ってください", "市場レポート", market)
task2 = makeTask(f"{product_info} に関連する競合商品を調査してください", "競合分析", competitor)
task3 = makeTask(f"{product_info} をもとに商品名を3案考案してください", "商品名案", namer)
task4 = makeTask(f"{product_info} をもとにキャッチコピーを3案考えてください", "キャッチコピー案", copywriter)
Crew実行
crew = makeCrew(
[market, competitor, namer, copywriter],
[task1, task2, task3, task4]
)
result = crew.kickoff()
結果取得
market_report = result.tasks_output[0].raw
competitive_analysis = result.tasks_output[1].raw
goodsname_idea = result.tasks_output[2].raw
catchphrase_idea = result.tasks_output[3].raw
タスクごとに出力結果が生成されるので、それを結果画面に表示すれば完成です。
※実際の入力フォームのコードなどは下記githubのリポジトリから参照することができます。
https://github.com/MoriHaru568/aiagent_goods/tree/main
まとめ
- CrewAIを使うことで、複数のAIが役割を持って協調しながらタスクを進める仕組みを実装できる
- 調査・分析・発想・表現といった工程を分担させることで、人間のチームに近い思考プロセスをAIで再現できる
- マルチエージェント構成により、単一のAIでは難しい複雑なアウトプットやストーリー性のある成果物の生成が可能になる
マルチエージェント構成の入門例 として参考になれば幸いです。

