Chào mọi người đến với bài viết thứ 3 trong series Hành Trình Khám Phá LangGraph: Muốn "Hero" bạn phải bắt đầu từ "Zero" , Với 2 bài viết trước mình đã chia sẽ với các bạn về khá kĩ công cụ xây dựng graph và cụ thể trong một bài toán chatbot AI sẽ cần phải làm gì khi bạn muốn xây dụng cấu trúc hệ thống ở dạng đồ thị. Bên cạnh đó chúng ta mắm được về một cơ chế quan trọng trong quá trình vận hành một graph system đó chính là HITL (Human-in-the-loop). Bạn có thể tìm và tìm hiểu trước 2 bài viết đó ở đây để trước khi bắt đầu vào bài toán này nhé
[LangGraph Series] Part 1: Master of Graph với LangGraph trong Xây dựng Chatbot AI
[LangGraph Series] Part 2: Bàn tay con người giữa cỗ máy - Human-In-The-Loop
Giờ thì hãy cùng mình tới chương cuối của series này thôi nào !! MULTI-AGENT
Motivation
Trong thời đại AI phát triển nhanh chóng, chatbot truyền thống thường bị giới hạn bởi khả năng xử lý thông tin một chiều và phạm vi kiến thức hẹp. Người dùng ngày càng mong muốn những trợ lý ảo không chỉ trả lời câu hỏi đơn giản mà còn có thể phân tích, tổng hợp và đưa ra lời khuyên toàn diện như một “cố vấn” thực thụ.
Tuy nhiên, việc xây dựng một hệ thống AI có thể thực hiện đa nhiệm, xử lý các yêu cầu phức tạp và có khả năng phối hợp nhiều nguồn kiến thức khác nhau không phải là điều dễ dàng. Các mô hình LLM đơn lẻ thường không thể giải quyết triệt để các tác vụ đa dạng cùng lúc, và việc tích hợp nhiều mô hình hoặc agent để cùng làm việc cũng gặp nhiều thách thức về quản lý, giao tiếp và đồng bộ.
Chính vì thế, mình bắt đầu tìm hiểu và thử nghiệm multi-agent systems (hệ thống nhiều agent) – nơi mỗi agent đảm nhận một nhiệm vụ chuyên biệt nhưng có thể phối hợp hiệu quả để giải quyết những vấn đề phức tạp hơn. LangGraph – một framework mạnh mẽ hỗ trợ xây dựng và điều phối các agent này – đã mở ra một hướng đi mới, giúp tôi biến những chatbot đơn giản thành những cố vấn toàn năng, sẵn sàng đáp ứng đa dạng nhu cầu người dùng một cách thông minh và linh hoạt.
Bên cạnh đó, xu hướng phát triển các hệ thống AI hướng tới sự chuyên biệt hóa và hợp tác giữa các mô-đun nhỏ hơn cũng đang trở thành tiêu chuẩn mới trong ngành công nghiệp trí tuệ nhân tạo. Các tập đoàn lớn như OpenAI, Anthropic và nhiều startup tiên phong đã chứng minh sức mạnh của kiến trúc đa agent trong việc cải thiện hiệu suất, khả năng mở rộng, và chất lượng đầu ra của AI.
Ngoài ra, việc ứng dụng multi-agent còn giúp tăng tính minh bạch và khả năng giám sát khi mỗi agent hoạt động độc lập nhưng hợp tác chặt chẽ, giúp người phát triển dễ dàng theo dõi, tối ưu và kiểm soát hành vi của hệ thống hơn so với một mô hình đơn thể “đơn độc”.
Từ những lý do trên, việc xây dựng một chatbot với khả năng multi-agent dựa trên nền tảng LangGraph không chỉ là một bước tiến công nghệ, mà còn là câu trả lời cho nhu cầu ngày càng cao của người dùng về một trợ lý AI thực sự toàn diện và hiệu quả.
Introduction
Ứng dụng AI ngày càng thông minh và linh hoạt, agent – những hệ thống sử dụng mô hình ngôn ngữ lớn (LLM) để điều phối luồng xử lý – đang trở thành một phần cốt lõi trong nhiều giải pháp. Tuy nhiên, khi các agent phát triển ngày càng phức tạp, chúng dễ rơi vào tình trạng khó quản lý, khó mở rộng, và đôi khi đưa ra những quyết định thiếu hiệu quả.
Chẳng hạn, một agent đơn lẻ có thể:
- Sở hữu quá nhiều công cụ và không biết lựa chọn đúng công cụ vào đúng thời điểm.
- Phải xử lý một lượng lớn ngữ cảnh vượt quá khả năng theo dõi.
- Cần đảm nhiệm nhiều vai trò chuyên biệt cùng lúc như lập kế hoạch, nghiên cứu, giải toán,...
Để giải quyết những thách thức này, một hướng tiếp cận hiệu quả là chia nhỏ hệ thống thành nhiều agent độc lập, mỗi agent đảm nhiệm một vai trò cụ thể, sau đó kết hợp chúng thành một hệ thống multi-agent. Mỗi agent có thể đơn giản như prompt kèm LLM, hoặc phức tạp như một agent sử dụng ReAct.
Việc sử dụng multi-agent system không chỉ giúp bạn xây dựng các hệ thống linh hoạt và mạnh mẽ hơn, mà còn mang lại ba lợi ích chính:
- Tính mô-đun (Modularity): Dễ dàng phát triển, kiểm thử và bảo trì từng phần nhỏ của hệ thống.
- Tính chuyên môn hóa (Specialization): Cho phép mỗi agent tập trung vào một lĩnh vực cụ thể, từ đó tăng hiệu quả xử lý.
- Khả năng kiểm soát (Control): Bạn có thể kiểm soát rõ ràng cách các agent tương tác, thay vì dựa hoàn toàn vào các lời gọi hàm không rõ ràng.
Trong bài viết này, chúng ta sẽ khám phá cách xây dựng một hệ thống multi-agent hiệu quả với LangGraph – một công cụ mạnh mẽ giúp bạn xây dựng, điều phối và trực quan hóa các agent AI theo hướng modular và có kiểm soát.
Multi-agent architectures
Một khi bạn đã có trong tay nhiều agent chuyên biệt, câu hỏi tiếp theo là: Làm sao để tổ chức và điều phối chúng một cách hiệu quả? Việc thiết kế kiến trúc kết nối các agent sẽ ảnh hưởng trực tiếp đến hiệu suất, khả năng mở rộng và mức độ kiểm soát của hệ thống. Dưới đây là các mô hình kiến trúc multi-agent phổ biến trong LangGraph – mỗi mô hình mang một triết lý và mức độ phức tạp riêng:
Network Architecture – Kết nối ngang hàng
Network là một trong những kiến trúc đơn giản và linh hoạt nhất trong hệ thống multi-agent. Trong mô hình này, mọi agent đều được định nghĩa là các nodes trong đồ thị, và bất kỳ agent nào cũng có thể giao tiếp với bất kỳ agent nào khác – tạo thành một mạng lưới many-to-many.
Mỗi agent có quyền quyết định sẽ “trao quyền” cho agent nào tiếp theo, tạo ra một hệ thống linh hoạt nhưng cũng tiềm ẩn sự khó kiểm soát nếu số lượng agent tăng nhanh. Đây là lựa chọn phù hợp khi:
- Các tác vụ không có thứ tự xử lý cứng nhắc.
- Hệ thống cần phản ứng đa hướng và nhanh nhạy.
Đặc điểm nổi bật:
- Không có thứ bậc hoặc luồng xử lý cố định: Đây là mô hình lý tưởng cho các hệ thống mang tính khám phá, thử sai (exploratory systems) hoặc yêu cầu phản hồi linh hoạt.
- Khả năng thích ứng cao: Mỗi agent có thể đưa ra quyết định độc lập về việc nên chuyển tiếp tới agent nào tiếp theo, dựa trên đầu vào, kết quả xử lý, hoặc tín hiệu từ LLM.
- Dễ mở rộng: Bạn có thể thêm agent mới mà không cần thay đổi cấu trúc tổng thể của hệ thống – chỉ cần đảm bảo các agent hiện tại có thể định tuyến tới agent mới nếu cần.
Ứng dụng thực tế:
- Trợ lý thông minh đa năng: Các agent đảm nhiệm các kỹ năng khác nhau như tìm kiếm thông tin, phân tích dữ liệu, lên kế hoạch, trả lời câu hỏi,... có thể tương tác linh hoạt để giải quyết bài toán từ nhiều hướng.
- Hệ thống phản ứng theo ngữ cảnh: Ví dụ, trong một hệ thống hỗ trợ khách hàng, tuỳ vào nội dung câu hỏi, một agent tổng hợp sẽ định tuyến sang các agent chuyên biệt như "agent về thanh toán", "agent về kỹ thuật", hoặc "agent về chính sách".
Network trong LangGraph: Trong LangGraph, bạn có thể thiết kế một kiến trúc network bằng cách:
- Định nghĩa mỗi agent là một node trong graph.
- Cho phép các agent trả về Command(goto=...) để định tuyến tới bất kỳ node nào khác.
- Sử dụng logic LLM hoặc công thức cụ thể để quyết định agent tiếp theo.
from langgraph.graph import StateGraph, Command
from typing import Literal def agent_a(state) -> Command[Literal["agent_b", "agent_c"]]: # Agent A quyết định gọi agent B hoặc C next_agent = "agent_b" if "use_b" in state else "agent_c" return Command(goto=next_agent) def agent_b(state): # Agent B thực hiện một tác vụ print("Agent B is working...") return Command(goto="agent_c") def agent_c(state): print("Agent C is finalizing...") return None # Kết thúc builder = StateGraph()
builder.add_node("agent_a", agent_a)
builder.add_node("agent_b", agent_b)
builder.add_node("agent_c", agent_c) builder.set_entry_point("agent_a")
graph = builder.compile()
Lưu ý khi sử dụng:
- Khi số lượng agent tăng lên, bạn nên kiểm soát luồng định tuyến bằng logic rõ ràng để tránh loop vô tận hoặc tình trạng gọi trùng lặp không cần thiết.
- Nên có cơ chế logging/tracing để giám sát hành vi của hệ thống trong môi trường production.
Supervisor Architecture
Supervisor là một kiến trúc phổ biến trong các hệ thống** multi-agent** khi bạn muốn có một trung tâm điều phối — một agent "giám sát" có vai trò điều hướng các agent khác dựa trên trạng thái hiện tại và logic ra quyết định (thường do LLM đảm nhận).
Cấu trúc:
- Supervisor là một node trung tâm (thường gọi là supervisor) dùng LLM để phân tích state hiện tại và quyết định agent tiếp theo nên là gì.
- Các agent chuyên biệt (như planner, researcher, coder, critic, v.v.) thực hiện tác vụ cụ thể.
- Dữ liệu (state) được cập nhật sau mỗi bước và trả về cho supervisor để tiếp tục quyết định.
Ưu điểm:
- Kiểm soát luồng logic chặt chẽ: Mọi quyết định đều đi qua supervisor → dễ debug, dễ theo dõi.
- Hỗ trợ song song hóa (parallelism): Supervisor có thể quyết định chạy nhiều agent cùng lúc nếu các tác vụ là độc lập (dùng map/reduce pattern).
- Phù hợp cho pipeline dạng tuần tự, định hướng mục tiêu: Khi hệ thống cần làm A → rồi B → rồi C, hoặc chuyển tiếp linh hoạt tùy tình huống.
Khi nào dùng kiến trúc này?
Khi bạn cần điều phối dựa trên trạng thái, ví dụ như:
- Agent researcher chỉ được gọi nếu prompt yêu cầu tra cứu thông tin.
- Agent summarizer chỉ được gọi sau khi hoàn thành phân tích dữ liệu.
- Khi bạn muốn hạn chế quyền truy cập giữa các agent (tức là agent không tự định tuyến qua nhau).
Ví dụ triển khai trong LangGraph:
from typing import Literal
from langgraph.graph import StateGraph, Command # Supervisor quyết định hướng đi tiếp theo
def supervisor(state) -> Command[Literal["agent_a", "agent_b", "agent_c"]]: query = state.get("query", "") if "summary" in query: next_agent = "agent_a" elif "calculate" in query: next_agent = "agent_b" else: next_agent = "agent_c" return Command(goto=next_agent) def agent_a(state): print("Summarizing content...") return Command(goto="supervisor", update={"summary": "This is a summary."}) def agent_b(state): print("Calculating result...") return Command(goto="supervisor", update={"result": 42}) def agent_c(state): print("Handling generic queries...") return None builder = StateGraph()
builder.add_node("supervisor", supervisor)
builder.add_node("agent_a", agent_a)
builder.add_node("agent_b", agent_b)
builder.add_node("agent_c", agent_c) builder.set_entry_point("supervisor")
graph = builder.compile()
Biến thể nâng cao:
- Map-Reduce Supervisor: Supervisor khởi động nhiều agent (dạng map), rồi gom kết quả để phân tích tiếp (reduce).
- Supervisor with tool-calling: LLM của supervisor dùng OpenAI function-calling để gọi các agent như tool (chuyển sang kiến trúc Supervisor Tool-Calling, sẽ nói sau).
Supervisor (Tool-Calling) – Supervisor + LLM chọn tool
Supervisor (tool-calling) là một biến thể hiện đại và rất mạnh mẽ của kiến trúc Supervisor. Ở đây, các sub-agent được đóng gói như tools, và supervisor agent (một LLM chính) sẽ gọi các tool này thông qua cơ chế function/tool-calling, như cách hoạt động của OpenAI Function Calling hoặc LangChain Tool APIs.
Đặc điểm nổi bật:
- Supervisor là một LLM agent, chạy trong vòng lặp (while loop) hoặc cho đến khi hoàn tất nhiệm vụ.
- Sub-agents được định nghĩa như tool, mỗi tool xử lý một tác vụ chuyên biệt như tìm kiếm thông tin, tính toán, phân tích, lập kế hoạch, v.v.
- Supervisor gọi tools qua structured output, ví dụ như JSON hoặc function schema.
- Cách tiếp cận này rất gần với AgentExecutor + Tools trong LangChain hoặc OpenAI Assistants API.
- Kiến trúc này tận dụng tối đa sức mạnh của LLM trong việc ra quyết định có điều kiện, phù hợp với các tác vụ mở và khó đoán trước.
Khi nào nên dùng?
- Khi bạn cần xây dựng agent tổng quát có khả năng điều phối nhiều công cụ/agent chuyên biệt.
- Khi bạn muốn tận dụng khả năng reasoning và function-calling mạnh mẽ của LLM để điều phối các agent phụ.
- Khi hệ thống cần mở rộng thêm nhiều tool dễ dàng, mà không cần viết lại luồng điều phối.
Ưu điểm:
- Mở rộng dễ dàng: thêm một agent mới = thêm một tool mới.
- Giảm độ phức tạp luồng điều phối: không cần dùng quá nhiều Command(goto=...) → LLM tự quyết định.
- Tận dụng tốt structured output/function calling của các LLM hiện đại như GPT-4 Turbo.
Ví dụ triển khai:
from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_openai import ChatOpenAI # Định nghĩa các agent con như tools
@tool
def search_web(query: str) -> str: """Tìm kiếm thông tin từ web.""" return f"Kết quả tìm kiếm cho '{query}'" @tool
def calculate(expression: str) -> float: """Tính toán biểu thức.""" return eval(expression) @tool
def summarize(text: str) -> str: """Tóm tắt nội dung.""" return f"Tóm tắt: {text[:50]}..." # Supervisor agent
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
tools = [search_web, calculate, summarize]
agent = create_tool_calling_agent(llm, tools) executor = AgentExecutor(agent=agent, tools=tools, verbose=True) executor.invoke({"input": "Tìm thông tin về LangGraph và tính 123 * 456"})
Đặc điểm | Supervisor truyền thống | Supervisor (tool-calling) |
---|---|---|
Routing | Dùng Command(goto=...) |
Dùng function-calling JSON |
Các sub-agent | Nodes độc lập | Tools gọi qua structured schema |
Luồng điều phối | Manual hoặc rule-based | Tự động nhờ reasoning của LLM |
Mở rộng | Tốn công điều chỉnh graph | Thêm tool là xong |
Hierarchical Architecture – Cấu trúc phân tầng
Hierarchical architecture là bước phát triển nâng cao của kiến trúc Supervisor. Khi số lượng agent tăng lên hoặc nhiệm vụ trở nên quá phức tạp, một supervisor duy nhất sẽ không đủ khả năng quản lý tất cả các agent một cách hiệu quả. Lúc này, phân tầng supervision trở thành giải pháp lý tưởng:
- Các agent được tổ chức thành các nhóm chức năng chuyên biệt (team).
- Mỗi nhóm có một supervisor riêng – điều phối và kiểm soát nội bộ nhóm.
- Một top-level supervisor (supervisor cấp cao nhất) sẽ điều phối giữa các supervisor cấp dưới.
Ưu điểm | Mô tả |
---|---|
Phân chia trách nhiệm rõ ràng | Mỗi supervisor chỉ cần xử lý một domain nhất định. |
Giảm tải nhận thức cho LLM chính | Top supervisor chỉ điều phối tổng thể, không cần ghi nhớ chi tiết từng tool. |
Mở rộng dễ dàng | Có thể thêm supervisor cấp thấp hoặc team mới mà không làm phức tạp hóa hệ thống. |
Hỗ trợ reasoning sâu hơn | Từng tầng có thể áp dụng logic riêng, ví dụ: team giải bài toán → team kiểm tra code → team tóm tắt kết quả. |
Luồng hoạt động
- User input được gửi đến top-level supervisor.
- Supervisor cấp cao sẽ quyết định team nào xử lý yêu cầu này.
- Team supervisor sẽ gọi agent cụ thể trong team.
- Nếu cần, kết quả sẽ được truyền ngược lên cho supervisor cấp trên để quyết định bước tiếp theo.
Tổng kết
Hệ thống multi-agent đang ngày càng trở thành xu hướng tất yếu trong việc phát triển các giải pháp AI linh hoạt, hiệu quả và dễ mở rộng. Việc chia nhỏ các nhiệm vụ cho các agent chuyên biệt không chỉ giúp giảm tải cho một agent đơn lẻ mà còn tăng cường khả năng kiểm soát, giám sát và tái sử dụng các thành phần.
Trong bài viết này, chúng ta đã đi qua ba kiến trúc phổ biến trong LangGraph:
- Network architecture – Mô hình kết nối ngang hàng cho phép các agent giao tiếp tự do, phù hợp với các bài toán cần tính linh hoạt cao.
- Supervisor architecture – Một agent trung tâm điều phối các agent chuyên biệt khác, thích hợp với các hệ thống cần kiểm soát luồng xử lý chặt chẽ.
- Supervisor with tool-calling – Tận dụng khả năng gọi hàm có cấu trúc của LLM để gọi các agent dưới dạng tool, mang lại khả năng mở rộng mạnh mẽ và dễ tích hợp với các hệ thống thực tế.
- Hierarchical Architecture – Cấu trúc phân tầng - Khi hệ thống trở nên lớn và phức tạp, bạn có thể cần một hệ thống supervisor đa cấp. Supervisor cấp trên điều phối các supervisor cấp dưới, mỗi cấp dưới lại điều phối các agent riêng biệt. Kiến trúc này giống như một tổ chức lớn có nhiều phòng ban và trưởng nhóm
Việc lựa chọn kiến trúc phù hợp sẽ tùy thuộc vào mục tiêu sử dụng, yêu cầu kiểm soát, cũng như mức độ phức tạp của tác vụ. Với LangGraph, bạn có thể linh hoạt thiết kế các hệ thống multi-agent một cách rõ ràng, có kiểm soát và dễ bảo trì.
Cảm ơn bạn đã đọc bài viết của mình, hy vọng bài viết của mình sẽ giúp anh cho bạn trong quá trình là chủ multi-agent với Langgraph. Serires của mình có lẽ sẽ kết thúc tại đây, hy vọng chúng ta sẽ gặp nhau trong một series khác sẽ có nhiều chia sẻ hơn