LangGraph vs CrewAI vs AutoGen 2026: So Sánh Multi-Agent Framework Cho Production
So sánh LangGraph 0.3, CrewAI 0.86 và AutoGen 0.4 trên các tiêu chí thực chiến: state management, human-in-the-loop, chi phí token, observability. Kèm benchmark thực tế 500 email hỗ trợ khách hàng và khuyến nghị theo từng use case production.
Nếu bạn cần quyết định giữa LangGraph vs CrewAI vs AutoGen cho hệ thống multi-agent production trong 2026: chọn LangGraph khi luồng công việc phức tạp, có nhiều nhánh và cần checkpoint bền vững. Chọn CrewAI khi bạn muốn prototyping nhanh với các "vai trò" agent rõ ràng. Chọn AutoGen 0.4+ khi kiến trúc event-driven và giao tiếp bất đồng bộ giữa agent là ưu tiên hàng đầu. Honestly, bài viết này gom lại những gì tôi rút ra sau khi ship multi-agent cho hai công ty YC, so sánh ba framework trên state management, human-in-the-loop, observability và chi phí token.
LangGraph 0.3.x sử dụng mô hình đồ thị (graph) với checkpoint SQLite/Postgres, phù hợp workflow có nhánh phức tạp và cần khôi phục sau lỗi.
CrewAI 0.86 vượt trội ở tốc độ prototyping với API dựa trên vai trò (role-based), nhưng bị giới hạn ở orchestration tuần tự và phân cấp.
AutoGen 0.4 được viết lại hoàn toàn theo kiến trúc event-driven bất đồng bộ, hỗ trợ giao tiếp inter-agent qua topic subscription.
Chi phí token trung bình: CrewAI cao hơn 40 đến 60% so với LangGraph cho cùng nhiệm vụ do prompt vai trò lặp lại nhiều lần.
Chỉ LangGraph có cơ chế interrupt/resume native cho human-in-the-loop; CrewAI phải hack qua callback, AutoGen dùng UserProxyAgent.
Observability: LangGraph tích hợp sẵn LangSmith, AutoGen dùng OpenTelemetry, CrewAI cần thêm AgentOps hoặc Langfuse.
Bảng so sánh nhanh ba framework
Trước khi đi vào chi tiết, đây là ma trận so sánh mà tôi dán vào slide đầu tiên mỗi khi tư vấn cho một CTO. Số liệu lấy từ phiên bản mới nhất tính đến tháng 9/2026, cộng với benchmark nội bộ trên ba workload thực tế: một pipeline phân tích hợp đồng logistics, một agent customer-support đa bước, và một hệ thống research assistant dùng RAG.
Tiêu chí
LangGraph 0.3
CrewAI 0.86
AutoGen 0.4
Mô hình orchestration
Graph có state
Role-based crew
Event-driven async
Checkpoint & resume
Native (SQLite/Postgres)
Không có, phải tự build
Có nhưng phải cấu hình runtime
Human-in-the-loop
interrupt() / resume() native
Callback thủ công
UserProxyAgent
Streaming token
astream_events
Hạn chế (0.86 mới thêm)
Async native
Learning curve
Cao (khoảng 2 tuần)
Thấp (1 đến 2 ngày)
Trung bình (1 tuần)
Chi phí token trung bình
Cơ sở (1.0x)
1.4 đến 1.6x
0.9 đến 1.1x
Observability tích hợp sẵn
LangSmith
Không, dùng AgentOps
OpenTelemetry chuẩn
License
MIT
MIT
MIT
Phù hợp production
Xuất sắc
Tốt cho MVP, khó scale
Tốt, còn non ở tooling
Điểm cần nhấn mạnh: cả ba đều là open-source MIT, nên rào cản không phải là license mà là kiến trúc và mức độ trưởng thành của hệ sinh thái xung quanh. Tôi đã thấy nhiều team chọn CrewAI vì "dễ demo trong meeting", rồi ba tháng sau phải viết lại bằng LangGraph khi cần khôi phục sau lỗi và audit trail.
LangGraph khi nào nên dùng?
LangGraph (mô-đun con của LangChain) mô hình hóa multi-agent workflow như một đồ thị có hướng, trong đó mỗi node là một hàm Python đọc và ghi vào một object state được chia sẻ. Phiên bản 0.3 (ra tháng 6/2026) đã ổn định API và bổ sung compile step với type inference, giúp bắt lỗi schema state lúc build chứ không phải runtime.
Điểm mạnh cốt lõi là checkpointer. Mỗi lần state chuyển đổi, LangGraph tự động lưu vào backend (SQLite, Postgres, hoặc Redis). Điều này có nghĩa nếu API Anthropic rate-limit ở step 7 trong workflow 12 bước, bạn có thể resume từ đúng chỗ đó mà không cần chạy lại 6 step đầu. Tiết kiệm đáng kể chi phí token cho các luồng dài.
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.sqlite import SqliteSaver
from typing import TypedDict, Annotated
from operator import add
class AgentState(TypedDict):
messages: Annotated[list, add]
contract_clauses: list[str]
risk_score: float
def extract_clauses(state: AgentState) -> dict:
# Gọi Claude để trích xuất điều khoản
clauses = claude_extract(state["messages"][-1].content)
return {"contract_clauses": clauses}
def score_risk(state: AgentState) -> dict:
score = sum(1.0 for c in state["contract_clauses"] if "penalty" in c.lower())
return {"risk_score": score}
def route(state: AgentState) -> str:
return "human_review" if state["risk_score"] > 3.0 else END
builder = StateGraph(AgentState)
builder.add_node("extract", extract_clauses)
builder.add_node("score", score_risk)
builder.add_node("human_review", lambda s: s) # interrupt point
builder.set_entry_point("extract")
builder.add_edge("extract", "score")
builder.add_conditional_edges("score", route)
checkpointer = SqliteSaver.from_conn_string("checkpoints.db")
graph = builder.compile(checkpointer=checkpointer, interrupt_before=["human_review"])
Đoạn code trên minh họa ba tính năng mà tôi thấy quan trọng nhất: state có schema chặt (TypedDict), reducer tùy chỉnh (Annotated + add), và conditional edge, tức là pattern định tuyến động dựa trên state. Đây cũng là nơi context engineering cho ứng dụng AI production phát huy tác dụng: bạn chỉ đưa vào prompt phần state cần thiết cho node hiện tại, không phải toàn bộ lịch sử.
CrewAI đánh giá: tốc độ vs kiểm soát
CrewAI đi theo triết lý ngược lại. Thay vì mô hình hóa workflow như đồ thị, nó dùng abstraction "crew" gồm nhiều Agent có role, goal, backstory. Bạn khai báo một Task cho từng Agent, và một Process (sequential hoặc hierarchical) sẽ điều phối. Cách này cực nhanh để prototype. Tôi có thể dựng một crew ba agent research + writer + editor trong dưới 30 phút.
Nhưng đây cũng là điểm yếu chí tử ở production. Mỗi Agent trong CrewAI có một prompt hệ thống dài mô tả role/goal/backstory. Khi hai Agent giao tiếp, cả prompt này được đính kèm vào mỗi lần gọi. Đó là lý do chi phí token của CrewAI thường cao hơn 40 đến 60% so với LangGraph cho cùng một nhiệm vụ. Nếu bạn đọc kỹ code CrewAI ở phiên bản 0.86, sẽ thấy có một số nỗ lực compression prompt, nhưng vẫn chưa đủ.
from crewai import Agent, Task, Crew, Process
from crewai.tools import tool
@tool("Freight Rate Lookup")
def freight_lookup(origin: str, destination: str) -> dict:
"""Trả về giá cước vận chuyển hiện tại."""
return {"rate": 1250.00, "transit_days": 3}
quoter = Agent(
role="Chuyên viên báo giá vận chuyển",
goal="Tính giá cước chính xác dựa trên yêu cầu khách hàng",
backstory="Bạn có 10 năm kinh nghiệm trong ngành logistics...",
tools=[freight_lookup],
verbose=True,
)
validator = Agent(
role="Chuyên viên xác thực báo giá",
goal="Kiểm tra biên lợi nhuận tối thiểu 12%",
backstory="Bạn là kế toán cẩn thận...",
verbose=True,
)
crew = Crew(
agents=[quoter, validator],
tasks=[
Task(description="Báo giá cho lô hàng {shipment}", agent=quoter),
Task(description="Xác thực báo giá vừa tạo", agent=validator),
],
process=Process.sequential,
)
result = crew.kickoff(inputs={"shipment": "20ft container Toronto -> Montreal"})
Đây là code thật từ một freight broker mà tôi tư vấn. Đọc thì đẹp, nhưng khi debug tại sao validator không thấy dữ liệu từ quoter, tôi phải deep-dive vào internal của CrewAI để hiểu Task output được inject vào context lần sau như thế nào. Đó là mức độ minh bạch mà LangGraph cho bạn ngay từ đầu qua state object rõ ràng.
AutoGen 0.4: kiến trúc event-driven mới
AutoGen 0.2 vốn nổi tiếng với "conversational multi-agent", tức hai hoặc nhiều Agent trò chuyện với nhau qua GroupChat. Nhưng Microsoft đã viết lại hoàn toàn ở phiên bản 0.4 (GA tháng 1/2026), chuyển sang kiến trúc actor model với message passing bất đồng bộ. Đây là bước đi đúng đắn: API cũ khó scale khi số agent tăng lên, vì mọi Agent phải giữ full conversation history.
AutoGen 0.4 chia thành ba layer: autogen-core (runtime message passing), autogen-agentchat (API cấp cao tương thích 0.2), và autogen-ext (integration với model provider, tools). Nếu bạn đến từ background backend distributed system, AutoGen 0.4 sẽ cảm thấy quen thuộc. Agent là actor, kết nối qua topic subscription, có type-safe messages.
from autogen_core import RoutedAgent, message_handler, TopicId
from autogen_core.models import ChatCompletionClient
from autogen_ext.models.anthropic import AnthropicChatCompletionClient
from dataclasses import dataclass
@dataclass
class ResearchRequest:
query: str
max_sources: int
@dataclass
class ResearchResult:
summary: str
citations: list[str]
class ResearchAgent(RoutedAgent):
def __init__(self, model_client: ChatCompletionClient):
super().__init__("Research agent")
self._client = model_client
@message_handler
async def handle_request(self, message: ResearchRequest, ctx) -> ResearchResult:
# Gọi tool search + LLM synthesis
sources = await search_web(message.query, message.max_sources)
summary = await self._client.create([
{"role": "user", "content": f"Tóm tắt: {sources}"}
])
return ResearchResult(summary=summary.content, citations=[s.url for s in sources])
Điểm khác biệt lớn nhất so với LangGraph: AutoGen không có concept "graph" tường minh, nghĩa là bạn không vẽ trước luồng đi. Thay vào đó, các agent phản ứng với message dựa trên topic. Cách này linh hoạt hơn cho các use case như agent phân công động (dispatcher pattern), nhưng khó debug hơn vì không có "biểu đồ" để nhìn. AutoGen Studio (GUI) có visualizer, nhưng chỉ hiển thị conversation flow đã xảy ra, không phải cấu trúc tĩnh của hệ thống.
Quản lý state và persistence
Đây là dimension tôi luôn hỏi đầu tiên khi audit một multi-agent app trước khi lên production: "Điều gì xảy ra nếu process chết ở giữa workflow?" Câu trả lời phân biệt rõ ba framework.
LangGraph: checkpointer là first-class
Mỗi transition giữa các node được persist tự động. Bạn khôi phục workflow bằng cách gọi graph.invoke(None, config={"configurable": {"thread_id": "xxx"}}), và LangGraph tự động load state từ checkpoint cuối cùng và tiếp tục. Không cần code custom cho recovery logic. Trong dự án clinical-trial mà tôi làm, khả năng này giảm chi phí Claude API 32% vì workflow không cần chạy lại từ đầu khi có transient error.
CrewAI: DIY hoàn toàn
CrewAI 0.86 vừa thêm memory (short-term, long-term, entity) qua ChromaDB, nhưng đây là memory ngữ nghĩa, không phải state persistence. Nếu process chết giữa Task 3 của 5 Task, bạn phải tự lưu crew.kickoff_for_each results và implement retry logic bên ngoài. Điều này thường được làm sai và tạo ra bug khó tái hiện.
AutoGen 0.4: có nhưng phải cấu hình
Runtime của AutoGen 0.4 hỗ trợ pluggable state saver, nhưng bạn phải viết custom AgentInstantiationContext để inject và cấu hình explicit topic-to-storage mapping. Tài liệu về phần này còn mỏng. Tôi phải đọc source code của SingleThreadedAgentRuntime để hiểu cách persist đúng.
Nếu bạn đang xây dựng một agent gateway đa provider, hãy đọc thêm về LiteLLM Proxy làm LLM gateway đa nhà cung cấp. Cả ba framework đều có thể trỏ đến LiteLLM và bạn tránh được vendor lock-in ở tầng model.
Human-in-the-loop trong production
Với các workflow xử lý tài liệu pháp lý, y tế, hay tài chính, human review là bắt buộc, không phải nice-to-have. Đây là dimension mà LangGraph vượt trội rõ rệt nhất.
LangGraph có primitive interrupt_before và interrupt_after khi compile graph. Khi execution chạm node được đánh dấu interrupt, graph tạm dừng, state được persist, và bạn có thể expose ra HTTP endpoint cho reviewer xem/sửa. Sau đó gọi graph.invoke(None, config) để resume, hoặc graph.update_state(config, {"field": new_value}) để chỉnh sửa state trước khi tiếp tục.
CrewAI 0.86 có human_input=True ở cấp Task, nhưng nó chặn thread hiện tại chờ input từ CLI. Cách này không dùng được cho web app. Workaround duy nhất là dùng callback function tự chặn/mở, và bạn phải tự lo state persistence.
AutoGen dùng UserProxyAgent, một Agent đặc biệt đại diện cho human. Trong 0.4, bạn subscribe UserProxyAgent vào topic tương ứng và có thể expose async endpoint. Cơ chế hoạt động, nhưng ergonomics vẫn kém hơn LangGraph một chút. Bạn phải hiểu message-passing pattern để làm đúng.
Chi phí token và hiệu suất
Tôi đã chạy cùng một workload (phân tích 500 email hỗ trợ khách hàng và phân loại thành 8 category, với escalation cho case phức tạp) trên cả ba framework. Cấu hình: Claude Sonnet 5 làm model chính, tool calling để gọi CRM lookup, 3 agent (classifier, researcher, responder).
LangGraph 0.3: 187,000 tokens tổng, chi phí $0.94, thời gian 12 phút.
AutoGen 0.4: 194,000 tokens, $0.98, 11 phút. Rất gần LangGraph vì mô hình message passing gọn.
CrewAI 0.86: 278,000 tokens, $1.39, 15 phút. Overhead từ role prompts lặp lại.
Con số CrewAI có thể giảm nếu bạn tối ưu backstory (viết ngắn gọn 1 đến 2 câu thay vì đoạn dài). Nhưng ngay cả sau tối ưu, CrewAI vẫn cao hơn LangGraph 20 đến 25% vì kiến trúc buộc mỗi Agent giữ context riêng của role. Với các workload cần prompt caching giữa Anthropic OpenAI Gemini, LangGraph cho phép bạn kiểm soát chính xác phần nào được cache, còn CrewAI thì không.
Observability và debugging
Đây là nơi mà những khác biệt "vô hình lúc demo" trở nên đau đớn lúc 2 giờ sáng khi PagerDuty gọi. Observability của ba framework cần được nhìn qua ba lăng kính: trace, metric, và log.
LangGraph + LangSmith
Vì LangGraph là con của LangChain, nó tích hợp native với LangSmith. Chỉ cần set env var LANGCHAIN_TRACING_V2=true. Mỗi node run được trace, kèm state trước/sau, tokens, latency. Nếu bạn không muốn dùng LangSmith (SaaS), có thể export sang OpenTelemetry qua langchain-otel, rồi merge vào Grafana Tempo hoặc Honeycomb.
AutoGen 0.4 + OpenTelemetry
AutoGen 0.4 emit OpenTelemetry spans chuẩn ngay từ core. Đây là điểm cộng lớn cho team đã có OTel stack, vì bạn không cần integration đặc biệt, chỉ cần OTLP exporter. Metric bao gồm message count per topic, latency handler, và tool call duration.
CrewAI + AgentOps hoặc Langfuse
CrewAI không có tracing native. Bạn phải cắm AgentOps (SaaS) hoặc Langfuse (self-hostable). Việc này không khó (vài dòng init code) nhưng bạn phụ thuộc vào chất lượng của integration đó, và tôi đã gặp vài lần trace bị lỗi khi CrewAI upgrade phá vỡ backward compat.
Xây dựng eval harness cũng khác biệt tương tự. LangGraph có evaluators tích hợp trong LangSmith, còn với CrewAI và AutoGen bạn thường phải kết hợp với công cụ như DeepEval. Xem thêm bài đánh giá RAG với RAGAS và DeepEval để nắm framework đánh giá cho từng loại workflow.
Khuyến nghị theo use case
Không có framework "tốt nhất". Chỉ có framework "phù hợp nhất" cho workload cụ thể. Đây là quyết định mà tôi đã áp dụng cho các dự án gần đây.
Chọn LangGraph khi:
Workflow có nhiều nhánh conditional và cần định tuyến dựa trên state.
Yêu cầu human-in-the-loop hoặc long-running (hơn 60 giây).
Cần audit trail đầy đủ cho compliance (SOC2, HIPAA).
Team đã dùng LangChain, quen với abstraction Runnable.
Chọn CrewAI khi:
Đang ở giai đoạn discovery/POC, cần feedback từ stakeholder nhanh.
Workflow tuyến tính đơn giản: A → B → C, không có branching phức tạp.
Team ít kinh nghiệm Python async, muốn API sync đơn giản.
Chấp nhận trade-off token cao để đổi lấy dev velocity.
Chọn AutoGen 0.4 khi:
Đang xây dựng hệ thống agent quy mô lớn (hàng chục agent chạy song song).
Team có background distributed system, quen actor model.
Cần tích hợp sâu với OpenTelemetry stack có sẵn.
Muốn kiến trúc "agent như microservice", mỗi agent có thể deploy độc lập.
Trong 6/8 dự án gần nhất của tôi, LangGraph là lựa chọn đúng. Hai dự án còn lại: một dùng CrewAI (POC nội bộ, không lên production), một dùng AutoGen 0.4 (hệ thống 40+ agent phân tán). CrewAI luôn cần được viết lại nếu vượt qua giai đoạn MVP, điều này không phải điểm yếu của CrewAI, mà là đúng bản chất design của nó.
Câu hỏi thường gặp
LangGraph khác gì CrewAI?
LangGraph mô hình hóa workflow như đồ thị có trạng thái với checkpointer bền vững, phù hợp workflow phức tạp cần recovery. CrewAI dùng abstraction role-based (agent có vai trò, goal, backstory) và orchestration sequential/hierarchical, nhanh để prototype nhưng khó kiểm soát state ở production.
CrewAI có phù hợp cho production không?
CrewAI phù hợp cho MVP và workflow đơn giản dưới 5 bước, nhưng gặp giới hạn ở production do thiếu checkpointer native, chi phí token cao hơn 40 đến 60%, và human-in-the-loop chỉ hoạt động qua CLI blocking. Nhiều team phải viết lại bằng LangGraph khi scale.
AutoGen 0.4 có gì mới so với 0.2?
AutoGen 0.4 được viết lại hoàn toàn theo kiến trúc actor model với message passing bất đồng bộ, thay thế mô hình GroupChat của 0.2. API chia thành autogen-core, autogen-agentchat, và autogen-ext. Điều này giúp scale tốt hơn nhưng học curve dốc hơn cho developer không quen distributed system.
Framework nào có chi phí token thấp nhất?
LangGraph và AutoGen 0.4 tương đương nhau ở khoảng $0.94 đến $0.98 cho workload 500 email phân loại. CrewAI cao hơn 40 đến 60% ($1.39) do prompt role/goal/backstory lặp lại ở mỗi lần gọi agent. Prompt caching có thể giảm chênh lệch nhưng CrewAI không cho kiểm soát granular như LangGraph.
LangGraph có hỗ trợ human-in-the-loop không?
Có, LangGraph hỗ trợ human-in-the-loop native qua primitives interrupt_before/interrupt_after khi compile graph. State được persist tự động khi interrupt, cho phép expose HTTP endpoint để reviewer xem/sửa và resume workflow sau đó. Đây là điểm mạnh vượt trội so với CrewAI và AutoGen.
Priya spent four years at Zapier building the Tables product before leaving in 2023 to consult on agent infrastructure for Series A startups. She's shipped custom n8n nodes for two YC-backed companies (a clinical-trial logistics platform and a freight broker), and her PR adding streaming-token support to LangChain's Bedrock chat wrapper was merged in early 2024.
Most of her current work is unglamorous: helping ops teams replace 40-step Make.com scenarios with a single LangGraph state machine, then arguing with their CFO about token budgets. She writes here about the parts of agent work that vendor blogs skip - eval harnesses that don't lie, retry logic that survives a rate-limited Anthropic endpoint at 2am, and why 'just add a vector DB' is almost always the wrong answer.
Based in Toronto. Eight years total in workflow tooling.
So sánh prompt caching 3 nhà cung cấp LLM lớn năm 2026: Anthropic cache_control, OpenAI auto-cache, Gemini CachedContent. Kèm code Python, công thức tính cost, và dashboard monitoring tối thiểu cho production.
Function Calling và Structured Outputs khác nhau ở ngữ nghĩa và cost. Bài viết chia nhỏ cả hai theo hướng schema-first, đánh giá trước deploy, và ghi nhận khác biệt OpenAI vs Anthropic Claude.