AI Agent 的核心能力循环:感知、规划、执行、反思与记忆的工程实现

0 阅读

AI Agent 为什么需要一个循环?

传统的 LLM 应用是线性的:用户输入 → Prompt 拼接 → LLM 生成 → 返回结果。这本质上是把大模型当成一个“高级函数”来用。但现实任务往往复杂得多。

文章配图

比如你让 Agent “帮我分析上个季度的销售数据,找出下滑最严重的区域,并生成一份包含建议的报告”。这个任务涉及多个步骤、状态传递、错误重试和结果判断。线性流水线无法应对这种复杂性,你需要的是一个持续运转的认知循环

这个循环包含五个阶段:

  • 感知(Perceive):理解用户意图与环境状态
  • 规划(Plan):拆解任务路径,决定下一步做什么
  • 执行(Act):调用工具完成具体操作
  • 反思(Reflect):评估结果,分析失败原因
  • 记忆(Remember):将经验沉淀为可复用的知识

这五个阶段不是单向流水线,而是一个闭环系统。每一次循环,Agent 都在更新上下文、调整策略、积累经验。循环的终止条件包括任务完成、达到最大迭代数、资源耗尽或人工干预。

感知:不只是“读懂用户说了什么”

感知是 Agent 认知循环的入口,决定了它对问题的理解深度。一个优秀的感知模块需要完成三件事:

  1. 意图识别:用户想要什么?是查询、创建、分析还是混合任务?
  2. 实体提取:任务涉及哪些具体对象?文件名、时间范围、数据源等。
  3. 上下文构建:当前对话历史、用户偏好、环境状态是什么?

工程上,可以用 Pydantic 定义结构化输出,确保 LLM 返回的意图信息是强类型的、可验证的。例如:

from pydantic import BaseModel, Field
from enum import Enum

class TaskType(str, Enum):
    QUERY = "query"
    CREATE = "create"
    ANALYZE = "analyze"
    MODIFY = "modify"
    MIXED = "mixed"

class PerceivedIntent(BaseModel):
    task_type: TaskType
    primary_goal: str
    entities: list[str] = Field(default_factory=list)
    constraints: list[str] = Field(default_factory=list)
    confidence: float = Field(ge=0.0, le=1.0)
    needs_clarification: bool = False
    clarification_question: str = None

当置信度低于阈值(如 0.6)时,自动触发澄清流程,避免 Agent 在错误理解的基础上空转。实际生产中,还应加入 RAG 检索结果作为额外上下文。

现代 Agent 的感知也不应局限于文本。一个完整的感知系统可能需要同时处理文本输入、结构化数据、视觉内容(如截图、图表)以及环境信号(时间、位置、系统状态)。

规划:三种主流模式对比

规划是 Agent 的“大脑”,决定如何从当前状态到达目标状态。当前主流有三种模式:

ReAct:边想边做

ReAct(Reasoning + Acting)是最经典的模式。LLM 在每一步都先“思考”再“行动”,交替进行推理与工具调用。适合简单工具调用和快速原型。

优势是实现简单,错误能即时调整;缺点是规划质量受限于单步推理,复杂任务容易迷失方向。

Plan-Execute:先规划后执行

将规划和执行解耦:先用一个 Planner LLM 生成完整多步计划,再用 Executor LLM 逐步执行。适合复杂多步任务,且计划可人工审查。

优势是规划质量更高,步骤间依赖关系清晰;缺点是 Token 消耗高(需两次 LLM 调用),且一旦计划错误,整个执行链都会偏离。

Reflexion:反思驱动的自我改进

在 ReAct 基础上增加显式的“自我反思”阶段。Agent 在每次尝试后评估表现,生成自我批评,并在下一轮利用这些批评改进策略。

这实质上是一种语言层面的梯度下降——用自然语言描述改进方向,而不是更新模型权重。适合对质量有高要求但成本可接受的场景。

在这里插入图片描述

选择哪种模式,取决于任务复杂度、成本预算和质量要求。没有绝对最优,只有最适合当前场景的方案。

在这里插入图片描述

执行:工具调用的健壮性设计

在这里插入图片描述

执行层是 Agent 与外部世界交互的唯一通道。无论规划多么精妙,最终都要通过执行层落地。一个健壮的执行层需要五大能力:

  1. 工具注册:通过装饰器自动从函数签名生成 JSON Schema
  2. 参数校验:确保输入符合工具要求
  3. 超时控制:防止长时间阻塞
  4. 重试退避:网络波动时自动重试,采用指数退避策略
  5. 并行执行:对无依赖关系的步骤并发调用,提升效率

例如,工具注册框架可以这样设计:

@registry.register(name="search_web", description="搜索网页获取最新信息")
async def search_web(query: str, max_results: int = 5) -> dict:
    # 实际调用搜索 API
    return {"query": query, "results": [...]}

ToolRegistry 自动解析函数签名,生成 OpenAI function calling 兼容的 Schema,实现与 LLM 的无缝对接。并行执行则基于依赖图进行拓扑排序,用 asyncio.Semaphore 控制最大并发数,防止 API 限流。

反思:从“执行机器”到“学习机器”

如果说感知、规划、执行是 Agent 的“一线能力”,那反思就是它的“元认知”——对自己思考过程的思考。

没有反思的 Agent 是一个“执行机器”,可能反复犯同样的错误。有反思的 Agent 是一个“学习机器”,能从失败中提取经验。

反思阶段需要回答四个问题:

  1. 结果是否达成目标?(质量评估)
  2. 哪些步骤出了问题?(归因分析)
  3. 为什么会出错?(根因分析)
  4. 下一步该怎么调整?(策略更新)

工程上,可以用枚举定义常见根因类型:

  • planning_error:计划本身有逻辑问题
  • tool_failure:工具调用失败
  • perception_error:对用户意图理解有误
  • insufficient_info:缺少必要信息

每种根因对应不同的调整策略:重新规划、换工具重试、回到感知阶段重新理解需求等。当评分极低且根因是感知错误时,强制回退到感知阶段,这是一种安全网设计。

记忆:三层架构模拟人类记忆

Agent 的记忆系统也遵循类似人类的三层架构:

  • 工作记忆(Working Memory):当前循环的上下文,直接注入 Prompt,生命周期为单次循环
  • 短期记忆(Short-term Memory):保存最近的交互记录,生命周期为单次会话
  • 长期记忆(Long-term Memory):存储在向量数据库中,永久保存,支持跨会话检索

工程实现上,AgentMemory 类管理这三层:

  • 工作记忆用字典维护,直接用于 Prompt 注入
  • 短期记忆用列表保存,超出容量时触发摘要压缩,将旧记忆合并后存入长期记忆
  • 长期记忆通过向量检索,支持语义查询

记忆的写入要有选择——通过 importance 参数控制持久化策略。重要度 ≥0.7 的记忆同时写入长期记忆,模拟“重要的事情更容易记住”的机制。失败比成功更重要(重要度设为 0.8 vs 0.5),因为失败的经验更能指导未来。

完整循环:端到端代码示例

将五个阶段整合为一个完整的 Agent 循环引擎:

class AgentCore:
    async def run(self, user_input: str) -> str:
        # 阶段1:感知
        intent = await self.perceive(user_input)
        if intent.needs_clarification:
            return intent.clarification_question
        
        # 主循环
        for iteration in range(self.config.max_iterations):
            # 阶段2:规划(按需)
            if not current_plan or needs_replan(last_reflection):
                current_plan = await self.plan(intent)
            
            # 阶段3:执行(并行)
            results = await self.execute(current_plan)
            
            # 阶段4:反思
            reflection = await self.reflect(results, intent.primary_goal)
            
            # 阶段5:记忆(嵌入各阶段)
            await self.memory.remember(...)
            
            # 判断是否完成
            if reflection.score >= threshold:
                return extract_final_output(results)
            
            # 根据反思调整策略
            if reflection.adjustment == "re_perceive":
                intent = await self.perceive(user_input)
                current_plan = None

关键设计点:

  • 记忆操作嵌入在每个阶段中,而非独立成步
  • 失败经验比成功经验更重要
  • 动态决定是否重新规划,而不是盲目执行原计划
  • 所有配置参数(如 max_iterationsreflection_threshold)均可调,便于平衡成本与质量

适用边界与风险提示

Agent 核心循环是一把重武器,不是所有场景都需要。推荐用于多步骤、工具组合、路径不确定的任务;不推荐用于单轮问答、固定流程或实时性要求极高的场景。

主要风险包括:

  • 成本失控:每轮多次 LLM 调用,Token 消耗线性增长。缓解:设置硬性预算上限,用便宜模型做反思。
  • 幻觉传导:Agent 可能“说服自己”错误答案正确。缓解:引入外部验证,或在反思 Prompt 中注入“质疑者”角色。
  • 记忆污染:长期记忆存储错误信息。缓解:记忆写入前交叉验证,区分“事实”和“推测”类型。
  • 工具安全:调用不该调的工具导致副作用。缓解:对有副作用的工具实现确认机制,硬性参数校验。
  • 死循环:陷入“失败→重试→再失败”循环。缓解:强制迭代上限,记录失败模式,多次相同失败后退出。

总结

AI Agent 的核心能力循环——感知、规划、执行、反思、记忆——是一个有机的、自适应的认知系统。Agent 的质量不是由最强的那个阶段决定的,而是由最弱的那个阶段决定的。

工程实践的关键是五个阶段的均衡发展和协同优化

  • 感知要深,主动澄清比盲目执行更有价值
  • 规划要准,根据任务选对模式
  • 执行要稳,健壮性设计是可靠性上限
  • 反思要狠,根因分析才能真正改进
  • 记忆要智,三层架构支撑跨会话连续性

最终,这个循环让 Agent 从“会聊天的工具”进化为“能自主解决问题的智能体”。