AI Agent 架构深度解析

Agent 是当前 AI 工程领域最热的方向之一。它不只是一个"会调工具的 LLM",而是一套完整的决策-执行-反馈循环系统。本文从架构角度系统梳理 Agent 的核心模式、关键组件和工程挑战。

什么是 Agent

最简单的定义:Agent = LLM + 工具 + 循环

传统 LLM 应用是单次请求-响应,用户输入 → 模型输出 → 结束。Agent 的核心差异在于引入了循环:模型可以根据上一步的结果决定下一步做什么,直到任务完成。

这个循环带来了质变:Agent 可以处理需要多步推理、动态决策、与外部系统交互的复杂任务,而这些是单次调用无法完成的。

核心架构模式

ReAct 模式

ReAct(Reasoning + Acting)是最基础也最常用的 Agent 模式,由 Google 在 2022 年提出。

核心思路是让模型交替输出三种内容:

  • Thought:当前的推理过程,分析情况、制定计划
  • Action:调用某个工具执行操作
  • Observation:工具返回的结果

这个 Thought → Action → Observation 的循环不断重复,直到模型判断任务完成并输出最终答案。

Thought: 用户问的是今天北京的天气,我需要调用天气 API。
Action: get_weather(city="北京", date="today")
Observation: {"temp": 18, "weather": "晴", "wind": "东南风3级"}
Thought: 已经拿到天气数据,可以回答了。
Answer: 今天北京天气晴,气温 18°C,东南风 3 级。

ReAct 的优点是简单直观,模型的推理过程完全透明可追踪。缺点是每一步都依赖上一步的结果,无法并行,长任务容易在中途迷失方向。

Plan-and-Execute 模式

Plan-and-Execute 将任务分成两个阶段:先规划,再执行。

规划阶段:用一个 Planner LLM 把复杂任务拆解成有序的子任务列表。

执行阶段:用一个 Executor LLM 逐步执行子任务,每步完成后更新计划状态。

任务:帮我调研竞品并生成分析报告

Plan:
  1. 搜索主要竞品列表
  2. 分别抓取各竞品官网信息
  3. 对比核心功能差异
  4. 生成 Markdown 格式报告

Execute:
  Step 1 → 搜索结果:[竞品A, 竞品B, 竞品C]
  Step 2 → 抓取完成,数据已存储
  Step 3 → 差异分析完成
  Step 4 → 报告生成完毕

与 ReAct 相比,Plan-and-Execute 更适合长任务。规划和执行解耦,可以在执行中途重新规划(Re-plan),也更容易实现子任务并行。

Reflection 模式

Reflection 让 Agent 具备自我评估和纠错能力。执行完一个步骤后,引入一个独立的 Critic 角色对结果进行审查,发现问题则触发重试或修正。

这个模式有两种变体:

Self-Reflection:同一个模型对自己的输出进行反思,prompt 中明确要求模型找出潜在问题。

外部 Critic:用独立的模型或专门微调的模型做评审,与执行模型分离,避免自我确认偏差。Claude Code 里的验证专家 Agent 就是典型的外部 Critic 模式,且在 prompt 中明确告知 Critic:"你自己也容易犯错,不要轻易放行。"

多 Agent 协作模式

当任务足够复杂,单个 Agent 的 context 窗口和能力都会成为瓶颈。多 Agent 架构将任务分配给多个专门化的 Agent 并行处理。常见的拓扑结构有三种:

Orchestrator-Worker:一个主 Agent 负责任务分解和结果汇总,多个 Worker Agent 负责执行具体子任务。主 Agent 不直接操作工具,只做调度。

Pipeline:Agent 串行排列,上一个 Agent 的输出是下一个的输入。适合有明确阶段划分的流程,如"提取 → 分析 → 生成报告"。

Peer-to-Peer:Agent 之间平等协作,通过消息传递共享信息。适合需要多个专家角色讨论的场景,但协调复杂度较高。

核心组件

工具系统

工具是 Agent 与外部世界交互的唯一接口,工具的设计直接决定 Agent 的能力边界。一个好的工具定义需要包含名称、详细描述、参数 Schema 和返回值说明。

{
  "name": "search_web",
  "description": "搜索互联网获取最新信息。适用于需要实时数据或知识截止日期之后的信息。不适用于本地文件操作。",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "搜索关键词,建议使用精确的关键词而非长句"
      },
      "num_results": {
        "type": "integer",
        "description": "返回结果数量,默认 5,最大 20",
        "default": 5
      }
    },
    "required": ["query"]
  }
}

工具数量不是越多越好。工具过多会稀释模型的注意力,导致选择错误。实践中建议单次请求的工具数量控制在 20 个以内,并通过懒加载机制按需注入。

Memory 系统

Agent 的 Memory 分为四个层次:

  • In-context Memory:当前 context 窗口里的对话历史和工具调用记录。最直接但容量有限,超出后需要截断或压缩。
  • External Memory:向量数据库、文档存储等外部存储。Agent 通过检索工具按需读取,理论上无上限,但检索质量决定了可用性。
  • Episodic Memory:历史任务的执行摘要。Agent 完成一个任务后,将关键信息提炼存储,供后续任务参考。
  • Procedural Memory:固化在 system prompt 或工具定义里的行为规范。这是最稳定的 memory,但更新成本高。

Context 管理

Context 窗口是 Agent 最核心的资源,管理不当会导致性能下降甚至任务失败。常见策略:

  • 滑动窗口:只保留最近 N 轮对话,实现简单,但可能丢失关键信息。
  • 摘要压缩:定期让模型对历史对话生成摘要,用摘要替换原始记录,保留语义信息。
  • 重要性过滤:标记关键信息,压缩时优先保留用户核心需求和重要中间结果。
  • 分层缓存:将 context 分为静态部分(system prompt、工具定义)和动态部分(对话历史),分别管理缓存策略。

可靠性设计

错误处理与重试

Agent 在执行过程中面临多种错误:工具调用失败、模型输出格式错误、任务陷入死循环等。基本原则:

  • 工具错误:将错误信息作为 Observation 返回给模型,让模型决定是重试还是换策略
  • 格式错误:设置 output parser,解析失败时触发重新生成,最多重试 3 次
  • 死循环检测:设置最大步骤数(max_steps),超出后强制中止并返回当前状态
  • 超时控制:每个工具调用设置独立超时,避免单个慢工具阻塞整个流程

幂等性与副作用控制

Agent 执行的操作分为只读操作(搜索、读文件)和写操作(修改文件、发送消息、调用 API)。写操作需要特别谨慎:设计工具时尽量让操作幂等,对不可逆操作增加确认步骤,记录所有写操作的日志支持回滚。

人机协作

完全自主的 Agent 在生产环境中风险较高。实践中通常采用 Human-in-the-loop 设计:

  • 审批节点:在关键操作前暂停,等待人工确认后继续。
  • 置信度阈值:Agent 对自己的决策不确定时,主动请求人工介入而非盲目执行。
  • 操作沙箱:Agent 默认在受限环境中运行,只有明确授权的操作才能影响生产系统。

工程实践

Prompt 工程

Agent 的 system prompt 是整个系统最重要的配置,需要明确定义角色定位、任务边界、行为规范和输出格式。一个常见的误区是 system prompt 写得太短,期望模型自己推断行为规范。实践证明,越详细的 prompt 往往带来越稳定的行为。

可观测性

Agent 的调试比普通程序难得多,因为执行路径是动态的。好的可观测性设计需要:

  • 完整的 trace:记录每一步的输入、输出、耗时、token 消耗
  • 工具调用日志:每次工具调用的参数和返回值
  • 决策追踪:模型的 Thought 过程,理解为什么做出某个决策
  • 成本监控:按任务统计 token 消耗和 API 费用,识别异常

评估与测试

Agent 的测试比传统软件更复杂,因为输出存在随机性。常用的评估方法:

  • 轨迹评估:评估 Agent 的执行路径是否合理,而非只看最终结果
  • 对比测试:同一任务跑多次,统计成功率和平均步骤数
  • 边界测试:构造极端输入(空输入、超长输入、恶意输入),验证 Agent 的鲁棒性
  • 回归测试集:收集历史上出现过问题的 case,每次更新 prompt 或工具后自动回归

主流框架对比

目前生产环境中常用的 Agent 框架:

  • LangGraph:基于图的状态机模型,适合复杂的多 Agent 工作流,状态管理清晰
  • AutoGen:微软出品,多 Agent 对话框架,支持 Human-in-the-loop,上手简单
  • CrewAI:角色扮演式多 Agent,适合需要明确分工的团队协作场景
  • OpenAI Swarm:轻量级多 Agent 框架,核心概念只有 Agent 和 Handoff,极简
  • Claude Code SDK:Anthropic 官方 Agent SDK,深度集成 Claude 的工具调用和子 Agent 机制

选择框架的核心原则:简单任务不需要框架,直接调用 API;复杂任务优先选择概念简单、可观测性好的框架,避免过度抽象带来的调试困难。

总结

Agent 架构的核心是循环 + 工具 + 记忆,在这个基础上演化出了 ReAct、Plan-and-Execute、Reflection、多 Agent 协作等不同模式,各有适用场景。

工程实践上,可靠性设计比功能设计更重要。一个能稳定完成 80% 任务的 Agent,比一个偶尔能完成 100% 但经常失败的 Agent 更有价值。错误处理、幂等性、Human-in-the-loop、可观测性,这些"非功能性"设计往往决定了 Agent 能否真正落地。

最后,Agent 不是银弹。并非所有任务都适合用 Agent 解决——如果一个任务可以用简单的 prompt 或确定性代码完成,就不要引入 Agent 的复杂性。