Multi-Agent Systems
Hệ thống đa Agent. Đội ngũ AI phối hợp
Bạn cần AI viết báo cáo kỹ thuật: tìm dữ liệu, viết code benchmark, soạn bài, kiểm duyệt. 1 Agent làm tất cả hay nhiều Agent chuyên biệt?
Hình minh họa
Orchestration với 3 agent
Coordinator nhận task, phân rã thành subtask rồi giao cho Researcher + Writer. Quan sát tin nhắn bay giữa các node, mỗi agent "suy nghĩ" riêng, và kết quả tổng hợp cuối cùng.
Lưu ý: số message tăng gần như tuyến tính với số agent trong hub-and-spoke. Ở pattern peer-to-peer (P2P), con số này là O(n²). hãy ghi nhớ khi thiết kế hệ thống hơn 5 agent.
Multi-agent không chỉ là "nhiều agent chạy song song". Đó là chuyên môn hoá + kiểm chứng chéo. Coordinator phân rã, specialist làm sâu, và lỗi của agent này được agent khác phát hiện. Giống khoa học: không ai tự peer review bài mình. Orchestrator là "lớp keo" biến n agent rời rạc thành 1 hệ thống có kỷ luật.
5 agent giao tiếp ngang hàng (mọi agent nói chuyện trực tiếp). Có bao nhiêu kênh giao tiếp? Vấn đề gì xảy ra?
Trong hệ trên (3 agent, 8 message), nếu một LLM call tốn 2 giây và chạy tuần tự, tổng thời gian tối thiểu là bao nhiêu?
Giải thích
Hệ thống đa Agent (Multi-Agent System. MAS) sử dụng nhiều AI Agent chuyên biệt phối hợp để hoàn thành 1 nhiệm vụ. Mỗi agent có: (1) role. vai trò riêng, (2) tools. công cụ riêng, (3) memory. bộ nhớ local hoặc shared. Khác với 1 LLM đơn độc, multi-agent chia việc theo chuyên môn và cho phép kiểm chứng chéo.
Ba topology phối hợp phổ biến:
- Điều phối trung tâm (Hub-and-Spoke): 1 coordinator phân công và giám sát. Đơn giản, dễ debug. Đây chính là pattern chúng ta vừa mô phỏng phía trên. Nhược điểm: coordinator là nút cổ chai. nếu nó chậm hoặc bị hallucinate, cả hệ thống chịu.
- Ngang hàng (Peer-to-Peer): Agent giao tiếp trực tiếp. Linh hoạt nhưng phức tạp . Phù hợp debate pattern (2–3 agent tranh luận) hoặc swarm intelligence.
- Phân cấp (Hierarchical): Tổ chức theo cây. Coordinator → sub-coordinator → agents. Mở rộng tốt cho hệ thống 10+ agent. Giống cơ cấu công ty: CEO → manager → staff.
- Orchestrator: 1 coordinator phân rã + phân công (giống mẫu trên).
- Debate: 2 agent đối lập (proposer + critic) tranh luận → giảm hallucination.
- Reflection: 1 agent làm, 1 agent review và yêu cầu sửa đổi → cải thiện chất lượng output.
- Swarm: Nhiều agent đồng hạng, mỗi agent làm 1 phần nhỏ + chia sẻ blackboard → khám phá không gian rộng.
Mỗi tin nhắn giữa agents = thêm API call + tokens. 5 agent × 5 vòng giao tiếp = 25 LLM calls. Đảm bảo lợi ích chuyên môn hoá lớn hơn chi phí coordination. Tác vụ đơn giản: 1 agent đủ tốt. Một nguyên tắc thực nghiệm: nếu single-agent + chain-of-thought đã đạt 85% độ chính xác, việc nâng lên 92% bằng multi-agent có thể tốn 5–10× chi phí. tính kỹ ROI.
- Task đơn giản, có thể giải bằng 1 prompt + 1 tool call.
- Latency quan trọng (chatbot realtime): mỗi message là 1 LLM call thêm.
- Budget hạn hẹp. token cost tăng tuyến tính theo số agent.
- Không có cơ chế guardrail tốt cho agent (risk escalation khi agent "cãi" nhau vô hạn).
Trong LangGraph, state là 1 dict được nhiều node cùng đọc/ghi. Trong CrewAI, shared memory lưu lịch sử công việc. Blackboard pattern giúp agent mới tham gia có thể đọc context thay vì phải được gửi riêng. Nhưng phải cẩn thận race condition và versioning nếu agent chạy song song.
Hai framework phổ biến hiện nay: LangGraph (của LangChain). workflow graph-based với state + node + edge, phù hợp khi bạn cần kiểm soát flow chi tiết + loop + conditional routing. CrewAI. role-based, trực quan hơn khi bạn nghĩ theo "đội ngũ", agent có role/goal/backstory và coordinator gán tasks. Code bên dưới minh hoạ 2 style.
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, WebsiteSearchTool
# ─── Khai báo tools ──────────────────────────────────
search_tool = SerperDevTool()
web_read_tool = WebsiteSearchTool()
# ─── 3 agent chuyên biệt ────────────────────────────
researcher = Agent(
role="Senior Research Analyst",
goal="Tìm 3 xu hướng LLM agent nổi bật năm 2026",
backstory=(
"Bạn là một analyst kỳ cựu chuyên theo dõi arXiv, "
"blog của các lab AI lớn, và GitHub trending."
),
tools=[search_tool, web_read_tool],
verbose=True,
allow_delegation=False,
)
writer = Agent(
role="Technical Writer",
goal="Viết báo cáo 300 từ chuyên nghiệp bằng Tiếng Việt",
backstory=(
"Bạn là một technical writer có 10 năm kinh nghiệm "
"giải thích các khái niệm AI phức tạp cho cả developer và PM."
),
verbose=True,
allow_delegation=False,
)
reviewer = Agent(
role="Quality Reviewer",
goal="Kiểm tra tính chính xác và độ rõ ràng của báo cáo",
backstory="Bạn là editor kỹ tính nhất công ty.",
verbose=True,
)
# ─── Định nghĩa tasks với dependency ─────────────────
research_task = Task(
description=(
"Tìm 3 xu hướng LLM agent nổi bật năm 2026. "
"Trả về JSON [{title, why_it_matters, source_url}]."
),
expected_output="JSON array với 3 xu hướng kèm nguồn.",
agent=researcher,
)
write_task = Task(
description=(
"Viết báo cáo 300 từ dựa trên research output. "
"Giọng văn chuyên nghiệp, dùng ngôi thứ ba."
),
expected_output="Báo cáo Markdown, khoảng 300 từ.",
agent=writer,
context=[research_task], # phụ thuộc output của research
)
review_task = Task(
description="Review báo cáo, chỉ ra lỗi hoặc điểm cần cải thiện.",
expected_output="Danh sách feedback + bản sửa nếu cần.",
agent=reviewer,
context=[write_task],
)
# ─── Lập Crew + chạy ────────────────────────────────
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[research_task, write_task, review_task],
process=Process.sequential, # có thể đổi sang hierarchical
verbose=2,
)
result = crew.kickoff(inputs={"topic": "AI Agents 2026"})
print(result)CrewAI nhấn mạnh khía cạnh role-play: mỗi agent có một "nhân vật" rõ ràng (backstory, goal) giúp LLM giữ vai nhất quán. Tuy trừu tượng đẹp nhưng khi flow phức tạp với loop + conditional, LangGraph tự nhiên hơn.
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, END
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
# ─── Shared state (blackboard) ───────────────────────
class AgentState(TypedDict):
task: str
research: str | None
draft: str | None
review: str | None
iterations: int
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.2)
# ─── 3 node. mỗi node là 1 "agent" ─────────────────
def researcher_node(state: AgentState) -> AgentState:
prompt = (
f"Task: {state['task']}\n"
"Tìm 3 xu hướng LLM agent 2026, trả JSON."
)
resp = llm.invoke([HumanMessage(content=prompt)])
return {**state, "research": resp.content}
def writer_node(state: AgentState) -> AgentState:
feedback = state.get("review") or "(chưa có review)"
prompt = (
f"Viết báo cáo 300 từ dựa trên:\n{state['research']}\n"
f"Phản hồi lần trước (nếu có): {feedback}"
)
resp = llm.invoke([HumanMessage(content=prompt)])
return {
**state,
"draft": resp.content,
"iterations": state.get("iterations", 0) + 1,
}
def reviewer_node(state: AgentState) -> AgentState:
prompt = (
f"Review báo cáo:\n{state['draft']}\n"
"Trả 'OK' nếu đạt, hoặc liệt kê điểm cần sửa."
)
resp = llm.invoke([HumanMessage(content=prompt)])
return {**state, "review": resp.content}
# ─── Conditional edge. quyết định loop hay kết thúc ─
def route_after_review(state: AgentState) -> Literal["writer", "end"]:
review = (state.get("review") or "").strip().upper()
iters = state.get("iterations", 0)
if review.startswith("OK") or iters >= 3:
return "end"
return "writer" # loop lại nếu review không đạt
# ─── Xây graph ──────────────────────────────────────
graph = StateGraph(AgentState)
graph.add_node("researcher", researcher_node)
graph.add_node("writer", writer_node)
graph.add_node("reviewer", reviewer_node)
graph.set_entry_point("researcher")
graph.add_edge("researcher", "writer")
graph.add_edge("writer", "reviewer")
graph.add_conditional_edges(
"reviewer",
route_after_review,
{"writer": "writer", "end": END},
)
app = graph.compile()
# ─── Chạy ───────────────────────────────────────────
final = app.invoke({
"task": "Viết báo cáo xu hướng LLM agent 2026",
"research": None,
"draft": None,
"review": None,
"iterations": 0,
})
print(final["draft"])LangGraph đưa bạn gần với tư duy state machine: flow có thể loop (writer ↔ reviewer) đến khi reviewer OK hoặc đạt max iterations. Đây là điểm mạnh then chốt so với CrewAI "tuần tự" thuần.
Self-reflection vs separate reviewer. một quyết định thiết kế thường gặp. Self-reflection (1 agent tự review) rẻ hơn, ít latency, nhưng thiên vị: LLM có xu hướng đánh giá tích cực với chính output của mình. Separate reviewer tốn 1 LLM call nữa nhưng cho perspective khác. đặc biệt hiệu quả khi reviewer dùng model khác writer (ví dụ writer = gpt-4o-mini, reviewer = claude-opus). "Cross-model review" giảm systematic bias. Rule of thumb: task consequence cao (code production, medical advice) → dùng separate reviewer; task nội dung (email, summary) → self-reflection đủ.
Agent memory. 3 tầng. Working memory: context hiện tại trong 1 lần chạy (thread). Episodic memory: lịch sử các task đã làm. lưu vector DB, retrieve khi task mới vào. Semantic memory: kiến thức trừu tượng rút ra (ví dụ "công ty này ưu tiên phong cách formal"). Multi-agent càng phức tạp càng cần phân biệt rõ: mỗi agent có working memory riêng, nhưng episodic + semantic nên share để đồng bộ hành vi.
So sánh nhanh CrewAI vs LangGraph
| Tiêu chí | CrewAI | LangGraph |
|---|---|---|
| Paradigm | Role-based | Graph state machine |
| Học nhanh | ✅ rất nhanh | Cần thời gian |
| Loop + conditional | Hạn chế | ✅ native |
| Parallel branches | Khá | ✅ tốt |
| Quan sát (tracing) | Tốt | ✅ LangSmith |
| Khi nào dùng? | Team nhỏ, task tuần tự kiểu "viết báo cáo" | Flow phức tạp, cần loop, nhiều điều kiện rẽ nhánh |
Không có "đúng"/"sai". cả 2 framework đều production-ready. Startup thường bắt đầu với CrewAI để prototype nhanh, rồi chuyển sang LangGraph khi flow đủ phức tạp cần kiểm soát. Một số team còn kết hợp: dùng LangGraph làm "meta-orchestrator" và CrewAI cho sub-crew bên trong.
Ví dụ case-study thực tế: một startup travel dùng 5 agent để trả lời yêu cầu "lên kế hoạch du lịch 5 ngày ở Đà Nẵng cho gia đình có 2 trẻ nhỏ":
- Intent Parser. đọc yêu cầu, trích xuất: điểm đến, thời lượng, số người, ràng buộc ("trẻ nhỏ").
- Flight/Transport Agent. tra chuyến bay, thời gian, giá qua tool calls API Skyscanner.
- Hotel Agent. tìm khách sạn family-friendly, có hồ bơi, gần biển.
- Itinerary Agent. xếp lịch 5 ngày, tính drive-time giữa các điểm.
- Coordinator. tổng hợp thành itinerary, kiểm tra conflict (ví dụ: giờ check-in khách sạn > giờ đáp máy bay).
Kết quả: latency ~18s (so với 4s của single-agent), nhưng chất lượng lịch trình cao hơn hẳn. có link booking thật, thời gian hợp lý. Người dùng chấp nhận latency vì đây là task "thi thoảng" chứ không phải realtime chat.
Các nguyên tắc thiết kế MAS tốt:
- Single source of truth: 1 state dùng chung, tránh mỗi agent giữ bản copy riêng.
- Explicit contract: mỗi agent định nghĩa rõ input/output schema (JSON/Pydantic). giảm ambiguity.
- Timeout + fallback: nếu 1 agent timeout, có strategy thay thế (dùng LLM mạnh hơn? escalate người dùng?).
- Stop condition: mọi loop phải có điều kiện dừng. max iterations, confidence threshold, hoặc human approval.
- Observability: log mọi message + trace chi phí. Không có logs = không debug được.
Công thức chi phí đơn giản cho multi-agent:
Với là tổng số LLM call (tính cả message lẫn processing step). Overhead coordination thường thêm 20–40% so với single-agent cho cùng chất lượng đầu ra. Nếu bài toán của bạn không cần chất lượng cao hơn đáng kể, single-agent + prompt engineering tốt vẫn là lựa chọn kinh tế hơn.
Lưu ý production: multi-agent đưa ra thách thức vận hành mới so với chatbot thường:
- Debugging: khi output cuối sai, lỗi ở agent nào? Cần tracing tool (LangSmith, Langfuse, Helicone) để xem message timeline.
- Retry logic: nếu 1 agent fail, retry cả chain hay chỉ agent đó? Cần checkpoint state (LangGraph có built-in).
- Cost cap: đặt hard limit token per request. debate loop có thể chạy vô hạn nếu quên stop condition.
- Prompt drift: khi 1 agent đổi prompt, downstream agent có thể hiểu sai format. Snapshot + version prompt.
Tham khảo bài học liên quan: Agent architecture, Orchestration patterns, Agentic workflows.
- Nhiều Agent chuyên biệt (researcher + writer + reviewer) phối hợp > 1 agent đa năng cho bài toán phức tạp.
- 3 topology chính: Hub-and-Spoke (đơn giản), Peer-to-Peer (O(n²) kênh, linh hoạt), Hierarchical (mở rộng tốt).
- 4 pattern điển hình: Orchestrator (phân rã), Debate (phản biện), Reflection (tự sửa), Swarm (đồng hạng).
- Coordinator = bộ não: phân rã task, route tới specialist, validate, aggregate. Thiếu coordinator → hỗn loạn.
- Trade-off: chất lượng tốt hơn nhưng tốn token × latency × rủi ro error propagation. Tính ROI trước khi deploy.
- Framework: CrewAI (role-based, học nhanh) vs LangGraph (graph state machine, kiểm soát flow mạnh).
Kiểm tra hiểu biết
Khi nào nên dùng multi-agent thay vì single agent?
Multi-agent là bước tiến tự nhiên khi single-agent bị giới hạn: 1 LLM không thể vừa làm web search, vừa viết code, vừa kiểm duyệt chất lượng tốt như 3 agent chuyên biệt phối hợp. Nhưng thiết kế đúng quan trọng hơn là số lượng agent. 3 agent được orchestrate tốt hơn 10 agent chồng chéo nhiệm vụ.
- Nhận diện khi nào multi-agent thật sự đáng giá so với single-agent.
- Chọn topology (hub, P2P, hierarchical) phù hợp với quy mô.
- Hiểu 4 pattern: orchestrator, debate, reflection, swarm.
- Biết viết hệ thống đơn giản bằng CrewAI và LangGraph.
- Tự đánh giá được chi phí / chất lượng / độ phức tạp của hệ.
Gợi ý bài tập: hãy thử viết 1 hệ 3 agent (researcher + writer + reviewer) bằng LangGraph, thêm loop writer ↔ reviewer với điều kiện dừng "OK" hoặc max 3 lần. Đo: tổng token, latency, tỉ lệ hoàn thành so với single-agent chain-of-thought. Con số sẽ cho bạn câu trả lời thực tế liệu multi-agent có đáng trong bài toán của bạn.