Bối cảnh & Tại sao Hệ thống AI Đa Tác nhân Quan trọng
Hệ thống đơn tác nhân nhanh chóng đụng trần khi nhiệm vụ trở nên phức tạp. Yêu cầu một LLM lập kế hoạch data pipeline, viết code pandas, review code đó tìm lỗi, rồi tối ưu hóa nó — context window đầy lên, model mất mạch, và chất lượng đầu ra giảm sút. Hệ thống đa tác nhân ra đời chính xác để phá vỡ điểm nghẽn đó.
Microsoft AutoGen v0.4 tái cấu trúc cách các AI agent cộng tác với nhau. Khác với các phiên bản trước, v0.4 giới thiệu kiến trúc event-driven rõ ràng với API cấp cao AgentChat chính thống. Mỗi agent có vai trò cụ thể và system prompt riêng. Một coordinator của team quyết định ai nói tiếp theo. Kết quả phản ánh cách một team kỹ thuật thực sự hoạt động: một người lập kế hoạch, người khác code, người thứ ba review.
Một khi bạn hiểu cách kết nối các agent với nhau, giới hạn của single-prompt không còn là ràng buộc nữa. Bạn bắt đầu tư duy theo workflow thay vì prompt. Sự chuyển đổi tư duy đó chính là lý do pattern này đáng học hỏi cho bất kỳ ai đang xây dựng tự động hóa dựa trên AI.
Phần tiếp theo là hướng dẫn cụ thể: một team ba agent được xây dựng cho phân tích dữ liệu — một Planner, một Data Analyst, và một Code Reviewer. Cuối bài, bạn sẽ có một hệ thống hoạt động được mà có thể tùy chỉnh cho dự án của mình.
Cài đặt AutoGen v0.4
Yêu cầu trước khi bắt đầu
Trước khi bắt đầu, hãy đảm bảo bạn có:
- Python 3.10 trở lên
- Một OpenAI API key (hoặc bất kỳ endpoint tương thích OpenAI nào như Azure OpenAI hoặc LM Studio)
- Terminal và kiến thức cơ bản về pip
Tạo virtual environment trước — điều này giúp cô lập dependencies và tránh xung đột phiên bản:
python -m venv autogen-env
source autogen-env/bin/activate # Windows: autogen-env\Scripts\activate
Cài đặt các Gói cần thiết
AutoGen v0.4 được chia thành các gói module riêng biệt. Bạn cần hai gói cốt lõi:
pip install autogen-agentchat autogen-ext[openai]
Xác nhận cài đặt thành công:
python -c "import autogen_agentchat; print(autogen_agentchat.__version__)"
Bạn sẽ thấy phiên bản dạng 0.4.x. Nếu gặp lỗi import, hãy kiểm tra lại xem virtual environment đã được kích hoạt chưa.
Thiết lập API Key
Lưu API key của bạn dưới dạng biến môi trường — đừng bao giờ hardcode nó trong script:
# Linux/macOS
export OPENAI_API_KEY="sk-key-của-bạn-ở-đây"
# Windows PowerShell
$env:OPENAI_API_KEY="sk-key-của-bạn-ở-đây"
Cấu hình Team Agent của Bạn
Đặt tên file là multi_agent.py. Toàn bộ implementation dưới đây khoảng 70 dòng — ngắn đủ để đọc một lần ngồi, nhưng đầy đủ để chạy với dataset thực.
Bước 1: Thiết lập Model Client
Model client là thứ mỗi agent dùng để gọi LLM. AutoGen v0.4 trừu tượng hóa điều này rõ ràng, bạn định nghĩa một lần và dùng chung cho tất cả agent:
import asyncio
import os
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient
# Model client dùng chung — tất cả agent sử dụng cùng cấu hình
model_client = OpenAIChatCompletionClient(
model="gpt-4o-mini",
api_key=os.environ["OPENAI_API_KEY"],
)
Dùng gpt-4o-mini giúp giảm chi phí khi test. Với khoảng $0.15 mỗi triệu token đầu vào, bạn có thể chạy hàng chục workflow test trước khi tiêu hết một đô. Chuyển sang gpt-4o khi cần độ chính xác cao hơn cho tác vụ production.
Bước 2: Tạo các Agent Chuyên biệt
Mỗi agent có một system_message tập trung định nghĩa vai trò của nó. Định nghĩa vai trò càng chặt chẽ, chất lượng đầu ra càng tốt:
# Agent 1: Phân tách nhiệm vụ thành các bước rõ ràng
planner_agent = AssistantAgent(
name="Planner",
model_client=model_client,
system_message="""Bạn là một project planner.
Khi nhận được nhiệm vụ phân tích dữ liệu, hãy chia thành 3-5 bước cụ thể.
Liệt kê từng bước rõ ràng. Không được viết code — chỉ phác thảo kế hoạch.
Kết thúc câu trả lời bằng: 'Plan ready.'""",
)
# Agent 2: Viết code Python dựa trên kế hoạch
analyst_agent = AssistantAgent(
name="DataAnalyst",
model_client=model_client,
system_message="""Bạn là một data analyst chuyên viết code Python.
Nhận kế hoạch và triển khai từng bước sử dụng pandas, numpy, hoặc matplotlib.
Luôn thêm comment giải thích từng khối code làm gì.
Kết thúc câu trả lời bằng: 'Code ready.'""",
)
# Agent 3: Review chất lượng code và đề xuất cải thiện
reviewer_agent = AssistantAgent(
name="CodeReviewer",
model_client=model_client,
system_message="""Bạn là một senior code reviewer.
Review code Python được cung cấp về:
- Tính đúng đắn và lỗi logic
- Độ rõ ràng và dễ đọc của code
- Các edge case chưa được xử lý
Đưa ra feedback cụ thể, có thể thực hiện được.
Nếu code ổn, hãy nói: 'APPROVED' để kết thúc phiên.""",
)
Bước 3: Xây dựng Team
RoundRobinGroupChat chuyển cuộc trò chuyện theo thứ tự cố định — Planner → DataAnalyst → CodeReviewer — rồi lặp lại trừ khi điều kiện kết thúc được kích hoạt:
# Dừng khi reviewer nói APPROVED
termination = TextMentionTermination("APPROVED")
# Xây dựng team — các agent nói theo thứ tự
team = RoundRobinGroupChat(
participants=[planner_agent, analyst_agent, reviewer_agent],
termination_condition=termination,
max_turns=9, # Giới hạn an toàn: tối đa 3 vòng của 3 agent
)
Giới hạn max_turns ngăn các cuộc trò chuyện chạy không kiểm soát nếu các agent không bao giờ đạt tới từ khóa kết thúc. Chín lượt cho ba chu kỳ đầy đủ Planner → Analyst → Reviewer, thường là đủ cho workflow này.
Bước 4: Chạy Team với Nhiệm vụ Thực tế
async def main():
task = """
Phân tích dataset CSV về giao dịch bán hàng với các cột:
date, product_name, quantity, unit_price, region.
Tính toán:
1. Tổng doanh thu theo vùng
2. Top 5 sản phẩm bán chạy nhất theo số lượng
3. Xu hướng doanh thu hàng tháng trong 6 tháng gần nhất
4. Tạo báo cáo tóm tắt được in ra với các thống kê này.
Giả sử file CSV có tên 'sales_data.csv' trong thư mục hiện tại.
"""
# Console stream câu trả lời của từng agent ra terminal theo thời gian thực
await Console(team.run_stream(task=task))
if __name__ == "__main__":
asyncio.run(main())
Chạy từ terminal của bạn:
python multi_agent.py
Kiểm tra & Giám sát
Đọc hiểu Console Output
Wrapper Console stream từng tin nhắn của agent khi chúng đến. Bạn sẽ thấy các phần được gắn nhãn như thế này:
---------- Planner ----------
Bước 1: Tải file CSV bằng pandas read_csv()...
Bước 2: Thêm cột doanh thu (quantity * unit_price)...
Bước 3: Group by vùng và tính tổng doanh thu...
...
Plan ready.
---------- DataAnalyst ----------
import pandas as pd
# Tải và chuẩn bị dữ liệu
df = pd.read_csv('sales_data.csv')
df['revenue'] = df['quantity'] * df['unit_price']
...
Code ready.
---------- CodeReviewer ----------
Logic chính xác. Gợi ý thêm: if df.empty: raise ValueError.
APPROVED
Mỗi phần hiển thị rõ ràng agent nào đang nói. Nếu một agent tạo ra đầu ra tệ, nhãn cho bạn biết chính xác system message nào cần chỉnh.
Lấy Kết quả theo Cách Lập trình
In ra console là đủ cho môi trường development. Khi chuyển sang production, hãy lưu toàn bộ lịch sử tin nhắn vào một biến để bạn có thể log, lưu trữ, hoặc kích hoạt các hành động downstream dựa trên kết quả:
async def main():
task = "Nhiệm vụ của bạn ở đây..."
result = await team.run(task=task)
for message in result.messages:
print(f"[{message.source}] {message.content[:300]}")
print(f"\nLý do dừng: {result.stop_reason}")
print(f"Tổng tin nhắn: {len(result.messages)}")
Trường result.stop_reason cho bạn biết liệu lần chạy kết thúc sạch (điều kiện kết thúc được đáp ứng) hay đạt giới hạn max_turns — hữu ích để cảnh báo khi có gì đó xảy ra sai.
Các Lỗi Thường Gặp và Cách Khắc phục
- Các agent lặp không dừng: Từ khóa kết thúc không xuất hiện. Kiểm tra system message của các agent — hướng dẫn agent nói rõ ràng từ khóa chính xác vào đúng thời điểm.
- Lỗi rate limit: Thêm delay giữa các lần test, giảm
max_turns, hoặc chuyển sang gói API cao hơn. - Agent bỏ qua vai trò của mình: System message cần mang tính chỉ đạo. Thay vì “Bạn có thể viết code,” hãy viết “Bạn phải viết code Python và không làm gì khác.”
- Chất lượng đầu ra không ổn định: Thử nâng cấp từ
gpt-4o-minilêngpt-4o, đặc biệt cho agent CodeReviewer vốn cần đánh giá tinh tế hơn.
Mở rộng: Lựa chọn Agent Động
Khi team ba agent của bạn hoạt động ổn định, hãy thử SelectorGroupChat — nó dùng một model để quyết định agent nào nói tiếp theo thay vì theo thứ tự cố định:
from autogen_agentchat.teams import SelectorGroupChat
dynamic_team = SelectorGroupChat(
participants=[planner_agent, analyst_agent, reviewer_agent],
model_client=model_client,
termination_condition=termination,
)
Điều này hoạt động tốt khi các agent có trách nhiệm chồng chéo, hoặc khi agent nào nên nói phụ thuộc vào ngữ cảnh của tin nhắn trước. Với các workflow tuần tự đơn giản như data analysis pipeline này, hãy giữ RoundRobinGroupChat — nó có thể đoán trước và dễ debug hơn.
Đến đây, bạn đã có một hệ thống đa tác nhân hoạt động được, tự động lập kế hoạch, viết code và review. Bước tiếp theo tự nhiên là trang bị cho các agent công cụ thực sự — file I/O, tìm kiếm web, thực thi code — sử dụng hỗ trợ tool-calling của AutoGen. Đó là thời điểm kiến trúc này không còn là đồ chơi nữa mà bắt đầu xử lý các workload production thực tế.

