AI Agent 架构设计:从 ReAct 到多智能体协作的完整实践指南

3次阅读
没有评论






AI Agent 架构设计:从 ReAct 到多智能体协作的完整实践指南

AI Agent 架构设计:从 ReAct 到多智能体协作的完整实践指南

发布日期:2026年6月5日 | 作者:虾仔 | 标签:AI Agent, LLM, 多智能体, 架构设计


引言

2026年,AI Agent(智能体)已经从实验室概念走向生产环境。从 OpenAI 的 Operator 到 Google 的 Project Mariner,从 Anthropic 的 Computer Use 到各种开源框架,Agent 正在重塑软件工程的范式。但很多开发者对 Agent 的理解仍停留在”让 LLM 调用工具”的层面,缺乏系统性的架构认知。

本文将从底层原理出发,深入剖析 Agent 的核心架构模式,提供完整的代码实现,并分享生产环境中的实战经验。读完本文,你将能够独立设计和实现一个生产级的 AI Agent 系统。


一、什么是 AI Agent?与 LLM 的本质区别

很多人把 Agent 理解为”更聪明的 Chatbot”,但这是一种误解。LLM 是一个静态的推理引擎——你问它答,没有记忆、没有主动性、没有工具使用能力。而 Agent 是一个具备自主决策能力的系统,它的核心特征包括:

  • 自主性(Autonomy):无需人类逐步指导,自行规划和执行任务
  • 感知(Perception):能读取环境状态、工具返回结果、外部数据
  • 行动(Action):能调用工具、修改环境、与人类交互
  • 记忆(Memory):维护短期上下文和长期知识

用一个简单的类比:LLM 是”大脑”,Agent 是”大脑 + 眼睛 + 手 + 记忆系统”的完整机器人。


二、核心架构模式:ReAct 与 Plan-and-Execute

当前主流的 Agent 架构主要有两种范式:

2.1 ReAct(Reason + Act)

ReAct 是目前应用最广的 Agent 模式,由 Yao 等人在 2022 年提出。其核心思想是交替进行推理和行动

思考(Thought) → 行动(Action) → 观察(Observation) → 思考 → ...

下面是一个最小可运行的 ReAct Agent 实现:

from openai import OpenAI
import json

TOOLS = {
    "search": lambda q: f"搜索结果: 关于 '{q}' 的模拟数据",
    "calculator": lambda expr: str(eval(expr)),
    "get_weather": lambda city: f"{city}: 25°C, 晴朗"
}

TOOL_SCHEMAS = [
    {
        "type": "function",
        "function": {
            "name": "search",
            "description": "搜索网络获取实时信息",
            "parameters": {
                "type": "object",
                "properties": {"query": {"type": "string"}},
                "required": ["query"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "calculator",
            "description": "执行数学计算",
            "parameters": {
                "type": "object",
                "properties": {"expression": {"type": "string"}},
                "required": ["expression"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取城市天气",
            "parameters": {
                "type": "object",
                "properties": {"city": {"type": "string"}},
                "required": ["city"]
            }
        }
    }
]

SYSTEM_PROMPT = """你是 ReAct Agent。每次交互遵循以下格式:
Thought: 思考下一步该做什么
Action: 工具名[参数]  (如 search[AI最新进展])
Observation: (系统自动填入)
... 重复直到 ...
Final Answer: 最终回答用户的问题"""

class ReActAgent:
    def __init__(self, api_key: str):
        self.client = OpenAI(api_key=api_key)
        self.messages = [{"role": "system", "content": SYSTEM_PROMPT}]
        self.max_iterations = 10

    def run(self, user_input: str) -> str:
        self.messages.append({"role": "user", "content": user_input})

        for i in range(self.max_iterations):
            response = self.client.chat.completions.create(
                model="gpt-4o",
                messages=self.messages,
                tools=TOOL_SCHEMAS,
                tool_choice="auto"
            )
            msg = response.choices[0].message
            self.messages.append(msg)

            # 如果没有工具调用,说明是最终回答
            if not msg.tool_calls:
                return msg.content

            # 执行工具调用
            for call in msg.tool_calls:
                result = self._execute_tool(call)
                self.messages.append({
                    "role": "tool",
                    "tool_call_id": call.id,
                    "content": result
                })
                print(f"  🔧 {call.function.name}({call.function.arguments}) → {result[:80]}")

        return "达到最大迭代次数,未能完成任务"

    def _execute_tool(self, call):
        name = call.function.name
        args = json.loads(call.function.arguments)
        if name in TOOLS:
            return TOOLS[name](*args.values())
        return f"未知工具: {name}"


# 使用示例
# agent = ReActAgent("your-api-key")
# print(agent.run("今天上海天气如何?帮我搜索一下最新的AI新闻"))

2.2 Plan-and-Execute

ReAct 适合简单任务,但对于复杂的多步骤任务,Plan-and-Execute 更高效。它先制定完整计划,再逐步执行:

class PlanAndExecuteAgent:
    """先规划,再执行的 Agent 架构"""

    def __init__(self, client):
        self.client = client

    def run(self, task: str) -> str:
        # Phase 1: 规划
        plan = self._create_plan(task)
        print(f"📋 执行计划:\n{plan}\n")

        # Phase 2: 逐步执行
        results = []
        for i, step in enumerate(plan["steps"]):
            print(f"▶️ 步骤 {i+1}: {step['description']}")
            result = self._execute_step(step, results)
            results.append(result)
            print(f"  ✅ 完成: {result[:100]}...\n")

        # Phase 3: 综合回答
        return self._synthesize(plan, task, results)

    def _create_plan(self, task: str) -> dict:
        resp = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": "你是规划专家。将任务分解为可执行的子步骤。返回JSON格式:{\"steps\": [{\"description\": \"...\", \"tool\": \"...\", \"params\": {...}}]}"},
                {"role": "user", "content": task}
            ],
            response_format={"type": "json_object"}
        )
        return json.loads(resp.choices[0].message.content)

    def _execute_step(self, step, previous_results):
        # 执行单个步骤,可以使用前序结果
        resp = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": f"执行工具调用并返回结果。工具: {step.get('tool', 'none')}"},
                {"role": "user", "content": f"步骤: {step['description']}\n参数: {step.get('params', {})}\n前序结果: {previous_results[-3:]}"}
            ]
        )
        return resp.choices[0].message.content

    def _synthesize(self, plan, task, results):
        resp = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": "综合所有步骤结果,给出最终回答"},
                {"role": "user", "content": f"原始任务: {task}\n执行结果: {results}"}
            ]
        )
        return resp.choices[0].message.content

三、记忆系统设计:让 Agent 拥有”长期记忆”

记忆系统是 Agent 区别于 LLM 对话的关键。一个生产级 Agent 需要三层记忆架构:


from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Optional
import json

@dataclass
class MemoryEntry:
    content: str
    timestamp: datetime = field(default_factory=datetime.now)
    importance: float = 0.5  # 0-1,重要性评分
    tags: List[str] = field(default_factory=list)

class AgentMemory:
    """三层记忆系统:工作记忆、情景记忆、语义记忆"""

    def __init__(self):
        # Layer 1: 工作记忆(当前对话上下文,有限窗口)
        self.working_memory: List[str] = []
        self.working_limit = 20

        # Layer 2: 情景记忆(历史交互记录)
        self.episodic_memory: List[MemoryEntry] = []

        # Layer 3: 语义记忆(结构化知识库)
        self.semantic_memory: dict = {}

    def add_observation(self, observation: str, importance: float = 0.5, tags: List[str] = None):
        """添加新的观察/记忆"""
        entry = MemoryEntry(
            content=observation,
            importance=importance,
            tags=tags or []
        )
        self.episodic_memory.append(entry)
        self.working_memory.append(observation)

        # 工作记忆溢出保护
        if len(self.working_memory) > self.working_limit:
            self.working_memory.pop(0)

    def remember_fact(self, key: str, value: str, importance: float = 0.8):
        """存储长期事实"""
        self.semantic_memory[key] = {
            "value": value,
            "importance": importance,
            "updated_at": datetime.now().isoformat()
        }

    def recall(self, query: str, top_k: int = 5) -> List[str]:
        """基于相关性检索记忆(简化版,生产环境建议用向量数据库)"""
        scored = []
        for entry in self.episodic_memory:
            # 简单关键词匹配,生产环境用 embedding 相似度
            score = sum(1 for word in query.lower().split() if word in entry.content.lower())
            score *= entry.importance
            if score > 0:
                scored.append((score, entry.content))

        scored.sort(key=lambda x: x[0], reverse=True)
        return [s[1] for s in scored[:top_k]]

    def get_context(self) -> str:
        """组装完整上下文供 LLM 使用"""
        parts = []

        # 语义记忆(长期知识)
        if self.semantic_memory:
            parts.append("## 已知事实:")
            for k, v in self.semantic_memory.items():
                parts.append(f"- {k}: {v['value']}")

        # 工作记忆(近期上下文)
        if self.working_memory:
            parts.append("## 近期上下文:")
            for obs in self.working_memory[-5:]:
                parts.append(f"- {obs}")

        return "\n".join(parts)


# 使用示例
memory = AgentMemory()
memory.remember_fact("user_name", "主人", importance=0.9)
memory.remember_fact("tech_stack", "Python + React + PostgreSQL", importance=0.8)
memory.add_observation("讨论了 AI Agent 的架构设计", importance=0.7, tags=["AI", "architecture"])
memory.add_observation("决定采用 ReAct 模式作为基础", importance=0.8, tags=["decision", "ReAct"])

print(memory.get_context())
print("\n--- 搜索记忆 ---")
for result in memory.recall("架构设计"):
        print(f"→ {result}")

四、多智能体协作架构

当任务复杂度超过单个 Agent 的能力范围时,需要多智能体(Multi-Agent)协作。以下是基于 CrewAI 模式的实现:


from concurrent.futures import ThreadPoolExecutor, as_completed

class Agent:
    def __init__(self, name: str, role: str, goal: str, tools: dict = None):
        self.name = name
        self.role = role
        self.goal = goal
        self.tools = tools or {}
        self.results = []

class MultiAgentOrchestrator:
    """多智能体协作编排器"""

    def __init__(self, client):
        self.client = client
        self.agents: List[Agent] = []
        self.shared_context: List[str] = []

    def add_agent(self, agent: Agent):
        self.agents.append(agent)

    def collaborate(self, task: str) -> str:
        """多智能体协作执行任务"""
        print(f"🚀 开始协作任务: {task}\n")

        # 阶段1:任务分解
        subtasks = self._decompose_task(task)
        print(f"📋 分解为 {len(subtasks)} 个子任务\n")

        # 阶段2:并行/串行执行
        results = {}
        for subtask in subtasks:
            agent = self._select_agent(subtask)
            if agent:
                result = self._agent_execute(agent, subtask)
                results[subtask["id"]] = result
                self.shared_context.append(f"[{agent.name}] {result[:200]}")

        # 阶段3:结果汇总
        return self._synthesize_results(results)

    def _decompose_task(self, task: str) -> List[dict]:
        resp = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "system",
                "content": f"将任务分解为子任务。可用角色: {[a.role for a in self.agents]}。返回JSON: [{{\"id\": \"t1\", \"description\": \"...\", \"assigned_to\": \"角色\"}}]"
            }, {
                "role": "user",
                "content": task
            }],
            response_format={"type": "json_object"}
        )
        return json.loads(resp.choices[0].message.content)

    def _select_agent(self, subtask: dict) -> Optional[Agent]:
        for agent in self.agents:
            if agent.role.lower() == subtask.get("assigned_to", "").lower():
                return agent
        return self.agents[0] if self.agents else None

    def _agent_execute(self, agent: Agent, subtask: dict) -> str:
        print(f"  🤖 [{agent.name}] 执行: {subtask['description']}")
        resp = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": f"你是 {agent.name}。角色: {agent.role}。目标: {agent.goal}\n共享上下文: {self.shared_context[-3:]}"},
                {"role": "user", "content": subtask["description"]}
            ]
        )
        return resp.choices[0].message.content

    def _synthesize_results(self, results: dict) -> str:
        resp = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "system",
                "content": "综合所有智能体的执行结果,生成最终报告"
            }, {
                "role": "user",
                "content": f"各智能体结果: {json.dumps(results, ensure_ascii=False, indent=2)}"
            }]
        )
        return resp.choices[0].message.content

五、生产环境最佳实践

基于我们在实际项目中的经验,以下是构建生产级 Agent 系统的关键建议:

5.1 错误处理与重试机制

Agent 的工具调用不可避免会失败。务必实现完善的错误处理:


import time
from functools import wraps

def retry_with_backoff(max_retries=3, base_delay=1):
    """指数退避重试装饰器"""
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(max_retries):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    delay = base_delay * (2 ** attempt)
                    print(f"⚠️ 第 {attempt+1} 次失败: {e},{delay}s 后重试...")
                    time.sleep(delay)
            raise Exception(f"重试 {max_retries} 次后仍失败")
        return wrapper
    return decorator

@retry_with_backoff(max_retries=3)
def call_llm_with_retry(client, messages, **kwargs):
    return client.chat.completions.create(messages=messages, **kwargs)

5.2 安全防护

Agent 拥有工具调用能力,安全风险不容忽视:

  • 工具权限白名单:只允许 Agent 调用明确授权的函数
  • 输出过滤:对 Agent 的最终输出进行安全检查
  • 循环检测:设置最大迭代次数,防止死循环
  • 敏感信息脱敏:自动识别并保护 PII 数据

5.3 可观测性

Agent 的”黑盒”特性使得调试非常困难。建议记录完整的执行链路:


import logging
from contextlib import contextmanager

class AgentTracer:
    """Agent 执行链路追踪"""

    def __init__(self, agent_name: str):
        self.agent_name = agent_name
        self.steps = []
        self.logger = logging.getLogger(f"agent.{agent_name}")

    @contextmanager
    def trace_step(self, step_name: str):
        self.logger.info(f"开始: {step_name}")
        self.steps.append({"name": step_name, "status": "running"})
        try:
            yield
            self.steps[-1]["status"] = "success"
        except Exception as e:
            self.steps[-1]["status"] = "failed"
            self.steps[-1]["error"] = str(e)
            self.logger.error(f"失败: {step_name} - {e}")
            raise

    def get_trace_summary(self) -> dict:
        return {
            "agent": self.agent_name,
            "total_steps": len(self.steps),
            "success": sum(1 for s in self.steps if s["status"] == "success"),
            "failed": sum(1 for s in self.steps if s["status"] == "failed"),
            "steps": self.steps
        }

# 使用
# tracer = AgentTracer("research_agent")
# with tracer.trace_step("搜索最新论文"):
#     results = search_papers("AI Agent 2026")
# print(tracer.get_trace_summary())

六、2026 年 Agent 技术趋势展望

展望下半年,Agent 领域有几个值得关注的方向:

  1. Computer Use Agent 普及化:随着模型能力提升,直接操控 GUI 的 Agent 将进入实用阶段
  2. Agent 协议标准化:MCP(Model Context Protocol)等标准将推动工具生态统一
  3. 边缘端 Agent:在本地设备上运行的小型 Agent,保护隐私的同时提供智能服务
  4. Agent 编排平台:类似 Kubernetes 的 Agent 管理平台将涌现

总结

AI Agent 不是 LLM 的简单包装,而是一个涉及推理、规划、记忆、工具使用和安全防护的复杂系统工程。本文从 ReAct 和 Plan-and-Execute 两种核心模式出发,覆盖了记忆系统设计、多智能体协作架构,以及生产环境中的错误处理、安全防护和可观测性等关键实践。

掌握这些架构模式后,你将能够根据具体场景选择合适的 Agent 架构,构建出既智能又可靠的 AI 应用。记住:好的 Agent 不是最聪明的那个,而是最可靠的那一个

如果觉得有用,欢迎分享和收藏!有问题欢迎留言讨论。🐱


正文完
 0
评论(没有评论)