跳至主要內容

深入理解 AI Agent:从概念架构到工程实践

郑天祺大约 12 分钟大模型AI Agent大模型架构设计

【进阶篇】深入理解 AI Agent:从概念架构到工程实践


前言

随着大语言模型(LLM)能力的快速跃升,AI Agent 已从理论概念走向规模化落地。它不再是简单的"问答机器",而是能够感知环境、自主规划、调用工具、持续记忆、完成复杂任务的智能体系统。

本文将系统拆解 Agent 的核心概念组成、决策机制、典型应用场景,以及任务拆解方法论(CoT / ToT),同时深入讲解记忆模块设计与工具调用实现,帮助你从原理到实践全面掌握 Agent 工程。


一、Agent 的概念组成

一个完整的 AI Agent 系统,通常由以下五大核心模块构成:

┌─────────────────────────────────────────────────────────┐
│                      AI Agent 架构                       │
│                                                         │
│   输入感知层                                             │
│   ┌──────────┐                                          │
│   │ Perception│ ← 文本 / 图像 / 音频 / 结构化数据        │
│   └──────┬───┘                                          │
│          ▼                                              │
│   ┌──────────────────────────────────────┐              │
│   │           核心决策引擎(LLM)          │              │
│   │   Planning → Reasoning → Acting      │              │
│   └──────┬──────────────────────┬────────┘              │
│          ▼                      ▼                       │
│   ┌──────────┐          ┌──────────────┐                │
│   │ 记忆模块  │          │  工具调用模块 │                │
│   │ Memory   │          │  Tool Use    │                │
│   └──────────┘          └──────────────┘                │
│          ▼                      ▼                       │
│   ┌──────────────────────────────────────┐              │
│   │              输出 & 反馈              │              │
│   └──────────────────────────────────────┘              │
└─────────────────────────────────────────────────────────┘

1.1 感知模块(Perception)

Agent 的"眼睛和耳朵",负责接收并理解外部输入:

  • 文本输入:用户指令、文档内容、历史对话
  • 多模态输入:图像、语音、视频帧、表格数据
  • 环境状态:API 返回结果、代码执行输出、网页内容

1.2 规划模块(Planning)

规划是 Agent 区别于普通 LLM 的核心能力——将目标分解为可执行的子任务序列:

  • 目标理解:解析用户意图,明确最终目标
  • 任务分解:将复杂目标拆解为多步子任务
  • 路径选择:根据上下文选择最优执行路径
  • 自我反思:对执行结果进行评估和调整

1.3 记忆模块(Memory)

记忆让 Agent 具备持续性和上下文感知能力(详见第五章)。

1.4 工具调用模块(Tool Use)

工具赋予 Agent 与外部世界交互的能力(详见第六章)。

1.5 执行与反馈模块(Action & Feedback)

Agent 执行决策并接收环境反馈,形成 感知-决策-行动-反馈 的闭环:

感知(Perceive) → 思考(Think) → 行动(Act) → 观察(Observe) → 循环

二、Agent 的决策机制

2.1 ReAct 框架

ReAct(Reasoning + Acting)是目前最主流的 Agent 决策范式,将推理与行动交织进行:

Thought: 我需要查询今天的天气来决定穿什么
Action: search_weather(city="北京")
Observation: 北京今天晴,气温 18-28°C
Thought: 天气温暖,适合穿轻薄外套
Action: finish(answer="建议穿轻薄外套")

核心优势:

  • 推理过程透明可追溯
  • 能根据观察结果动态调整策略
  • 错误可被中途纠正

2.2 Plan-and-Execute 框架

先生成完整计划,再逐步执行,适合结构化程度高的任务:

Step 1: [规划] 生成完整执行计划
Step 2: [执行] 按计划逐步完成子任务
Step 3: [验证] 检查输出是否符合预期
Step 4: [修正] 若失败则回到对应步骤修正

2.3 Reflexion(自我反思)

Agent 在执行后对自身行为进行语言层面的自我批评与改进:

执行 → 得到结果 → 评估是否达标 → 
  ✓ 达标:输出最终结果
  ✗ 未达标:生成反思总结 → 带着经验重新执行

三、Agent 应用场景分析

3.1 代码开发 Agent

典型产品: GitHub Copilot Workspace、Cursor、Claude Code

能力组合:

  • 读取代码库结构(文件系统工具)
  • 理解需求并规划修改方案(规划能力)
  • 编写代码、运行测试、修复 Bug(执行能力)
  • 记忆项目架构和编码规范(长期记忆)

典型工作流:

用户:"帮我实现用户登录功能"
↓
Agent 读取项目结构 → 理解技术栈
↓
规划:创建路由 → 编写控制器 → 添加验证 → 写测试
↓
逐步执行,每步运行测试验证
↓
输出完整实现 + PR 说明

3.2 数据分析 Agent

能力组合:

  • 读取数据文件(CSV、数据库)
  • 编写并执行 Python 分析代码
  • 生成可视化图表
  • 撰写分析报告

适用场景: 销售数据分析、用户行为洞察、财务报告生成

3.3 客户服务 Agent

能力组合:

  • 长期记忆用户历史(个性化服务)
  • 调用 CRM 系统查询订单状态
  • 执行退款、修改订单等操作
  • 知识库检索(RAG)

核心挑战: 边界控制(防止越权操作)、异常处理

3.4 研究助理 Agent

能力组合:

  • 网络搜索(实时信息获取)
  • PDF 阅读与总结
  • 知识图谱构建(长期记忆)
  • 多轮对话深度探讨

适用场景: 学术调研、竞品分析、市场研究报告

3.5 自动化工作流 Agent

能力组合:

  • 连接多个 SaaS 工具(邮件、日历、项目管理)
  • 根据触发条件自动执行流程
  • 跨系统数据同步

适用场景: 销售线索自动跟进、内容发布工作流、招聘流程自动化


四、任务拆解方法论:CoT 与 ToT

4.1 思维链(Chain of Thought,CoT)

CoT 通过引导模型"展示推理步骤"来提升复杂任务的准确率。

基本形式:

问题:一家咖啡店上午卖出 35 杯咖啡,下午卖出上午的 2 倍,
      晚上卖出下午的一半。请问全天共卖出多少杯?

普通回答:105 杯

CoT 回答:
Step 1:上午卖出 35 杯
Step 2:下午卖出 35 × 2 = 70 杯  
Step 3:晚上卖出 70 ÷ 2 = 35 杯
Step 4:全天共 35 + 70 + 35 = 140 杯
答案:140 杯

CoT 的三种形式:

类型特点适用场景
Zero-shot CoT直接加"Let's think step by step"通用推理任务
Few-shot CoT提供带推理步骤的示例特定领域任务
Auto-CoT自动生成推理示例批量任务处理

在 Agent 中的应用:

CoT 用于 Agent 的单步推理,帮助 Agent 在选择工具、判断结果、制定计划时生成可靠的中间推理过程。

system_prompt = """
在回答前,请先进行逐步思考:
1. 理解任务的核心目标
2. 分析需要哪些信息或工具
3. 制定执行步骤
4. 执行并验证结果
"""

4.2 思维树(Tree of Thought,ToT)

ToT 将线性的 CoT 扩展为树形搜索结构,允许 Agent 同时探索多条推理路径,并对中间结果进行评估和剪枝。

架构示意:

                    [根节点:问题]
                          │
          ┌───────────────┼───────────────┐
          ▼               ▼               ▼
      [思路A]          [思路B]          [思路C]
     /      \          /    \              │
  [A1]     [A2]     [B1]   [B2]         [C1]
  ✗差      ✓好      ✗差    ✓好          ✓好
           │               │              │
         [A2-1]          [B2-1]         [C1-1]
         最终答案         候选答案       候选答案

ToT 的核心组件:

① 思维生成(Thought Generator)

给定当前状态,生成 k 个候选的下一步思路
k=3:生成 3 个不同的推理方向

② 状态评估(State Evaluator)

对每个候选思路打分(0-10):
- 当前路径的合理性
- 达成目标的可能性
- 资源消耗估计

③ 搜索策略(Search Strategy)

- BFS(广度优先):适合探索范围广的问题
- DFS(深度优先):适合路径较深的问题
- Beam Search:保留 Top-K 路径继续探索

ToT 实现伪代码:

def tree_of_thought(problem, k=3, depth=3, strategy="BFS"):
    """
    ToT 核心算法
    """
    root = Node(state=problem)
    frontier = [root]
    
    for step in range(depth):
        next_frontier = []
        
        for node in frontier:
            # 生成 k 个候选思路
            candidates = generate_thoughts(node.state, k=k)
            
            for thought in candidates:
                child = Node(
                    state=apply_thought(node.state, thought),
                    parent=node
                )
                # 评估当前路径价值
                child.score = evaluate_state(child.state)
                next_frontier.append(child)
        
        # 按分数排序,保留最优路径
        frontier = sorted(next_frontier, 
                         key=lambda x: x.score, 
                         reverse=True)[:k]
    
    # 返回得分最高的路径
    best = max(frontier, key=lambda x: x.score)
    return extract_path(best)

4.3 CoT vs ToT 对比

维度CoTToT
路径结构线性(单路径)树形(多路径)
计算成本高(k × depth 倍)
容错能力弱(一错全错)强(可回溯剪枝)
适用复杂度中等复杂任务高复杂、多解空间任务
典型场景数学推理、逻辑判断创意写作、策略规划、博弈

选型建议:

  • 任务有明确步骤 → CoT
  • 任务需要创意探索或有多个可行方案 → ToT
  • 资源有限但需要一定容错 → Self-Consistency(多次 CoT 投票)

五、记忆模块设计

记忆是让 Agent 从"无状态工具"进化为"持续学习伙伴"的关键。

5.1 记忆的四种类型

┌─────────────────────────────────────────────────────┐
│                  Agent 记忆体系                      │
│                                                     │
│  ① 感知记忆        ② 短期记忆(工作记忆)            │
│  Sensory Memory    Working Memory                   │
│  (毫秒级)          (当前对话 Context Window)         │
│                                                     │
│  ③ 长期记忆                  ④ 外部记忆             │
│  Long-term Memory            External Memory        │
│  ┌────────────────┐          ┌──────────────────┐   │
│  │ 情节记忆        │          │ 向量数据库        │   │
│  │ (历史对话)      │          │ (RAG知识库)       │   │
│  ├────────────────┤          ├──────────────────┤   │
│  │ 语义记忆        │          │ 结构化数据库      │   │
│  │ (知识/事实)     │          │ (用户画像/日志)   │   │
│  ├────────────────┤          └──────────────────┘   │
│  │ 程序记忆        │                                 │
│  │ (技能/工具用法) │                                 │
│  └────────────────┘                                 │
└─────────────────────────────────────────────────────┘

5.2 短期记忆(工作记忆)

即 LLM 的 Context Window,Agent 当前"看得到"的全部信息。

管理策略:

class WorkingMemory:
    def __init__(self, max_tokens=128000):
        self.max_tokens = max_tokens
        self.messages = []
        self.system_context = ""
    
    def add_message(self, role, content):
        self.messages.append({"role": role, "content": content})
        # 超出限制时,压缩早期对话
        if self.estimate_tokens() > self.max_tokens * 0.9:
            self._compress_history()
    
    def _compress_history(self):
        """将早期对话总结压缩"""
        early_messages = self.messages[:10]
        summary = self._summarize(early_messages)
        self.messages = [
            {"role": "system", "content": f"历史摘要:{summary}"}
        ] + self.messages[10:]

5.3 长期记忆实现

长期记忆的核心是向量化存储与语义检索

from openai import OpenAI
import chromadb

class LongTermMemory:
    def __init__(self):
        self.client = OpenAI()
        self.db = chromadb.Client()
        self.collection = self.db.create_collection("agent_memory")
    
    def store(self, content: str, metadata: dict):
        """存储记忆"""
        # 1. 将内容向量化
        embedding = self.client.embeddings.create(
            input=content,
            model="text-embedding-3-small"
        ).data[0].embedding
        
        # 2. 存入向量数据库
        self.collection.add(
            embeddings=[embedding],
            documents=[content],
            metadatas=[metadata],
            ids=[f"mem_{hash(content)}"]
        )
    
    def retrieve(self, query: str, top_k: int = 5):
        """语义检索相关记忆"""
        query_embedding = self.client.embeddings.create(
            input=query,
            model="text-embedding-3-small"
        ).data[0].embedding
        
        results = self.collection.query(
            query_embeddings=[query_embedding],
            n_results=top_k
        )
        return results["documents"][0]

5.4 记忆的写入与遗忘策略

策略描述适用场景
全量存储保存所有对话对话量小的场景
摘要存储定期总结压缩长期运行的 Agent
重要性过滤只存重要信息资源受限场景
时间衰减旧记忆权重降低实时性要求高的场景
遗忘曲线模拟人类遗忘个人助手类产品

六、工具调用方法

工具调用是 Agent 突破 LLM 知识边界、与真实世界交互的核心机制。

6.1 工具调用的基本架构

用户请求
    ↓
LLM 分析意图
    ↓
选择工具 + 生成参数(Function Calling / Tool Use)
    ↓
执行工具(代码层面)
    ↓
获取结果 → 返回给 LLM
    ↓
LLM 综合生成最终回答

6.2 工具定义规范

以 OpenAI / Anthropic 格式为例:

# 工具定义
tools = [
    {
        "name": "web_search",
        "description": "搜索互联网获取实时信息。当需要最新数据、新闻或不在训练数据中的信息时使用。",
        "input_schema": {
            "type": "object",
            "properties": {
                "query": {
                    "type": "string",
                    "description": "搜索关键词,简洁精确"
                },
                "num_results": {
                    "type": "integer",
                    "description": "返回结果数量,默认5",
                    "default": 5
                }
            },
            "required": ["query"]
        }
    },
    {
        "name": "code_executor",
        "description": "执行 Python 代码并返回结果。用于计算、数据分析、文件处理等。",
        "input_schema": {
            "type": "object",
            "properties": {
                "code": {
                    "type": "string",
                    "description": "要执行的 Python 代码"
                }
            },
            "required": ["code"]
        }
    }
]

6.3 工具调用实现(完整示例)

import anthropic
import json

class AgentWithTools:
    def __init__(self):
        self.client = anthropic.Anthropic()
        self.tools = self._define_tools()
        self.tool_handlers = {
            "web_search": self._handle_search,
            "code_executor": self._handle_code,
            "get_weather": self._handle_weather,
        }
    
    def _define_tools(self):
        return [
            {
                "name": "web_search",
                "description": "搜索网络获取实时信息",
                "input_schema": {
                    "type": "object",
                    "properties": {
                        "query": {"type": "string"}
                    },
                    "required": ["query"]
                }
            }
            # ... 更多工具定义
        ]
    
    def run(self, user_message: str):
        messages = [{"role": "user", "content": user_message}]
        
        while True:
            # 调用 LLM
            response = self.client.messages.create(
                model="claude-sonnet-4-20250514",
                max_tokens=4096,
                tools=self.tools,
                messages=messages
            )
            
            # 检查是否需要调用工具
            if response.stop_reason == "tool_use":
                # 提取工具调用
                tool_calls = [
                    block for block in response.content 
                    if block.type == "tool_use"
                ]
                
                # 将助手消息加入历史
                messages.append({
                    "role": "assistant", 
                    "content": response.content
                })
                
                # 执行工具并收集结果
                tool_results = []
                for tool_call in tool_calls:
                    result = self._execute_tool(
                        tool_call.name, 
                        tool_call.input
                    )
                    tool_results.append({
                        "type": "tool_result",
                        "tool_use_id": tool_call.id,
                        "content": json.dumps(result, ensure_ascii=False)
                    })
                
                # 将工具结果加入历史,继续循环
                messages.append({
                    "role": "user",
                    "content": tool_results
                })
                
            else:
                # end_turn:返回最终结果
                return response.content[0].text
    
    def _execute_tool(self, tool_name: str, inputs: dict):
        handler = self.tool_handlers.get(tool_name)
        if not handler:
            return {"error": f"未知工具: {tool_name}"}
        try:
            return handler(**inputs)
        except Exception as e:
            return {"error": str(e)}
    
    def _handle_search(self, query: str):
        # 实际实现中调用搜索 API
        return {"results": [f"关于 '{query}' 的搜索结果..."]}
    
    def _handle_code(self, code: str):
        # 实际实现中在沙箱中执行代码
        import subprocess
        result = subprocess.run(
            ["python", "-c", code],
            capture_output=True, text=True, timeout=30
        )
        return {
            "stdout": result.stdout,
            "stderr": result.stderr,
            "returncode": result.returncode
        }

6.4 工具设计最佳实践

① 工具描述要精准

# ❌ 模糊描述
{"description": "获取信息"}

# ✅ 精准描述
{"description": "从公司数据库查询指定用户的订单历史。仅在用户明确询问自己的订单时使用。"}

② 参数验证要完善

def _handle_database_query(self, user_id: str, limit: int = 10):
    # 输入验证
    if not user_id or not user_id.isalnum():
        return {"error": "无效的用户ID"}
    if limit < 1 or limit > 100:
        return {"error": "limit 必须在 1-100 之间"}
    # 执行查询...

③ 错误处理要优雅

def _execute_tool(self, tool_name, inputs):
    try:
        result = self.tool_handlers[tool_name](**inputs)
        return {"success": True, "data": result}
    except TimeoutError:
        return {"success": False, "error": "工具执行超时,请稍后重试"}
    except PermissionError:
        return {"success": False, "error": "权限不足,无法执行此操作"}
    except Exception as e:
        return {"success": False, "error": f"执行失败: {str(e)}"}

④ 工具权限分级

TOOL_PERMISSIONS = {
    "read_only": ["web_search", "read_file", "query_database"],
    "write": ["create_file", "send_email", "update_record"],
    "dangerous": ["delete_file", "execute_system_command", "transfer_money"]
}

def check_permission(self, tool_name: str, user_level: str):
    """在执行危险操作前要求二次确认"""
    if tool_name in TOOL_PERMISSIONS["dangerous"]:
        return self._request_human_approval(tool_name)
    return True

七、构建生产级 Agent 的工程要点

7.1 可观测性

import logging
from dataclasses import dataclass
from datetime import datetime

@dataclass
class AgentTrace:
    timestamp: str
    step: int
    thought: str
    action: str
    action_input: dict
    observation: str
    duration_ms: float

class ObservableAgent:
    def __init__(self):
        self.traces = []
        self.logger = logging.getLogger("agent")
    
    def log_step(self, **kwargs):
        trace = AgentTrace(
            timestamp=datetime.now().isoformat(),
            **kwargs
        )
        self.traces.append(trace)
        self.logger.info(f"Step {trace.step}: {trace.action}")

7.2 Human-in-the-Loop

对于高风险操作,必须引入人工确认机制:

def execute_with_confirmation(self, action, threshold="medium"):
    risk_level = self.assess_risk(action)
    
    if risk_level == "high":
        # 必须人工确认
        confirmed = self.request_human_approval(action)
        if not confirmed:
            return {"status": "cancelled", "reason": "用户取消"}
    
    return self.execute(action)

7.3 成本控制

class CostAwareAgent:
    def __init__(self, max_budget_usd=1.0):
        self.budget = max_budget_usd
        self.spent = 0.0
    
    def check_budget(self, estimated_cost):
        if self.spent + estimated_cost > self.budget:
            raise BudgetExceededException(
                f"预算已用完: {self.spent:.4f}/{self.budget} USD"
            )
        self.spent += estimated_cost

八、总结与展望

核心要点回顾

Agent = 感知 + 规划 + 记忆 + 工具 + 行动

决策框架:ReAct(透明推理)→ Plan-Execute(结构化任务)→ Reflexion(自我改进)

任务拆解:
  CoT → 线性推理,低成本,中等复杂度
  ToT → 树形探索,高成本,高复杂度

记忆体系:
  短期(Context Window)+ 长期(向量数据库)+ 外部(结构化存储)

工具调用:
  定义 → 调用 → 执行 → 反馈 → 循环

未来趋势

  1. 多 Agent 协作:不同专长的 Agent 组成团队协同完成任务(AutoGen、CrewAI)
  2. Agent 标准化协议:MCP(Model Context Protocol)等标准推动工具生态统一
  3. 具身 Agent:与物理世界交互的机器人 Agent
  4. Agent 安全:防止越权、注入攻击、目标漂移的安全机制趋于成熟

参考资源

  • Wei et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
  • Yao et al. (2023). Tree of Thoughts: Deliberate Problem Solving with Large Language Models
  • Yao et al. (2022). ReAct: Synergizing Reasoning and Acting in Language Models
  • Anthropic. (2024). Building Effective Agents
  • OpenAI. Function Calling Documentation

上次编辑于:
贡献者: zhengtianqi