Trong bối cảnh AI ngày càng phát triển, việc xây dựng hệ thống đa agent (multi-agent) đã trở thành xu hướng tất yếu để xử lý các tác vụ phức tạp. Bài viết này sẽ hướng dẫn bạn thiết kế một hệ thống đa agent hoàn chỉnh với khả năng phân chia công việc thông minh, chia sẻ trạng thái hiệu quả và khôi phục lỗi tự động.

Bối Cảnh Thị Trường AI 2026: So Sánh Chi Phí

Trước khi đi vào kỹ thuật, hãy cùng xem xét chi phí vận hành hệ thống đa agent với các mô hình AI hàng đầu hiện nay:

Mô hình Giá Output (USD/MTok) Chi phí 10M token/tháng
Claude Sonnet 4.5 $15 $150
GPT-4.1 $8 $80
Gemini 2.5 Flash $2.50 $25
DeepSeek V3.2 $0.42 $4.20

Như bạn thấy, DeepSeek V3.2 có chi phí thấp nhất — chỉ $4.20 cho 10 triệu token mỗi tháng, trong khi Claude Sonnet 4.5 lên tới $150. Với HolySheep AI, bạn có thể tiết kiệm tới 85%+ chi phí với tỷ giá ưu đãi và thanh toán qua WeChat/Alipay.

Kiến Trúc Tổng Quan Hệ Thống Đa Agent

Một hệ thống đa agent hiệu quả cần có 3 thành phần cốt lõi:

Xây Dựng Orchestrator Agent - Trung Tâm Điều Phối

Orchestrator là agent chịu trách nhiệm phân tích yêu cầu, phân chia task và điều phối các worker agent. Dưới đây là implementation chi tiết:

import httpx
import asyncio
from typing import List, Dict, Any
from dataclasses import dataclass, field
from enum import Enum
import json
from datetime import datetime

class TaskStatus(Enum):
    PENDING = "pending"
    IN_PROGRESS = "in_progress"
    COMPLETED = "completed"
    FAILED = "failed"
    RETRY = "retry"

@dataclass
class Task:
    task_id: str
    description: str
    assigned_agent: str = None
    status: TaskStatus = TaskStatus.PENDING
    result: Any = None
    retry_count: int = 0
    created_at: datetime = field(default_factory=datetime.now)

class SharedState:
    """Quản lý trạng thái chia sẻ giữa các agent"""
    
    def __init__(self):
        self._state: Dict[str, Any] = {}
        self._locks: Dict[str, asyncio.Lock] = {}
        self._subscribers: Dict[str, List[callable]] = {}
    
    async def get(self, key: str) -> Any:
        return self._state.get(key)
    
    async def set(self, key: str, value: Any):
        async with self._locks.setdefault(key, asyncio.Lock()):
            self._state[key] = value
            await self._notify_subscribers(key, value)
    
    async def update(self, key: str, updates: Dict):
        async with self._locks.setdefault(key, asyncio.Lock()):
            current = self._state.get(key, {})
            if isinstance(current, dict):
                current.update(updates)
                self._state[key] = current
            await self._notify_subscribers(key, self._state[key])
    
    async def subscribe(self, key: str, callback: callable):
        if key not in self._subscribers:
            self._subscribers[key] = []
        self._subscribers[key].append(callback)
    
    async def _notify_subscribers(self, key: str, value: Any):
        if key in self._subscribers:
            for callback in self._subscribers[key]:
                await callback(key, value)

class OrchestratorAgent:
    """Agent điều phối trung tâm - phân chia công việc cho các worker"""
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self.shared_state = SharedState()
        self.worker_agents: Dict[str, 'WorkerAgent'] = {}
    
    async def initialize(self):
        """Khởi tạo các worker agent"""
        self.worker_agents = {
            "research": WorkerAgent("research", self.api_key, self.base_url, self.shared_state),
            "analysis": WorkerAgent("analysis", self.api_key, self.base_url, self.shared_state),
            "coding": WorkerAgent("coding", self.api_key, self.base_url, self.shared_state),
            "validation": WorkerAgent("validation", self.api_key, self.base_url, self.shared_state),
        }
        
        for agent in self.worker_agents.values():
            await agent.start()
    
    async def process_request(self, user_request: str) -> Dict[str, Any]:
        """Phân tích yêu cầu và phân chia công việc"""
        
        # Gọi LLM để phân tích và phân chia task
        prompt = f"""Phân tích yêu cầu sau và phân chia thành các task nhỏ.
        Mỗi task cần có: task_id, mô tả, agent phù hợp (research/analysis/coding/validation).
        
        Yêu cầu: {user_request}
        
        Trả lời theo format JSON với cấu trúc:
        {{"tasks": [{{"task_id": "task_1", "description": "...", "agent": "research"}}]}}
        """
        
        response = await self._call_llm(prompt)
        task_plan = json.loads(response)
        
        # Đăng ký các task vào shared state
        for task_data in task_plan["tasks"]:
            task = Task(
                task_id=task_data["task_id"],
                description=task_data["description"]
            )
            await self.shared_state.set(f"task:{task.task_id}", {
                "status": task.status.value,
                "assigned_to": task_data["agent"],
                "description": task.description
            })
        
        # Phân chia và thực thi song song
        return await self._execute_task_plan(task_plan["tasks"])
    
    async def _call_llm(self, prompt: str, model: str = "deepseek-v3.2") -> str:
        """Gọi API LLM thông qua HolySheep"""
        async with httpx.AsyncClient(timeout=60.0) as client:
            response = await client.post(
                f"{self.base_url}/chat/completions",
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json"
                },
                json={
                    "model": model,
                    "messages": [{"role": "user", "content": prompt}],
                    "temperature": 0.3
                }
            )
            response.raise_for_status()
            return response.json()["choices"][0]["message"]["content"]
    
    async def _execute_task_plan(self, tasks: List[Dict]) -> Dict[str, Any]:
        """Thực thi plan với xử lý lỗi và retry"""
        results = {}
        
        # Tạo concurrent tasks
        async def execute_single(task: Dict) -> tuple:
            agent_name = task["agent"]
            if agent_name not in self.worker_agents:
                return task["task_id"], {"error": f"Unknown agent: {agent_name}"}
            
            agent = self.worker_agents[agent_name]
            result = await agent.execute_with_retry(task)
            return task["task_id"], result
        
        # Thực thi song song
        task_coroutines = [execute_single(t) for t in tasks]
        completed = await asyncio.gather(*task_coroutines, return_exceptions=True)
        
        for item in completed:
            if isinstance(item, Exception):
                continue
            task_id, result = item
            results[task_id] = result
        
        return results

Worker Agent với Retry Logic và Error Recovery

Mỗi worker agent cần có khả năng tự khôi phục khi gặp lỗi. Dưới đây là implementation với exponential backoff:

import asyncio
import random
from typing import Optional

class WorkerAgent:
    """Worker agent thực thi task với cơ chế retry"""
    
    MAX_RETRIES = 3
    BASE_DELAY = 1.0  # Giây
    MAX_DELAY = 30.0
    
    def __init__(self, name: str, api_key: str, base_url: str, shared_state: SharedState):
        self.name = name
        self.api_key = api_key
        self.base_url = base_url
        self.shared_state = shared_state
        self.is_active = False
    
    async def start(self):
        """Khởi động worker"""
        self.is_active = True
        print(f"Worker {self.name} started")
    
    async def execute_with_retry(self, task: Dict, max_retries: int = None) -> Dict:
        """Thực thi task với retry logic"""
        max_retries = max_retries or self.MAX_RETRIES
        last_error = None
        
        for attempt in range(max_retries):
            try:
                # Cập nhật trạng thái
                await self.shared_state.update(f"task:{task['task_id']}", {
                    "status": "in_progress",
                    "attempt": attempt + 1
                })
                
                # Thực thi task
                result = await self._execute_task(task)
                
                # Cập nhật kết quả thành công
                await self.shared_state.update(f"task:{task['task_id']}", {
                    "status": "completed",
                    "result": result,
                    "completed_at": str(datetime.now())
                })
                
                return {"success": True, "data": result}
                
            except Exception as e:
                last_error = e
                await self.shared_state.update(f"task:{task['task_id']}", {
                    "status": "retry",
                    "last_error": str(e),
                    "attempt": attempt + 1
                })
                
                if attempt < max_retries - 1:
                    # Exponential backoff với jitter
                    delay = min(
                        self.BASE_DELAY * (2 ** attempt) + random.uniform(0, 1),
                        self.MAX_DELAY
                    )
                    print(f"Worker {self.name}: Retry {attempt + 1}/{max_retries} sau {delay:.2f}s")
                    await asyncio.sleep(delay)
        
        # Tất cả retries đều thất bại
        await self.shared_state.update(f"task:{task['task_id']}", {
            "status": "failed",
            "error": str(last_error),
            "failed_at": str(datetime.now())
        })
        
        return {
            "success": False,
            "error": str(last_error),
            "attempts": max_retries
        }
    
    async def _execute_task(self, task: Dict) -> Any:
        """Logic thực thi task cụ thể của từng worker"""
        prompt = f"""Bạn là agent {self.name}. Thực hiện task sau:
        
        Task ID: {task['task_id']}
        Mô tả: {task['description']}
        
        Trả lời bằng JSON với format: {{"result": "...", "confidence": 0.9}}"""
        
        # Chọn model phù hợp với loại worker
        model_map = {
            "research": "deepseek-v3.2",      # Chi phí thấp cho research
            "analysis": "gemini-2.5-flash",   # Cân bằng cost-performance
            "coding": "gpt-4.1",              # Mạnh cho coding
            "validation": "claude-sonnet-4.5" # Chính xác cao
        }
        
        model = model_map.get(self.name, "deepseek-v3.2")
        
        async with httpx.AsyncClient(timeout=120.0) as client:
            response = await client.post(
                f"{self.base_url}/chat/completions",
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json"
                },
                json={
                    "model": model,
                    "messages": [{"role": "user", "content": prompt}],
                    "temperature": 0.5
                }
            )
            response.raise_for_status()
            result_text = response.json()["choices"][0]["message"]["content"]
            return json.loads(result_text)
    
    async def handle_failure(self, task: Dict, error: Exception) -> Optional[Dict]:
        """Xử lý khi task thất bại - có thể override"""
        print(f"Worker {self.name}: Task {task['task_id']} failed - {error}")
        # Fallback: thử với model khác hoặc task đơn giản hơn
        return None

Shared State Manager - Giao Tiếp Giữa Các Agent

Để các agent có thể chia sẻ thông tin và phối hợp, chúng ta cần một hệ thống shared state với khả năng:

class AdvancedSharedState(SharedState):
    """Shared state nâng cao với event system và conflict resolution"""
    
    def __init__(self):
        super().__init__()
        self._event_bus: Dict[str, asyncio.Queue] = {}
        self._change_history: Dict[str, List[Dict]] = {}
    
    async def set_with_version(self, key: str, value: Any, expected_version: int = None) -> bool:
        """Set giá trị với optimistic locking"""
        current_version = await self.get(f"{key}._version") or 0
        
        if expected_version is not None and current_version != expected_version:
            raise ConflictError(f"Version mismatch: expected {expected_version}, got {current_version}")
        
        async with self._locks.setdefault(key, asyncio.Lock()):
            self._state[key] = value
            new_version = current_version + 1
            self._state[f"{key}._version"] = new_version