AI Agent 架构与实践深度解析

从核心范式到工程实现,全面剖析现代 AI Agent 的架构设计、协议标准与多Agent协作机制

📅 2026-01-15 ⏱️ 约 18 分钟阅读 👤 李明远 · 资深架构师
ReAct MCP A2A Multi-Agent LLM

🧩核心组件:Tools · Memory · Planning

一个功能完整的 AI Agent 通常由三大核心组件构成:Tools(工具)负责与外部世界交互;Memory(记忆)管理历史状态与上下文;Planning(规划)分解复杂任务并选择行动策略。三者协同构成 Agent 的感知-决策-执行循环。

Tools — 能力扩展的基石

工具是 Agent 连接 LLM 与真实世界的桥梁。通过工具调用,Agent 可以执行代码、查询数据库、调用 API、读写文件,甚至控制物理设备。工具定义通常包含:名称、描述、参数模式(JSON Schema)和返回格式。

// 工具定义的标准化结构
const tools = [
  {
    name: "web_search",
    description: "Search the web for current information",
    parameters: {
      type: "object",
      properties: {
        query:   { type: "string", description: "Search query" },
        top_k:   { type: "integer", description: "Max results", default: 5 }
      },
      required: ["query"]
    }
  },
  {
    name: "execute_python",
    description: "Run Python code in a sandboxed environment",
    parameters: {
      type: "object",
      properties: {
        code: { type: "string", description: "Python code to execute" }
      },
      required: ["code"]
    }
  }
];

设计原则:工具命名应清晰无歧义;参数尽量使用枚举或有限集合;每个工具应单一职责;为工具添加权限级别和安全边界。

Memory — 持续智能的保障

Memory 模块解决 LLM 有限上下文窗口与长期任务需求之间的矛盾。典型的记忆系统采用分层架构:

  • 工作记忆(Working Memory):当前会话上下文,直接参与推理,约 4-32k tokens
  • 情景记忆(Episodic Memory):历史交互片段,支持回顾与经验复用,通常存储在向量数据库
  • 语义记忆(Semantic Memory):结构化知识与事实,通过 RAG 或知识图谱访问
  • 程序记忆(Procedural Memory):Agent 的内化策略与工作流程模式
# 分层记忆系统的简化实现
class 分层记忆系统:
    def __init__(self, vector_db, kg_client):
        self.working   = []                    # 当前上下文
        self.episodic  = vector_db             # Chroma / FAISS / Milvus
        self.semantic  = kg_client             # 知识图谱
        self.procedural = "REACT"              # 当前策略模式

    def retrieve(self, query, top_k=5):
        # 1. 从情景记忆中向量检索
        episodes = self.episodic.similarity(query, top_k)
        # 2. 从语义记忆中图查询
        facts    = self.semantic.query(query)
        # 3. 合并 + 重排序返回
        return self.merge(episodes, facts)

Planning — 复杂任务的分解与执行

规划能力决定 Agent 如何将模糊目标转化为可执行步骤。主流方法包括:

  • Chain-of-Thought(CoT):逐步推理,适合线性逻辑任务
  • Tree-of-Thought(ToT):树状探索,支持回溯与分支选择
  • ReAct:推理与行动交替进行,适合需要环境反馈的交互任务
  • Plan-and-Execute:先规划全局路径,再逐步执行,适合长周期任务
  • LLM Compiler:并行规划与依赖分析,最大化工具调用并行度

🔄ReAct 范式:推理与行动的闭环

ReAct(Reasoning + Acting)由 Google Research 在 2023 年提出,核心思想是将 LLM 的推理能力与工具执行能力深度融合,形成"思考-行动-观察"的迭代循环。这一范式解决了纯推理模型无法获取实时信息的困境,也解决了纯行动模型缺乏逻辑连贯性的问题。

ReAct 循环机制

🤔 Thought
🎬 Action
👁️ Observe
🤔 Next Thought
循环持续直到 Agent 判断任务完成或达到最大迭代次数

每一轮循环中,LLM 接收到:当前任务描述 + 历史轨迹(Thought-Action-Observe 三元组)+ 当前观察结果,然后生成下一步的 Thought(推理判断)和 Action(工具调用)。

ReAct vs 其他范式对比

范式 核心机制 优势 适用场景
ReAct 推理与行动交替 可解释性强、可干预 交互式任务、工具调用
CoT 纯推理链 延迟低、无外部依赖 数学推导、逻辑分析
ToT 树状搜索 全局最优、可回溯 复杂规划、游戏 AI
Plan-and-Execute 先规划后执行 长期一致性、效率高 长周期任务、多步骤项目

ReAct Prompting 示例

# ReAct 风格的系统提示
"You are a helpful assistant that uses ReAct pattern.\n\n"
"For each step, output a JSON object with fields:\n"
"  - thought: your reasoning about the current state\n"
"  - action: the tool to call (or 'finish'/'fail')\n"
"  - action_input: arguments for the tool\n\n"
"History: {history}\n"
"Current observation: {observation}\n"
"Task: {task}"

# LLM 实际输出示例:
{
  "thought": "The user wants to know the weather in Tokyo. "
           "I should first search for the current weather.",
  "action": "web_search",
  "action_input": { "query": "Tokyo weather January 2026" }
}

{
  "thought": "Got the weather data. Tokyo is 8°C and sunny. "
           "I can now provide the answer directly.",
  "action": "finish",
  "action_input": { "response": "Tokyo 今日天气:8°C,晴天" }
}
ReAct 的精髓在于:Thought 必须真正影响 Action 的选择,而不是生成一段看似推理但与行动无关的文本。每次 Action 后的 Observe 结果应当真实反馈到下一轮的 Thought 中。

🔌MCP 协议:模型上下文协议

Model Context Protocol(MCP)由 Anthropic 于 2024 年底提出并开源,是一种标准化 Agent 与外部数据源、工具连接的首选协议。MCP 的设计目标是:让 Agent 能够动态发现和连接多样化的数据源与工具,而无需为每个数据源单独定制集成代码。

MCP 架构

🧠

LLM / Agent

发起请求的消费方

🔌

MCP Host

协议运行的主机环境

🛠️

MCP Server

工具/资源的提供方

📦

Local / Remote

本地进程或远程服务

MCP 采用JSON-RPC 2.0作为传输层协议,支持两种连接模式:

  • stdio 模式:通过标准输入/输出通信,适合本地工具集成
  • HTTP + SSE 模式:通过 HTTP 传输,支持远程服务发现与调用

MCP 核心原语

🛠️ Tools

Agent 可调用的外部能力

  • list_tools — 发现可用工具
  • call_tool — 执行工具调用
  • 工具返回结构化 JSON

📄 Resources

可供读取的数据内容

  • list_resources — 列出资源
  • read_resource — 获取内容
  • 支持模板化 URI

📝 Prompts

预定义的可复用提示模板

  • list_prompts — 发现模板
  • get_prompt — 获取完整提示
  • 支持动态参数注入

MCP Server 实现示例

# 使用 FastMCP 框架的简单 MCP Server
from fastmcp import FastMCP

mcp = FastMCP("WeatherService")

@mcp.tool()
def get_weather(city: str, country: str = "US") → dict:
    "Get current weather for a city"
    # 调用天气 API 并返回结果
    return {"city": city, "temp": "8°C", "condition": "sunny"}

@mcp.resource("weather://{city}")
def weather_resource(city: str) → str:
    "Template resource for weather data"
    return f"# Weather: {city}\n\nReal-time weather data..."

MCP 的关键优势在于其可发现性:通过 list_toolslist_resources 等元操作,Agent 可以在运行时动态了解自身可用的能力集,而非硬编码工具列表。这为构建真正动态、可组合的 Agent 系统奠定了协议基础。

🤝A2A 协议:Agent 间通信标准

Agent-to-Agent Protocol(A2A)是 Anthropic 同期开源的另一核心协议,专注于解决不同 Agent 之间如何高效、标准地交换信息与协作的问题。如果说 MCP 是 Agent 与工具的接口标准,A2A 则是 Agent 与 Agent 之间的"外交护照"。

A2A 核心概念

  • Task(任务):A2A 的核心工作单元,每个任务有唯一 ID、状态和结果
  • Agent Card(元数据):每个 Agent 公开自身能力的描述,供其他 Agent 发现
  • Message(消息):Agent 间传递的上下文单元,支持多模态内容
  • Skill(技能):Agent 声明其擅长处理的任务类型

A2A 与 MCP 的关系

维度 MCP A2A
定位 Agent ↔ 工具/数据源 Agent ↔ Agent
交互模式 请求-响应(同步) 支持异步任务流
状态管理 无状态 任务全生命周期管理
发现机制 运行时列表查询 Agent Card 静态发现
典型场景 工具调用、数据库查询 委托任务、子Agent协作

A2A 任务生命周期

submitted
working
completed
input-required
working
failed

A2A 协作示例:研究Agent委托

# Agent A 通过 A2A 委托任务给 Agent B
# 1. 发现 Agent B 的能力
agent_b_card = a2a_client.get_agent_card("research-agent")
# → 返回 Agent B 的 skills, description, endpoint

# 2. 提交任务
task = a2a_client.create_task(
    agent_id  = "research-agent",
    skill     = "web_research",
    input     = {"query": "MCP 协议最新进展", "depth": "comprehensive"}
)

# 3. 轮询任务状态或订阅 SSE 流
while task.status == "working":
    updates = a2a_client.get_task_updates(task.id)
    for update in updates:
        print(f"Progress: {update.message}")
    sleep(1)

# 4. 获取最终结果
result = a2a_client.get_task_result(task.id)
# → { "summary": "...", "sources": [...], "confidence": 0.92 }

👥多Agent协作模式

当单一 Agent 的能力无法满足复杂系统需求时,多 Agent 协作成为必然选择。不同 Agent 可以拥有不同的专业知识、工具集和决策策略,通过结构化的协作机制共同完成单一 Agent 无法企及的任务。

四大协作模式

串行 · Sequential

流水线模式

Agent B 等待 Agent A 完成,Agent C 等待 Agent B,以此类推。适合有明确依赖链的预处理-执行-后处理流程。

并行 · Parallel

分而治之模式

同一任务被分解为多个独立子任务,由多个 Agent 并发执行后再合并结果。适合调研、分析等可并行的任务。

层次 · Hierarchical

管理者-工作者模式

Manager Agent 负责任务分解与结果整合,Worker Agent 负责具体执行。Manager 可调用多个 Worker 并控制执行策略。

网状 · Mesh

对等协作模式

Agent 之间通过 A2A 协议直接通信,根据任务需求动态协商角色。适合复杂、自组织的协作场景。

协作中的挑战与应对

  • 信息传递损耗:每次 Agent 间传递都可能丢失上下文细节。应对策略:使用结构化输出 Schema + 摘要压缩 + 关键信息标记。
  • 循环依赖:Agent A 等 Agent B,Agent B 等 Agent A。应对策略:超时机制 + 依赖图检测 + 强制仲裁。
  • 状态一致性:多个 Agent 共享状态时产生冲突。应对策略:中央协调器 + 乐观锁 + 事件溯源。
  • 通信开销:频繁的 Agent 间调用带来延迟。应对策略:批量消息 + 本地缓存 + 异步非阻塞调用。

Supervisor 架构示例

# 伪代码:Supervisor 控制的多Agent系统
class Supervisor:
    agents = {
        "researcher": ResearchAgent(),
        "coder":      CodeAgent(),
        "reviewer":  ReviewAgent(),
    }

    def handle(task):
        plan = self.planner.decompose(task)
        # 顺序执行,带条件分支
        context = {}
        for step in plan.steps:
            agent = self.agents[step.agent]
            result = agent.execute(step.input, context)

            if step.branch_on and not self.evaluator.is_satisfied(result):
                # 回退到替代路径
                alt_plan = self.planner.get_alternative(step)
                plan = alt_plan + plan_rest
                continue

            context[step.key] = result

        return self.orchestrator.finalize(context)
多 Agent 系统的核心设计哲学是:让每个 Agent 保持职责单一、边界清晰,通过协议而非共享状态进行交互。这与微服务架构的思路一脉相承,却面临 LLM 输出不确定性这一全新的工程挑战。

🏗️完整 Agent 系统架构

以下是一个生产级别的 AI Agent 系统完整架构视图,涵盖从 LLM 推理引擎到外部工具集成的所有关键层次。

┌─────────────────────────────────────────────┐
User / Application
└──────────────────┬──────────────────────────┘
│ HTTP / WebSocket
┌──────────────────▼──────────────────────────┐
Agent Gateway / Router
│ (Auth · Rate Limit · Session Management) │
└──┬──────────┬──────────┬────────────────────┘
│ │ │
┌──────▼───┐ ┌────▼────┐ ┌───▼────────────────┐
Planner │ │ Memory │ │ Tool Registry
│(ReAct/ToT)│ │ (分层) │ │ (MCP Servers) │
└────┬─────┘ └───┬────┘ └──┬─────────────────┘
│ │ │
┌────▼───────────▼──────────▼─────────────────┐
LLM Inference Engine
│ (vLLM / TGI / OpenAI Compatible API) │
└──────────────────┬──────────────────────────┘

┌──────────────▼──────────────────────────┐
External World
│ (Web APIs · DB · Filesystem · IoT) │
└────────────────────────────────────────┘

各层职责说明

  • Agent Gateway:系统入口,负责认证鉴权、流量控制(Token Bucket / Leaky Bucket)、会话管理(维护多轮对话状态)和请求路由(根据 Agent 类型分发到对应实例)。
  • Planner:决策核心,根据当前任务选择推理策略(ReAct / CoT / Plan-and-Execute),生成工具调用计划,管理执行状态机,处理回退与重试逻辑。
  • Memory:采用向量数据库(如 Milvus、Pinecone)存储情景记忆,配合知识图谱(如 Neo4j)提供语义记忆能力,工作记忆层通过 Redis 实现高速读写。
  • Tool Registry:基于 MCP 协议连接各类外部服务(搜索、数据库、云API),支持运行时工具注册与发现,配备沙箱执行环境保障安全。
  • LLM Inference Engine:底层推理服务,支持自托管(vLLM + TensorRT)或云服务(OpenAI / Anthropic / Groq),通过连续批处理(Continuous Batching)最大化吞吐。

工程实践要点

可靠性保障

  • 幂等设计:工具调用应尽可能幂等,Agent 因超时重试时不会产生副作用
  • 超时与熔断:每个外部调用设置合理超时(建议 5-30s),连续失败时触发熔断
  • 状态快照:定期保存 Agent 状态到持久化存储,支持从故障点恢复
  • 输出验证:对 LLM 输出进行 Schema 校验,防止解析失败影响后续流程

安全边界

  • 最小权限:Agent 的工具调用权限应遵循最小权限原则,危险操作需二次确认
  • 输入净化:对用户输入进行过滤,防止提示注入(Prompt Injection)攻击
  • 沙箱执行:代码执行、Shell 命令等高危工具必须在隔离环境中运行
  • 审计日志:完整记录所有工具调用的时间、参数和返回值,供事后审计

性能优化

  • 批量工具发现:预热时加载所有工具定义,避免运行时动态发现的开销
  • 流式输出:使用 SSE/WebSocket 流式返回推理过程,提升用户体验
  • 记忆压缩:当对话历史超过阈值时,自动进行信息压缩与摘要
  • 并行预取:在当前步骤执行时,后台预取下一步可能需要的数据

成本控制

  • 路由分级:简单问题路由到小模型,复杂问题才使用大模型
  • 缓存复用:相同查询的向量检索结果和推理结果均应缓存
  • Token 预算:设置每次会话的 Token 上限,防止无限生长的上下文
  • 计量计费:对每个 Agent 实例独立计量,支持按使用量计费

🔮发展趋势与展望

AI Agent 领域正处于快速演进期,以下几个方向值得关注:

  • 协议标准化加速:MCP 与 A2A 协议正在获得更广泛的行业支持,预计 2026 年将成为 Agent 互操作的事实标准
  • 持久化 Agent:从会话级 Agent 向持久化 Agent 演进,Agent 可以在后台持续运行数天甚至数周,主动监控和响应事件
  • 多模态 Agent:融合视觉、语音、视频理解能力的 Agent,将打开自动化审批、远程协作等新场景
  • 自主性与安全性的平衡:随着 Agent 自主能力增强,对齐(Alignment)与安全约束的研究将成为核心焦点
  • 边缘部署:小体型 Agent(1-7B 参数)借助量化技术在边缘设备上运行,实现低延迟、低成本的本地推理
Agent 将从"会思考的工具"演变为"会行动的数字工作者"。在这一演进过程中,架构师的核心挑战不再是"如何让 Agent 变得更聪明",而是"如何在保持可控的前提下,释放 Agent 的生产力"。