個人開発者の田中健太さん(仮名)は、ECサイトのAIカスタマーサービスを構築しようとしていた。「深夜の問い合わせ対応を減らしたい。でも、複数のAIエージェントを連携させるのは、どこから手を付ければいいのだろう」。同じ頃、企業のR&D部門では、社内の技術ドキュメントを検索できるRAGシステムへの移行を計画していた。両者が直面したのは、同じ問いだった——CrewAIとLangGraph、どちらのフレームワークを選ぶべきか。
本稿では、実際のユースケースに基づき、両フレームワークのアーキテクチャ、性能、価格ropicademono、そしてHolySheep AIとの統合方法に至るまで、私が実際に検証した結果を示す。
CrewAI vs LangGraph:基本架构の違い
CrewAIは「Agentic AI」に特化したフレームワークで、複数のAIエージェントを「Crew」として組織し、タスクを分担させる構造が直感的に理解しやすい。一方、LangGraphはLangChainファミリーの一部として、状態グラフ(StateGraph)を基盤とした宣言的な制御フローを持つ。私が両方を実際に使って感じたのは、CrewAIは「人が組織されるように」agentsを配置し、LangGraphは「水が流れるように」stateを伝播させるアーキテクチャだ。
實際のユースケースでの比較
ケース1:ECサイトのAIカスタマーサービス
田中さんのケースでは、以下の要件があった:
- 商品説明の問い合わせ対応
- 注文状況の自動確認
- 複雑な投诉の人間へのエスカレーション
- 24時間365日の稼働
CrewAIを採用した場合、エージェント構成は以下のようになる:
from crewai import Agent, Crew, Task
from langchain_openai import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1"
llm = ChatOpenAI(
model="gpt-4.1",
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.environ["OPENAI_API_BASE"]
)
商品問い合わせ専門エージェント
product_agent = Agent(
role="商品問い合わせ担当",
goal="顧客の商品に関する疑問を正確に答える",
backstory="10年経験を持つECサイトの商品スペシャリスト",
llm=llm,
verbose=True
)
注文確認専門エージェント
order_agent = Agent(
role="注文確認担当",
goal="注文状況を確認し、正確な情報を提供する",
backstory="物流・在庫管理の专业知识を持つ",
llm=llm,
verbose=True
)
エスカレーション判断エージェント
escalation_agent = Agent(
role="エスカレーション判断担当",
goal="人間による対応が必要なケースを見極める",
backstory="カスタマーサービスのマネージャー経験15年",
llm=llm,
verbose=True
)
タスク定義
product_inquiry_task = Task(
description="顧客からの商品説明問い合わせに回答する: {customer_query}",
expected_output="商品の特徴、利点、価格の説明",
agent=product_agent
)
order_check_task = Task(
description="注文番号 {order_id} の状況を確認する",
expected_output="注文状態、配送状況の詳細",
agent=order_agent
)
escalation_task = Task(
description="Complex query: {complex_query} を評価し、人間対応が必要か判断する",
expected_output="エスカレーションの要否と理由",
agent=escalation_agent
)
Crewの構成と実行
crew = Crew(
agents=[product_agent, order_agent, escalation_agent],
tasks=[product_inquiry_task, order_check_task, escalation_task],
process="hierarchical" # 階層的プロセス
)
result = crew.kickoff(inputs={
"customer_query": "おすすめのノートPCを教えてください",
"order_id": "ORD-12345",
"complex_query": "過去3回配送が迟れた場合の対応希望"
})
print(result)
ケース2:企業RAGシステム
RAG(Retrieval-Augmented Generation)システムでは、LangGraphの方が柔軟性が高い。状態グラフを使うことで、検索→評価→再検索→生成というフローを明示的に制御できる。
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from typing import TypedDict, Annotated
import operator
from langchain_core.messages import BaseMessage, HumanMessage
from langchain_openai import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1"
llm = ChatOpenAI(
model="gpt-4.1",
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.environ["OPENAI_API_BASE"]
)
状态的定義
class RAGState(TypedDict):
messages: Annotated[list[BaseMessage], operator.add]
question: str
context: str
relevance_score: float
iteration: int
ノードの定義
def retrieve(state: RAGState) -> RAGState:
"""関連ドキュメントを検索"""
# 实际の実装ではベクトルデータベースを使用
retrieved_docs = ["doc1_content", "doc2_content", "doc3_content"]
return {"context": "\n".join(retrieved_docs)}
def grade_documents(state: RAGState) -> RAGState:
"""文書の関連性を評価"""
question = state["question"]
context = state["context"]
prompt = f"質問: {question}\n文脈: {context}\n関連性を0-1で評価:"
response = llm.invoke(prompt)
try:
score = float(response.content.strip())
except:
score = 0.5
return {"relevance_score": score, "iteration": state.get("iteration", 0) + 1}
def generate(state: RAGState) -> RAGState:
"""最終回答を生成"""
prompt = f"質問: {state['question']}\n文脈: {state['context']}\n回答:"
response = llm.invoke(prompt)
return {"messages": [HumanMessage(content=response.content)]}
def should_retry(state: RAGState) -> str:
"""関連性が低ければ再検索"""
if state["relevance_score"] < 0.6 and state["iteration"] < 3:
return "search"
return "END"
グラフの構築
workflow = StateGraph(RAGState)
workflow.add_node("search", retrieve)
workflow.add_node("grade", grade_documents)
workflow.add_node("generate", generate)
workflow.set_entry_point("search")
workflow.add_edge("search", "grade")
workflow.add_conditional_edges("grade", should_retry, {
"search": "search",
"END": "generate"
})
workflow.add_edge("generate", END)
app = workflow.compile()
実行
result = app.invoke({
"messages": [],
"question": "最新の決算报告中での収益增长率は?",
"context": "",
"relevance_score": 0.0,
"iteration": 0
})
for message in result["messages"]:
print(message.content)
アーキテクチャと性能の比較
| 評価項目 | CrewAI | LangGraph |
|---|---|---|
| アーキテクチャ | Agent-Based(人物構成型) | StateGraph(状態遷移型) |
| 学習コスト | 低〜中(直感的なAPI設計) | 中〜高(グラフ概念の理解が必要) |
| 並行処理 | Sequential / Hierarchical | カスタム制御可能 |
| 狀態管理 | 暗黙的(タスク間で共有) | 明示的(TypedDictで定義) |
| 外部ツール統合 | LangChain Tools対応 | LangChain Native + カスタム |
永続化
関連リソース関連記事 |