Skip to content

01.2 — Agent 架构模式

定位: 理解 AI Agent 的三种经典架构模式——从最简单的 Self-Reflection 到最复杂的 Multi-agent 协作 面试高频度: ⭐⭐⭐⭐⭐ 考查方式: 模式辨析(什么时候用什么模式)、设计题(设计一个 XX 场景的 Agent)、架构对比


一、这是什么?为什么需要它?

是什么

Agent 架构模式 是构建 AI Agent 的"套路"——经过验证的、可复用的 Agent 系统设计方案。不同的模式适用于不同的任务复杂度。

为什么需要架构模式?

没有架构模式之前,构建 Agent 就像"让 LLM 自由发挥":

❌ 没有模式的 Agent:
- 同一个问题可能走完全不同的路径
- 无法保证行为的一致性
- 遇到复杂任务就"迷路"
- 难以 debug、难以优化

✅ 有模式的 Agent:
- 行为可预测、可控制
- 复杂度可以渐进式增长
- 每个模式解决特定类型的问题
- 团队沟通有共同语言

核心洞察:架构模式就是给 Agent 的"思考框架"——不限制它的能力,但给它一个结构化的思维路径。


二、原理拆解

2.1 三大经典模式总览

模式核心思想复杂度何时使用
ReflectionAgent 自己检查自己的输出需要质量把控的简单任务
Tool UseAgent 调用外部工具完成任务⭐⭐⭐需要与外部世界交互
ReAct推理 + 行动交替进行⭐⭐⭐⭐⭐需要深度推理+多步骤的复杂任务

2.2 模式一:Reflection(自我反思)

核心思想:Agent 生成输出后,自我 review 并改进。

┌──────────────────────────────────────────────┐
│             Reflection 架构                     │
│                                               │
│  用户请求                                      │
│     │                                         │
│     ▼                                         │
│  ┌──────────┐  生成  ┌────────────┐           │
│  │  Actor   │───────→│  初始输出   │           │
│  │  (生成)  │        └──────┬─────┘           │
│  └──────────┘              │                  │
│                            ▼                  │
│  ┌──────────┐  评价  ┌────────────┐           │
│  │  Critic  │───────→│  质量评价   │           │
│  │  (评价)  │        └──────┬─────┘           │
│  └──────────┘              │                  │
│                      ┌─────┴─────┐            │
│                      │           │            │
│                      ▼           ▼            │
│                  ┌────────┐ ┌────────┐        │
│                  │ 合格 ✅ │ │ 不合格  │        │
│                  │ 输出   │ │ 重新生成│        │
│                  └────────┘ └────────┘        │
│                                               │
└──────────────────────────────────────────────┘

实现要点

  • Actor 和 Critic 可以是同一个 LLM(不同 prompt)
  • 循环次数需要限制(通常 2-3 轮)
  • 质量评价标准要具体(不要"看起来对不对",要"checklist 式")
python
# 最小 Reflection 实现
def agent_with_reflection(task: str, max_rounds: int = 3):
    for round in range(max_rounds):
        # Actor:生成/改进
        output = llm.call(f"生成:{task}\n之前反馈:{feedback if round > 0 else '无'}")
        
        # Critic:评价
        critique = llm.call(f"检查以下输出是否满足要求:{output}\n问题:1. 完整性?2. 正确性?")
        
        if "完全正确" in critique:
            return output
        
        feedback = critique
    
    return output  # 达到最大轮次后返回最后一次结果

实战场景

  • 代码生成 + 代码审查
  • 文章写作 + 质量改进
  • SQL 生成 + 验证

2.3 模式二:Tool Use(工具使用)

核心思想:LLM 输出结构化工具调用指令,系统执行并返回结果。

┌─────────────────────────────────────────────────────┐
│              Tool Use 架构                            │
│                                                      │
│  用户请求                                             │
│     │                                                │
│     ▼                                                │
│  ┌─────────────────────────────────────┐             │
│  │           LLM 推理引擎               │             │
│  │                                      │             │
│  │  我需要查询数据库 → 调用 query_db()  │             │
│  │  需要计算结果 → 调用 calculator()    │             │
│  └──────────────┬──────────────────────┘             │
│                 │  tool_call                          │
│                 ▼                                     │
│  ┌─────────────────────────────────────┐             │
│  │        工具注册中心 / Runtime         │             │
│  │                                      │             │
│  │  ┌──────────┐ ┌──────────┐ ┌──────┐ │             │
│  │  │ search() │ │ calc()   │ │ db() │ │ ...         │
│  │  └──────────┘ └──────────┘ └──────┘ │             │
│  └──────────────┬──────────────────────┘             │
│                 │ result                              │
│                 ▼                                     │
│  ┌─────────────────────────────────────┐             │
│  │  LLM 整合结果 → 生成最终回答          │             │
│  └─────────────────────────────────────┘             │
│                                                      │
└──────────────────────────────────────────────────────┘

关键设计决策

决策选项说明
工具如何被发现?预注册 / 动态发现预注册更可靠,动态发现更灵活
工具调用是同步/异步?同步 / 异步耗时工具用异步,避免阻塞
工具执行出错怎么办?重试 / 换工具 / 报错优雅降级优于直接失败
谁来选择工具?LLM / 路由规则LLM 更灵活,路由更可控
python
# 最小 Tool Use 实现
TOOLS = {
    "search": lambda q: f"搜索结果: {q}的相关信息",
    "calculate": lambda expr: eval(expr),
    "current_time": lambda: "2026-07-16 12:00:00"
}

def agent_with_tools(user_input: str):
    messages = [{"role": "user", "content": user_input}]
    
    while True:
        response = llm.call(messages, tools=list(TOOLS.keys()))
        
        if response.has_tool_call():
            # 执行工具
            for tool_call in response.tool_calls:
                result = TOOLS[tool_call.name](**tool_call.args)
                messages.append({"role": "tool", "content": result})
        else:
            return response.content  # 纯文本回答

2.4 模式三:ReAct(推理 + 行动)

核心思想:推理(Thought) 和行动(Action) 交替进行,每一步的观察(Observation) 作为下一步推理的输入。

┌──────────────────────────────────────────────────────────┐
│                    ReAct 循环                              │
│                                                          │
│  Question: 2025年巴黎奥运会中国获得了多少金牌?            │
│                                                          │
│  ┌─ Thought ────────────────────────────────────────┐    │
│  │ 我需要查找 2025 年巴黎奥运会的金牌数据。            │    │
│  │ 先搜索"2025 Paris Olympics China gold medals"    │    │
│  └──────────────────┬──────────────────────────────┘    │
│                     │                                    │
│  ┌─ Action ─────────▼──────────────────────────────┐    │
│  │ search("2025 Paris Olympics China gold medals") │    │
│  └──────────────────┬──────────────────────────────┘    │
│                     │                                    │
│  ┌─ Observation ────▼──────────────────────────────┐    │
│  │ 中国在 2025 年巴黎奥运会获得 40 枚金牌           │    │
│  └──────────────────┬──────────────────────────────┘    │
│                     │                                    │
│  ┌─ Thought ────────▼──────────────────────────────┐    │
│  │ 找到数据了。不过我需要验证一下这个数字的准确性。    │    │
│  │ 再搜索其他来源确认。                              │    │
│  └──────────────────┬──────────────────────────────┘    │
│                     │                                    │
│  ┌─ Action ─────────▼──────────────────────────────┐    │
│  │ search("2025 Paris Olympics medal table China")  │    │
│  └──────────────────┬──────────────────────────────┘    │
│                     │                                    │
│  ┌─ Observation ────▼──────────────────────────────┐    │
│  │ 多源确认:中国 40 金,排名第一                   │    │
│  └──────────────────┬──────────────────────────────┘    │
│                     │                                    │
│  ┌─ Final Answer ───▼──────────────────────────────┐    │
│  │ 中国在 2025 年巴黎奥运会获得 40 枚金牌,排名第一  │    │
│  └─────────────────────────────────────────────────┘    │
│                                                          │
└──────────────────────────────────────────────────────────┘

ReAct vs Tool Use 的关键区别

维度Tool UseReAct
推理是否外显不强制强制——每一步都有 Thought
行动序列可能一次调多个工具一步一步交替
可解释性——可见推理过程
适用场景直接的工具调用需要推理的复杂任务
代表框架OpenAI FunctionsLangGraph ReAct Agent
python
# 最小 ReAct 实现
def react_agent(question: str, max_steps: int = 5):
    prompt = f"""你是一个 ReAct Agent。请交替进行:
Thought: 思考下一步做什么
Action: 调用工具(格式: 工具名(参数))
Observation: 工具返回的结果

完成时输出: Final Answer: 你的答案

可用工具: search(query), calculate(expr)
问题: {question}"""

    for step in range(max_steps):
        response = llm.call(prompt)
        
        if "Final Answer:" in response:
            return response.split("Final Answer:")[1].strip()
        
        if "Action:" in response:
            action = parse_action(response)
            result = execute_tool(action)
            prompt += f"\nObservation: {result}"
    
    return "达到最大步骤限制"

三、图解全景

┌────────────────────────────────────────────────────────────┐
│               Agent 架构模式选择决策树                       │
│                                                            │
│  任务开始                                                    │
│     │                                                      │
│     ▼                                                      │
│  需要外部工具/信息吗?                                      │
│     ├── 否 ──→ Reflection 模式足够吗?                      │
│     │           ├── 是 ─→ 🟢 Reflection                     │
│     │           └── 否 ─→ 需要更复杂的架构(见下文)        │
│     │                                                      │
│     └── 是 ──→ 任务需要多步推理吗?                         │
│                 ├── 否 ─→ 🟢 Tool Use                       │
│                 └── 是 ─→ 🟢 ReAct                         │
│                                                            │
│  复杂度递进:                                                 │
│  Reflection → Tool Use → ReAct → Multi-agent               │
│  (本笔记)        (本笔记)     (本笔记)    (见板块5)         │
│                                                            │
└────────────────────────────────────────────────────────────┘

四、实战验证

4.1 用 Python 对比三种模式

python
# === 场景:分析销售数据并生成报告 ===

# Reflection 模式:先生成再自我改进
def reflection_approach(data: str):
    draft = llm.call(f"根据数据生成报告:{data}")
    review = llm.call(f"审查并改进这份报告:{draft}\n标准:数据准确、结构清晰")
    return review

# Tool Use 模式:调用分析工具
def tool_use_approach(data: str):
    stats = analyze_tool(data)  # 调用分析工具
    chart = chart_tool(stats)   # 调用制图工具
    return llm.call(f"基于分析结果{stats}和图表{chart}生成报告")

# ReAct 模式:边推理边操作
def react_approach(query: str):
    # Thought: 需要先分析数据趋势
    # Action: analyze_tool(data)
    # Observation: 发现 Q3 销售额下降
    # Thought: 需要查找原因
    # Action: search("Q3 sales decline reason")
    # Observation: 发现是因为产品线调整
    # Final: 综合分析报告
    pass

4.2 模式选择决策验证

python
# 通过任务特征验证模式选择是否正确
test_cases = [
    {
        "task": "写一篇 500 字的文章",
        "best_mode": "Reflection",
        "reason": "不需要外部信息,重点在质量改进"
    },
    {
        "task": "查询北京上海之间的高铁班次",
        "best_mode": "Tool Use",
        "reason": "需要实时数据,但不需要多步推理"
    },
    {
        "task": "比较三种云服务商的成本并推荐最优方案",
        "best_mode": "ReAct",
        "reason": "需要多步查询+推理+比较"
    }
]

for case in test_cases:
    print(f"任务: {case['task']} → 推荐: {case['best_mode']} ({case['reason']})")

五、面试视角

追问答案要点
三种架构模式的区别和选择标准?Reflection 用于质量改进(输出自检),Tool Use 用于工具调用(一步到位),ReAct 用于复杂推理(思考行动交替)。选择看:是否需要外部信息 + 是否需要多步推理
ReAct 和 Tool Use 的本质区别?ReAct 强制 Thought 步骤,推理过程外显可追踪;Tool Use 可以一次调用多个工具,不强制中间推理。ReAct 更"慢但可靠",Tool Use 更"快但浅"
Reflection 的 Actor-Critic 可以用同一个 LLM 吗?可以,但需要用不同的 prompt。同一个 LLM 做 Critic 时容易"对自己的输出过于自信"——建议用不同的 temperature(Actor 高、Critic 低)
ReAct 如何防止无限循环?最大步数限制(hard stop)、时间超时、相似状态检测(如果连续 3 步 Thought 相似,强制终止)、确定性工具使用(避免 LLM 反复调用同一工具)
模式可以组合吗?可以。实际生产系统中通常是组合使用:ReAct 循环中每个 Action 步骤内部可能用 Reflection 来提高工具调用的质量
如何评估 Agent 架构选择的合理性?评估维度:任务完成率、平均步数、工具调用准确率、用户满意度。核心指标是"用最低复杂度解决了问题"

📚 相关链接

  • **什么是AI Agent** — Agent 定义与核心概念
  • **感知-行动循环** — 感知-行动循环的深入解析
  • **CoT 与 ReAct** — ReAct 模式的深入展开
  • **多智能体系统** — 第四种架构模式的深入
  • ← 返回 **Agent基础索引**

Knowledge4J — Java 知识库