Agent智能体——从概念到自主推理与行动

Agent智能体——从概念到自主推理与行动

本文是「AI 知识体系深度教程」系列的第五篇。如果你已经读过前面关于大语言模型、RAG、工具调用与框架的章节,那么本文正是这些知识的"集大成"——Agent 把它们融为一个能自主闭环的完整系统。如果你是直接跳到这一篇的初学者,也不必担心,我们会从最本质的概念讲起,逐步带你走到多 Agent 协作和高级设计。


核心问题列表

在进入正文之前,请带着下面这些问题阅读本文。它们贯穿全文,也是工程实践中最常被问到的"灵魂拷问":

  1. Agent 和一个"带插件的大模型"到底有什么本质区别?为什么不能把"会调工具"等同于"是 Agent"?
  2. 普通大模型有哪三大不可逾越的局限?Agent 又是用哪三大能力去突破它们的?
  3. Workflow、Agent、Tools 这三个常被混用的词,到底谁在做"下一步该干什么"的决策?为什么 Anthropic 说"能用 Workflow 解决的问题,就不要用 Agent"?
  4. ReAct、Plan-and-Execute、Reflection 三种设计范式各自解决什么层次的问题?什么时候该单独用、什么时候该组合用?
  5. 一个 5 步的任务,ReAct 和 Plan-and-Execute 的 token 消耗为什么能差一倍以上?背后的输入增长机制是什么?
  6. 短期记忆、长期记忆、实体记忆到底有什么不同?为什么"记忆粒度不是越细越好"?
  7. CoT → ToT → GoT 的演进逻辑是什么?为什么 GoT 在生产环境几乎见不到?
  8. 反思机制为什么必须设"最大 2-3 轮"的硬性上限?为什么多 Agent 互评往往比自我反思更有效?
  9. 什么情况下该"手搓 Agent"而不是用框架?“核心手写、周边借用"的折中方案为什么最务实?
  10. Single-Agent 力不从心的三类任务是什么?为什么生产环境几乎都选 Orchestrator 中心化模式,而不用去中心化?

引言:Agent 是 AI 工程的终极形态

过去两年,我们见证了 AI 从"能聊天"到"能做事"的跃迁。这个跃迁的标志,就是 Agent(智能体)

如果你把大语言模型(LLM)比作一个"读过万卷书但只会动嘴的书生”——它能告诉你怎么做,却从不会真的去做;那么 Agent 就是给这个书生装上了"手脚"(工具调用)、“档案室”(记忆)和"项目经理"(规划模块),让它真正成为一个能自主完成目标的"行动派"。

一句话概括 Agent 的本质:自主闭环——感知目标 → 规划步骤 → 调用工具行动 → 观察结果 → 再感知再规划,如此循环直到任务完成。

这个"闭环"二字,是理解 Agent 全部设计的钥匙。本文会从概念本质出发,一路讲到核心架构、设计范式、记忆机制、规划与反思,最后落到多 Agent 系统与工程落地。无论你是想建立第一印象的初学者,还是想掌握多 Agent 协作与高级设计的工程师,都能在这篇文章里找到你需要的那一层。


第一章:Agent 的本质

1.1 什么是 Agent?与大模型的本质不同

很多人第一次接触 Agent 时会问:它和 ChatGPT 这种大模型有什么区别?不就是给大模型加了几个插件吗?

不是。 这是最常见的误解。两者的本质区别可以用一个词概括:自主性

  • 大模型:本质是一个文本生成器。你给它一段输入,它生成一段输出,交互到此结束。它不会主动决定"我下一步要不要去查个资料"“我要不要发封邮件”,它只会告诉你"你可以这样查"“你可以那样发”。
  • Agent:能自主完成目标的 AI 系统。它自己决定用不用工具、何时用、用哪个,自己决定下一步干什么,自己决定任务算不算完成。大模型是被动的应答器,Agent 是主动的行动者。

用一个生活中的类比:大模型像一个百科全书式的电话客服,你问它答,挂了电话就忘;Agent 像一个能干的私人助理,你给个目标"帮我订下周二去上海的出差",它会自己去查航班、订酒店、发起报销流程、把结果汇报给你,中途遇到航班取消还会自己改签。

1.2 普通大模型的三大局限

要真正理解 Agent,必须先看清它要解决的大模型三大局限。这三大局限是"结构性"的,不是靠 prompt 调优就能绕过的:

局限一:知识被冻结。 大模型的训练数据有截止日期。你问它"今天杭州天气怎么样"“苹果公司最新一季营收多少”,它要么编一个(幻觉),要么老实承认"我的知识截止到……"。它无法获取任何实时信息,因为它的"知识"在训练完成那一刻就被冻结了。

局限二:不能行动。 大模型本质是文本生成器。它能用文字详细描述"如何发一封邮件"“如何查一个数据库"“如何执行一段 Python 代码”,但它自己一个都做不到。它只会告诉你"怎么做”,自己从不真的去做。它没有连接真实世界的手脚。

局限三:没有持续状态。 大模型每次调用之间是完全失忆的。你上一轮告诉它"我是做金融的",下一轮它不记得,除非你把上下文重新传一遍。它没有"记忆"这个概念,无法跨任务、跨会话积累对你的了解。

这三大局限,构成了 Agent 诞生的"问题驱动"。Agent 的三大核心能力,正是逐一对应去突破它们。

1.3 Agent 的三大核心能力

能力一:工具调用(Tool Use)——让 Agent 从"说话"变成"做事"。

这是突破"知识冻结"和"不能行动"的关键。给 Agent 接上搜索引擎,它就能获取实时信息;接上邮件 API,它就能真正发邮件;接上代码执行器,它就能真正跑代码。

这里有一个贯穿全文的核心设计哲学,务必牢记:决策和执行分离。模型只是"大脑",负责决定调什么工具、填什么参数;真正执行工具的是你的代码,执行结果再反馈给模型。模型从不亲自"动手",它只下指令。

┌──────────────────────────────────────────────────────┐
│            决策与执行分离(Agent 核心哲学)            │
├──────────────────────────────────────────────────────┤
│                                                      │
│   LLM(大脑)          你的代码(手脚)               │
│   ┌─────────┐         ┌──────────────┐               │
│   │ 决定调   │ ──JSON─▶│ 解析参数     │               │
│   │ 什么工具 │         │ 真正执行工具 │               │
│   │ 填什么参 │         │ 返回结果     │               │
│   └─────────┘ ◀───────└──────────────┘               │
│      决策者                 执行者                   │
│   (只动脑不动手)      (真正与外部世界交互)          │
└──────────────────────────────────────────────────────┘

能力二:记忆机制——突破"没有持续状态"。

  • 短期记忆:当前任务进行中的中间状态,存在 context window(上下文窗口)里。任务结束就清空,像一个用完即擦的工作台。
  • 长期记忆:跨任务的用户偏好、历史决策、做事方法论,存在向量数据库里,靠语义检索调取。像一个越攒越厚的档案室。

有了记忆,Agent 就不再是"每次都从零开始的失忆者",而是"能记住你、记住上次怎么解决问题的老手"。

能力三:多步推理与自我纠错——让 Agent 真正"自主"。

这是 Agent 区别于"插件大模型"的最关键一点。某个步骤失败了,Agent 不会直接崩掉——它能感知失败、分析原因、换一种方式重试。它能"边做边反思",根据中途的观察动态调整后续计划。

正是这第三点,让 Agent 从"会调工具的模型"升级为"能自主闭环的系统"。一个只会按预设顺序调工具的程序不是 Agent;一个能自己决定下一步、并在出错时自己纠偏的,才是。

1.4 Agent 爆发的三个条件

Agent 这个概念其实提出得很早,但为什么直到 2023-2024 年才真正"爆发"?因为三个条件必须同时成熟,缺一不可:

  1. 大模型能力跨过"能用"门槛:GPT-4、Claude 3 这一代模型在推理能力和指令遵循能力上发生了质变。再早的模型,给它工具它也用不明白——参数填不对、该调的时候不调、不该调的时候乱调。只有当模型"聪明到能正确决策"时,Agent 才有意义。

  2. 工具调用标准化:2023 年 OpenAI 推出 Function Calling,让模型能输出结构化的 JSON 来表达"我要调这个工具、参数是这些",而不是靠解析自由文本(早期 ReAct 靠正则解析 Action: xxx,极不稳定)。标准化让"决策和执行分离"真正可靠落地。

  3. 配套生态完善:LangChain/LlamaIndex 这类框架大幅降低了开发门槛,向量数据库(Chroma、Pinecone、Milvus 等)解决了长期记忆的存储与检索问题。没有这些"脚手架",从零搭一个 Agent 的工程成本会劝退绝大多数团队。

近年来还有两大协议在推动生态标准化:MCP(Model Context Protocol,Anthropic 2024 年底提出,解决"Agent 怎么调工具",是工具世界的"USB-C 接口")和 A2A(Agent2Agent,Google 2025 年 4 月提出,解决"Agent 之间怎么协作")。两者互补:MCP 管 Agent 与工具的连接,A2A 管 Agent 与 Agent 的通信。两者均已捐给 Linux 基金会,走向开放标准。

1.5 一个关键词:自主闭环

如果这一章只能记住一个词,那就是自主闭环

        ┌────────────────────────────────┐
        │                                ▼
     感知目标 ──▶ 规划步骤 ──▶ 行动(调工具) ──▶ 观察结果
                                              │
                                              ▼
                                        再感知再规划
                                        (动态调整)
  • 感知:理解用户目标和当前环境(包括工具返回的结果)。
  • 规划:把复杂目标拆解成可执行的步骤。
  • 行动:调用工具,与外部世界真实交互。
  • 再感知:把行动结果反馈回来,判断是否需要调整计划。

这四个环节首尾相连、循环往复,就是 Agent 的"心跳"。任何一环缺失,都不是完整的 Agent。

实践要点

  • 判断一个系统是不是 Agent,看三点:①能否自主规划多步;②能否通过工具与真实世界交互;③结果能否反馈形成闭环。三者缺一不可。
  • 永远记住"模型只是大脑,执行靠代码"——这是排查一切 Agent bug 的第一原则。
  • 别把 Agent 等同于"插件"或"工具调用"。工具调用只是 Agent 能力的一部分,自主性才是它的灵魂。

第二章:Agent 核心架构

2.1 四大核心组件

如果把 Agent 比作一家公司,它有四大核心组件,各司其职:

组件 公司角色 职责
LLM(大模型) 老板/大脑 理解任务、做决策、生成自然语言
工具系统 外包执行团队 与外部世界交互(搜索、发邮件、执行代码…)
记忆系统 档案室 保持状态、跨任务积累经验
规划模块 项目经理 把复杂目标拆解成步骤、动态调整计划

LLM 核心是整个系统的决策中枢。所有输入——用户指令、工具返回、记忆内容——都经过 LLM 理解和决策。其中 System Prompt(系统提示词)相当于 Agent 的"岗位说明书",定义它的角色、行为边界和输出格式。在实际开发中,调优 System Prompt 占据了相当大的开发时间比例。

模型选择有一个重要权衡:大模型做核心决策,小模型做简单任务。比如用 GPT-4 / Claude Opus 做规划和关键判断,用 GPT-4o-mini / 开源 7B 模型做意图分类、格式提取这类简单活,是常见的成本优化手段。工具调用的稳定性、上下文窗口大小,也是选型时的硬性考量。

工具系统是 Agent 与外部世界交互的唯一入口。一个关键细节:工具定义只有"名字、描述、参数说明",没有执行逻辑——执行逻辑在你自己的代码里。工具描述的质量直接影响 Agent 表现:description 写得含糊,模型就会误调或漏调。好工具设计有四原则:职责单一、描述精确、错误信息清晰、参数设计简洁。

记忆系统分几个层次(详见第五章),最基本的两层是:短期记忆(context window,任务结束清空)和长期记忆(向量数据库,跨任务持久)。

规划模块负责把复杂目标拆解成步骤,并能在执行中动态调整。提升 LLM 推理能力的技术手段从简单到复杂有 CoT(思维链)、ToT(思维树)、GoT(思维图),工程上更常用的是 Plan-and-Execute(先规划后执行)。

2.2 Workflow / Agent / Tools 三层概念区分

这三个词在日常讨论里经常被混用,但它们其实是粒度从小到大的三层结构,可相互嵌套。区分它们最核心的角度只有一个:谁来做"下一步该干什么"的决策?

┌─────────────────────────────────────────────────────────┐
│  三层结构:粒度从小到大,可相互嵌套                       │
│                                                         │
│   Tools(最小能力积木)                                  │
│   ├─ 本质:按特定格式暴露给 LLM 的函数                   │
│   ├─ 不做决策,只执行,甚至不知道自己"应该"何时被用      │
│   └─ 像瑞士军刀的刀片,决定拿哪个的是拿着刀的手(Agent)   │
│                                                         │
│   Agent(拿工具自己做决定的人)                          │
│   ├─ Agent = 拿着工具、自己决定用哪个的角色              │
│   ├─ 运行方式:Thought→Action→Observation 循环          │
│   ├─ while True 跑几次开发者完全不知道                   │
│   └─ 执行路径由 LLM 实时决定                            │
│                                                         │
│   Workflow(总指挥)                                     │
│   ├─ 把整个流程"骨架"写在代码里                         │
│   ├─ LLM/Agent/Tools 都是节点                           │
│   └─ "下一步去哪"全由开发者代码(if/elif)决定            │
└─────────────────────────────────────────────────────────┘
  • Tools:最小的能力积木。本身无决策能力,甚至不知道自己"应该"何时被用。它只是按特定格式暴露给 LLM 的函数(配 schema:名字、描述、参数类型)。
  • Agent:拿着工具、自己决定用哪个的角色。运行方式是一个循环:想清楚(Thought)→ 行动(Action)→ 看结果(Observation)→ 再想清楚 → 再行动,直到 LLM 判断完成。while True 循环跑几次,开发者完全不知道——执行路径由 LLM 实时决定。
  • Workflow:把整个执行流程的"骨架"写在代码里,LLM/Agent/Tools 都是节点,下一步去哪全由开发者代码决定。LLM 只是流程里的一个"工位",接下来去哪由 if/elif 控制。

三者对比表:

维度 Tools Agent Workflow
决策能力 无(只执行) 有(LLM 自主决策) 无(代码写死)
执行方式 被动等待 主动循环至完成 按定义顺序执行
确定性 低(同输入可能不同路径)
灵活性 只做一件事 高(应对预料外情况)
调试难度 容易 难(路径不确定) 容易(链路清晰)
适用场景 封装单一能力 路径未知的复杂任务 流程固定的业务系统

2.3 Agent vs Workflow 的本质区别

这是工程中最常被问到的辨析。一句话:Workflow 是确定性流程图,每步硬编码;Agent 把"下一步做什么"的决策权交给 LLM。

代码结构上的对比最直观:

# Workflow:每行都是明确指令,"下一步去哪"由代码决定
def workflow_run(input):
    category = llm_classify(input)       # LLM 只做分类
    if category == "refund":
        result = handle_refund(input)     # 代码决定走退款分支
    elif category == "consult":
        result = handle_consult(input)    # 代码决定走咨询分支
    return result

# Agent:loop 里只有 llm.decide(),"下一步做什么"由 LLM 决定
def agent_run(goal):
    history = []
    for _ in range(max_steps):
        decision = llm.decide(goal, history)   # LLM 决定下一步
        if decision.is_final:
            return decision.answer
        result = tools.execute(decision.action)
        history.append(result)
  • Workflow 的优点:可预测、可控、好调试。缺点是灵活性低,遇到预料外的情况容易失败。
  • Agent 的优点:能处理没设计过的情况,灵活。缺点是行为不确定、难复现。

正因为两者各有优劣,生产环境的主流是 Agentic Workflow(智能体工作流):用 Workflow 固定主流程骨架,需要灵活判断的节点嵌入 Agent,其余固定节点用 LLM/Tools。Anthropic 有一个著名的工程原则:能用 Workflow 解决的问题,就不要用 Agent——因为可控性比灵活性更重要。先从最简单的 Workflow 开始,发现某个节点确实需要灵活决策,才把它升级为 Agent。

Anthropic 总结了几种主流 Workflow 编排模式,值得了解:

模式 说明
Prompt Chaining(提示链) 前一步输出作为后一步输入,流水线串联
Routing(路由) LLM 分类 → 分发到不同分支
Parallelization(并行化) 子任务并行执行,最后汇总
Orchestrator-Workers 中央编排者分配,多 Worker 各自完成
Evaluator-Optimizer 生成者产出 → 评估者审查 → 不通过反馈重做

2.4 决策和执行分离的设计哲学

这条原则贯穿 Agent 设计的方方面面,值得单独强调。

为什么要把"决策"和"执行"分开?因为模型的强项是理解和判断,代码的强项是可靠执行。让模型去"想"该做什么,让代码去"做"具体的事,两者各司其职:

  • 模型决定调什么工具、填什么参数(决策)
  • 代码负责真正调用 API、执行函数、返回结果(执行)
  • 结果再回到模型,由模型决定下一步怎么办(再决策)

这种分离带来了巨大的工程好处:工具的实现可以独立优化、独立测试,不依赖模型的稳定性;模型可以换(GPT-4 换 Claude),只要决策逻辑不变,工具代码一行都不用改。这也是为什么 MCP 协议能成立——它标准化的正是"决策(模型)“和"执行(工具 Server)“之间的接口。

实践要点

  • 看到任何 Agent 实现,第一件事就是问自己:“这个系统里,谁在做’下一步该干什么’的决策?"——这决定了它是 Workflow、Agent 还是 Agentic Workflow。
  • 生产环境优先用 Agentic Workflow(骨架固定 + 关键节点嵌 Agent),不要一上来就上纯 Agent。
  • 工具描述写得越精确,Agent 越不容易误调。把工具当产品来设计,description 当产品说明书来写。
  • Agent 必须有停止条件:LLM 主动判断完成、最大循环次数(如 15 轮)、总 token 预算上限、超时机制(如 60 秒),通常多个机制同时存在,哪个先触发用哪个。

第三章:Agent 设计范式

3.1 为什么需要不同的设计范式

设计范式,就是搭 Agent 的"顶层做事流程框架”,类比公司的管理制度。不同的任务有不同的特征——有的简单、有的复杂、有的路径明确、有的需要高质量输出——用一套流程硬套所有任务,要么浪费成本,要么做不好。

Agent 有三种主流设计范式:ReAct(推理与行动交替)、Plan-and-Execute(先规划后执行)、Reflection(反思驱动改进)。需要特别注意的是,三者不是互斥的平行选项:Reflection 不是独立流程,而是叠加在前两者之上的"质量 buff”;实际工程中三者常常混合使用。

先看一个总览,理解三者各解决什么层次的问题:

范式 解决的问题 定位 类比
ReAct 单步灵活性 边想边干,走一步看一步 外卖骑手实时导航
Plan-and-Execute 长任务跑偏 先想全再干,全局视野 项目经理先排计划
Reflection 输出质量不够 给前两者加"检查 buff” 考试做完回头检查

3.2 ReAct(Reasoning + Acting):推理与行动交替

完整的 Thought → Action → Observation 循环

ReAct(2022 年由 Yao 等人提出)的核心思想是:在 CoT(思维链)的推理过程里,插入真实的"行动"。每一轮循环是:

Thought(思考)→ Action(行动)→ Observation(观察)→ 再 Thought ...
  • Thought:先分析当前情况,决定下一步该做什么。这一步防止"冲动决策"——不先想就乱调工具。
  • Action:根据思考结果,调用一个工具(或给出最终答案)。
  • Observation:工具返回的结果,作为下一轮思考的事实依据。

循环往复,直到 LLM 判断任务完成,输出 Final Answer

为什么不能只用 CoT(纯推理)或只用 Act-only(纯行动)?

  • 纯 CoT:只在脑子里推,拿不到真实数据,容易产生幻觉(它"想"出来的"事实"可能是编的)。
  • 纯 Act-only:不写思考过程,动作序列脆弱——一步错全跑偏。研究显示在 HotpotQA 等任务上准确率明显更低。
  • ReAct:把推理和行动交织——Thought 定方向,Action 落地,Observation 带回事实,三者闭环互补。

ReAct 的实现细节

理解 ReAct 实现最关键的一点:循环不是 LLM 自己转的,是代码驱动的。LLM 每次只做一件事——根据历史输出下一步的 Thought + Action。代码负责:检测输出、判断有没有 Final Answer、解析 Action、执行工具、把 Observation 填回历史、再次调用 LLM。

ReAct 的经典 prompt 格式:

Thought: 你的思考过程
Action: 工具名称
Action Input: 工具输入参数
Observation: (系统填入工具结果)
... 可重复多轮 ...
Final Answer: 最终答案

完整的 ReAct 实现代码:

def react_agent(question, tools, max_steps=10):
    """
    ReAct Agent 的核心实现。
    关键理解:循环由代码驱动,LLM 每次只输出一步 Thought+Action。
    """
    prompt = build_react_prompt(question, tools)
    history = []  # 短期记忆:记录每一步的思考和观察

    for step in range(max_steps):
        # 1. 调用 LLM,让它基于历史输出下一步
        response = llm.generate(prompt + "\n".join(history))

        # 2. 检查是否给出最终答案
        if "Final Answer:" in response:
            return response.split("Final Answer:")[-1].strip()

        # 3. 解析出 Action 和参数(决策)
        action, action_input = parse_action(response)
        if action in tools:
            # 4. 代码执行工具(执行),把结果作为 Observation
            observation = tools[action](action_input)
        else:
            observation = f"工具 {action} 不存在,请从可用工具中选择"

        # 5. 把 LLM 输出和观察结果都存入历史,供下一轮参考
        history.append(response)
        history.append(f"Observation: {observation}")

    return "超过最大步数,任务未完成"

现代演进:GPT-4 / Claude 3 之后,模型原生支持 Function Calling / Tool Use,直接输出结构化 JSON,不再靠解析文本。但本质循环不变——只是"行动"从解析文本变成了解析 JSON。

ReAct 有两个著名的坑:

  1. 循环漂移:因为没有全局计划约束,跑着跑着容易偏离目标。比如让 Agent 查苹果营收,它查着查着被"三星竞争"的信息吸引,跑去搜三星了。步骤越多、历史越长,漂移概率越大。
  2. 错误传播:每步决策建立在前面结果上,中间一步错,全链带跑偏;而且 ReAct 没有内置"回头检查"机制,默认 Observation 都是对的。

根源在于:ReAct 是纯前向推理,无全局规划、无反思。这正是 Plan-and-Execute 和 Reflection 要解决的问题。

3.3 Plan-and-Execute:先规划后执行

与 ReAct 的核心区别

ReAct 是"边走边问路",Plan-and-Execute 是"先看地图再出发"。

核心区别一句话:规划推理和执行推理完全解耦

  • ReAct:每一步都是即时决策,没有提前的全局规划。
  • Plan-and-Execute:先由 Planner 站在全局视角输出完整步骤列表,再由 Executor 逐步执行,每步执行时始终知道自己在整体计划中的位置。

它还有一个隐藏优势:因为规划和执行分离,可以用不同的模型——规划用强模型(GPT-4 / Claude Opus,保证方向正确),执行用便宜小模型(GPT-4o-mini / 开源 7B,只做具体执行)。这种"大小模型搭配"可以降低 70%-90% 的成本,是生产环境非常重要的优化手段。

适用场景

Plan-and-Execute 的优势在"长任务、多步骤、需要全局统筹"的场景:

  • 写一份竞品分析报告(要先调研多个竞品、再对比、再撰写)
  • 全流程的项目开发(需求分析 → 架构设计 → 编码 → 测试)
  • 多维度行业调研(并行搜集多个维度的信息再汇总)

代价是:多了一次规划 LLM 调用,延迟成本增加;如果初始规划方向就错了,后续执行再好也难挽回。所以它有一个关键机制——动态重规划(Dynamic Replan):每步执行完,把结果和剩余计划交给规划器,判断计划是否还适用、需不需要调整。类比导航遇到封路自动重新规划路线。

完整的 Plan-and-Execute 实现代码:

def plan_and_execute(task, planner_llm, executor_llm, tools, max_replans=3):
    """
    Plan-and-Execute 实现。
    规划与执行解耦,支持动态重规划,支持大小模型搭配。
    """
    # 阶段一:Planner 生成全局计划(用强模型)
    plan_prompt = f"""请为以下任务制定一个清晰的分步执行计划。
    任务:{task}
    输出格式:编号列表,每步一个独立的原子操作。"""
    plan = parse_plan(planner_llm.generate(plan_prompt))

    results = {}
    for i, step in enumerate(plan):
        # 阶段二:Executor 逐步执行(用便宜小模型,可用 ReAct)
        execution_context = build_context(task, plan, results, i)
        result = execute_step_with_react(executor_llm, tools, step, execution_context)
        results[i] = result

        # 阶段三:Re-planner 检查是否需要调整计划(触发条件:执行失败/输出差异大)
        if should_replan(result, plan):
            replan_context = f"原计划:{plan}\n已执行到第{i}\n最新结果:{result}"
            plan = adjust_plan(planner_llm, replan_context, plan, i)
            if max_replans <= 0:
                break
            max_replans -= 1

    # 阶段四:汇总各步产出,生成连贯最终结果
    final = executor_llm.generate(f"任务:{task}\n各步结果:{results}\n请整合为最终输出。")
    return final

3.4 Reflection:反思驱动改进

反思机制闭环

Reflection(反思)的核心定位必须先讲清楚:它不是独立的完整流程,而是叠加在 ReAct / Plan-and-Execute 之上的增强机制。前两者的核心是"把事做完",Reflection 的核心是"把事做好"。

它的循环是:生成 → 评估 → 改进,类比"草稿 → 批阅 → 修改",改完再审阅,直到通过。

一个关键变体是 Reflexion(Shinn 2023):不只说"不好重做",而是生成"反思总结"——记录失败原因和改进建议,存进记忆,作为下次尝试(甚至下次类似任务)的上下文。类比"写错题本"。效果数据很亮眼:HumanEval 上 GPT-4 直接做 pass@1 是 80%,加上 Reflexion 提升到 91%,超过 10 个百分点。它被称为"verbal reinforcement learning"(语言强化学习)——不需要梯度更新,就能从错误中学习。代码生成天然适合 Reflexion,因为可以运行测试,执行结果是直接反馈。

与前两者的组合使用

Reflection 最常见的用法是叠加

  • Plan-and-Execute 全局规划 + ReAct 单步执行 + Reflection 关键步骤把关
  • 写生产代码:Executor 写完 → Critic 审查 → 不通过则改进 → 再审查

完整的 Reflection 实现代码:

def reflection_loop(task, generator_llm, critic_llm, max_rounds=3):
    """
    Reflection 反思机制实现。
    核心循环:生成 → 评估 → 改进,直到 PASS 或达到最大轮次。
    """
    # 初始生成
    current_output = generator_llm.generate(f"任务:{task}\n请完成。")

    for round in range(max_rounds):
        # 评估:让 Critic 检查当前输出
        eval_prompt = f"""任务:{task}
        当前输出:{current_output}
        请评估以上输出:
        1. 有没有事实错误或逻辑问题?
        2. 有没有遗漏重要内容?
        3. 表达是否清晰准确?
        如果输出已经足够好,回复「PASS」;
        否则指出具体问题并给出改进建议。"""
        reflection = critic_llm.generate(eval_prompt)

        if "PASS" in reflection:
            return current_output  # 通过,返回

        # 改进:三样东西缺一不可——原始任务 + 当前输出 + 评估意见
        improve_prompt = f"""原始任务:{task}
        当前输出:{current_output}
        评估意见:{reflection}
        请根据评估意见改进输出:"""
        current_output = generator_llm.generate(improve_prompt)

    return current_output  # 达到最大轮次,强制退出

这里有两个关键设计,是反思机制能不能真正起作用的命门:

  1. 必须给出明确的检查维度(事实/逻辑/完整性/表达),而不是让 LLM 自由发挥。无方向的评估会流于表面——LLM 可能只说"看起来不错"敷衍了事。
  2. 必须有"PASS"机制——给 LLM 一个"够好了就停"的出口。没有这个出口,LLM 会陷入"为了改而改"的无限循环,每轮改动很小但无实质进步,甚至把原本对的改错。

改进 prompt 里三样东西缺一不可:原始任务、当前输出、评估意见。缺原始输出 → 不知在什么基础上改;缺评估意见 → 不知改哪里;缺任务 → 改着改着偏离原始目标。三者都在,才能做到"有针对性的修改",而非"全部重写"。

3.5 三种范式的核心区别与选型

token 消耗量化分析

这是一个常被忽视但极其重要的工程维度。以一个 5 步任务、每步约 2000 token 为例:

ReAct 的输入增长(每次带完整历史):
  第1步: 2000 token
  第2步: 2000 + 2000 = 4000
  第3步: 2000 + 4000 = 6000
  第4步: 2000 + 6000 = 8000
  第5步: 2000 + 8000 = 10000
  合计输入 ≈ 30000 token

Plan-and-Execute:
  规划一次: ~3000
  执行每步(只带自己那步context): ~1500 × 5 = 7500
  汇总一次: ~4000
  合计 ≈ 14500 token(比 ReAct 低一半多)

叠加 Reflection:
  每个反思节点至少多一次调用,在基础上再增 30%-100%

ReAct 的 token 随步数线性甚至超线性增长(因为每次都带完整历史),而 Plan-and-Execute 把历史"分散"到各步,总消耗低很多。步数越多,这个差距越大。这也是长任务该优先考虑 Plan-and-Execute 的重要原因。

实际项目选型建议

┌──────────────────────────────────────────────────────────┐
│                    选型决策树                             │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  任务简单、流程不固定?                                   │
│       │ 是                                               │
│       ▼                                                  │
│    ReAct(够用就好,实现简单、灵活、逻辑透明)            │
│                                                          │
│  任务长、易跑偏、需整体结构?                             │
│       │ 是                                               │
│       ▼                                                  │
│    Plan-and-Execute(遇意外加动态 Replan)                │
│                                                          │
│  输出要求高、不能出错?                                   │
│       │ 是                                               │
│       ▼                                                  │
│    在前两者基础上叠加 Reflection                          │
│                                                          │
│  需跨任务积累经验、避免重复犯错?                         │
│       │ 是                                               │
│       ▼                                                  │
│    Reflexion(把失败经验存进记忆,下次参考)              │
│                                                          │
│  最常见的混合方案:                                       │
│    Plan-and-Execute(全局规划)                             │
│      + ReAct(单步执行)                                    │
│      + Reflection(关键步骤把关)                           │
└──────────────────────────────────────────────────────────┘

一句话口诀:先 ReAct 玩明白,按需往上加。 最大的坑是"全堆一起过度工程化"——一上来就 Plan-and-Execute + ReAct + Reflection + Reflexion 全上,复杂度爆炸,调试地狱。先从最简单的 ReAct 跑通,发现长任务跑偏再加 Plan-and-Execute,发现输出质量不够再加 Reflection,循序渐进。

实践要点

  • Reflection 不是独立流程,是"叠加 buff"——这一点必须在选型时先说清,否则会把三者当成平行选项来纠结。
  • 反思最多 2-3 轮,绝对不能依赖 LLM 自己判断停止。硬性轮次上限是唯一可靠的退出机制。
  • 规划用强模型、执行用便宜小模型的"大小模型搭配",是 Plan-and-Execute 最重要的成本优化手段。
  • token 消耗不是小问题:ReAct 在长任务上的线性增长会迅速吃掉预算,这也是长任务该用 Plan-and-Execute 的硬理由。

第四章:任务拆分

4.1 为什么要拆分复杂任务

让 LLM 一次性处理太复杂的任务,几乎必然出错:搜索掺杂分析、写到一半忘了前面的数据、结构混乱、前后矛盾。

根本原因在于:context window 有上限,任务越大、中间状态越多,“桌面"越乱,越难持续追踪子目标。就像你在一张小桌子上同时做五件事,资料堆得满桌都是,做着做着就找不着北了。

拆分后,每一步只聚焦一件事,桌面干净、质量高;而且每步独立,可以单独验证、单独重试——某步错了不用整个任务重来。

4.2 任务拆分的策略

有两种拆分思路:

静态拆分:提前写死步骤(这是 Workflow 的思路)。

  • 例:搜索资料 → 整理大纲 → 逐段撰写 → 润色校对。
  • 优点:可预测、好排查。缺点:灵活性低。

动态拆分:让 LLM 自己规划(这是 Plan-and-Execute 的核心)。

Plan-and-Execute 的三阶段:

┌──────────────────────────────────────────────────────┐
│           动态拆分的三阶段(Plan-and-Execute)        │
├──────────────────────────────────────────────────────┤
│                                                      │
│  1. 规划(项目启动会)                                │
│     LLM 输出有序步骤列表,只规划不执行                │
│                                                      │
│  2. 执行(各部门干活)                                │
│     逐步执行,每步带前面结果作 context                │
│                                                      │
│  3. 汇总(项目验收)                                  │
│     整合各步骤产出,解决衔接,生成连贯整体            │
│                                                      │
└──────────────────────────────────────────────────────┘

优点:灵活。缺点:规划质量不稳定,规划错了则全错。

注意区分一个容易混淆的点:CoT/ToT 讲的是"LLM 内部怎么想清楚”,是推理层面;静态/动态拆分讲的是"Agent 怎么把大任务切成独立执行步骤",是工程层面。粒度和目标都不同。

拆分粒度的把握是关键:

  • 太细:步骤多、token 升,太碎看不到全局,衔接生硬。
  • 太粗:每步事多易错,出错难定位。
  • 标准:原子操作——只做一件独立的事,边界清晰,做完有明确输出,不互相依赖。
  • 判断方法:能写清晰的函数签名 → 大概是原子;函数里还要分阶段 → 需要再拆。
    • 原子:「搜索竞品 A 的产品信息」
    • 非原子:「整理竞品分析」(含搜索、筛选、格式化三件事)

还有一种进阶策略叫自适应拆分:不在开始时定死粒度,执行中根据难度动态调整。逻辑是:先试,做不好(超最大步数/质量不达标)→ 交给规划器再拆 → 对子任务重复。像递归展开的任务树,只有做不好的节点才拆,简单的直接做。特性是:任务越复杂递归层数越深,开销与实际难度成正比,不一刀切。

4.3 并行优化

拆分还有一个重要收益:无依赖的步骤可以并行执行

分析步骤之间的依赖关系,无依赖的可以同时跑。类比厨师:烧水的同时切菜腌肉,总时间由最长路径决定。用 DAG(有向无环图) 建模:节点是步骤,边是依赖,无依赖的节点可同时跑。

import asyncio

async def execute_parallel_steps(independent_steps):
    """并行执行无依赖的步骤,总时间由最慢的步骤决定"""
    tasks = [execute_step_async(step) for step in independent_steps]
    results = await asyncio.gather(*tasks)
    return results

实际项目通过并行优化可以降低 40%-60% 的端到端延迟。但前提是:依赖稀疏、工具 I/O 占主要耗时。如果步骤之间是强依赖(必须串行),并行空间为零。

4.4 效果如何提升

拆分带来的提升是全方位的:

  1. 质量提升:每步聚焦一件事,context 干净,LLM 发挥更稳定。
  2. 可验证性:每步有明确完成标准,像单元测试断言,缺了可以自动重试。
  3. 可恢复性:某步出错只重试那一步,不用整个任务重来。
  4. 可并行性:无依赖步骤并行,降低端到端延迟。

拆分结果有三个验证标准:

  1. 完备性:所有步骤覆盖原始任务全部要求(逐项对照检查)。
  2. 独立性:职责边界清晰,无重叠(防重复劳动和汇总矛盾)。
  3. 可验证性:每步有明确完成标准。好做法是拆分时同时写"验收标准",步骤定义和验收标准成对出现。

执行中的 Replan 机制也很重要:每步执行后检查计划需不需要调整(比如发现竞品已停止运营,后续对比就没意义了)。折中做法是:不每步都触发 Replan,而是设触发条件(输出差异大/执行失败时才 Replan),避免每步多一次评估调用的开销。

实践要点

  • 拆分粒度的"原子操作"标准:能写清晰函数签名的是原子,函数里还要分阶段的需要再拆。
  • 并行优化的前提是依赖稀疏——强依赖的步骤串行,并行空间为零,别强行并行。
  • 拆分时同步写"验收标准",让每步可验证、可自动重试。
  • 自适应拆分(做不好才继续拆)比一开始就定死粒度更合理,开销与难度成正比。

第五章:Agent 记忆机制

5.1 短期记忆(context window)

短期记忆就是 context window 里的 messages 列表,类比 LLM 的"工作台"。每步内容追加,每次调 LLM 传完整历史。任务结束清空,下次新任务桌面是空的。

class ShortTermMemory:
    def __init__(self):
        self.messages = []

    def add(self, role, content):  # role: user/assistant/tool
        self.messages.append({"role": role, "content": content})

    def get_context(self):
        return self.messages

    def clear(self):
        self.messages = []

进阶做法是结构化工作记忆:给工作台划固定区域(当前任务目标 / 已确认中间结论 / 待验证假设),每步主动更新对应区域,替换过时内容,保持结构清晰,而不是让消息无限堆积。

5.2 长期记忆(向量数据库)

长期记忆跨任务持久,核心工具是向量数据库 + Embedding

  • Embedding:把文字转成几百到几千维的数字向量,捕捉"语义"。语义相近 → 向量空间距离近(类比 RGB 编码颜色,相近颜色 RGB 值也接近)。
  • 向量数据库:存数字向量,核心能力是"相似度检索"——给一个查询向量,找距离最近的几条(语义最相关的)。用 HNSW/IVF 等 ANN 索引加速,不用和每条都比较。
from openai import OpenAI
import chromadb

client = OpenAI()
db = chromadb.Client()
collection = db.get_or_create_collection("agent_memory")

def save_to_long_term(content, metadata):
    """把内容存入长期记忆,metadata 记录时间/类型/重要程度"""
    embedding = client.embeddings.create(
        input=content, model="text-embedding-3-small"
    ).data[0].embedding
    collection.add(
        embeddings=[embedding],
        documents=[content],
        metadatas=[metadata],  # 时间/任务类型/重要程度/记忆类型,检索时可过滤
        ids=[f"mem_{hash(content)}"]
    )

def retrieve_memory(query, top_k=3):
    """语义检索最相关的几条记忆"""
    query_embedding = client.embeddings.create(
        input=query, model="text-embedding-3-small"
    ).data[0].embedding
    results = collection.query(query_embeddings=[query_embedding], n_results=top_k)
    return results["documents"][0]

长期记忆的粒度是个关键问题:

  • 太细(每句话一条):检索碎片化,只命中部分,信息不完整。
  • 太粗(整次任务一条):命中但相关内容只占一小部分,LLM 被无关内容干扰。
  • 合理粒度:“一次完整交互"或"一个独立知识点/事件”。前者信息完整,后者如"用户偏好:Python,简洁风格,英文注释"打包一条结构化记录。

记忆衰减:给每条记忆加"新鲜度权重",检索排序同时考虑语义相似度和时间新鲜度(越久越低)。相关性分数 = 语义相似度 × 时间衰减因子。或定期让 LLM 审查清理过时/矛盾的记忆。

5.3 四层记忆机制设计

借用认知科学,工程上可以把记忆分为四层(从最短暂到最持久):

类型 类比 载体 容量 生命周期 访问方式
感知记忆 即时感觉 当次输入 极小 单次调用 即时访问
短期记忆 工作记忆 context window 受 token 限制 一次任务 直接读取
长期记忆 长期记忆 向量/关系数据库 无限 持久 语义检索
实体记忆 病历卡 结构化存储 无限 持久 精确查询
  • 感知记忆:当前调用的原始输入(用户消息、截图、文档),处理完消失。
  • 短期记忆:context window 的 messages 列表,维持任务状态,任务结束清空。
  • 长期记忆:跨任务,向量数据库语义检索。子类型包括:
    • 情节记忆(Episodic):具体事件经历(上次退款问题查了订单系统)
    • 语义记忆(Semantic):提炼的通用规律(用户是金融行业)
    • 程序记忆(Procedural):做事方法论 SOP(退款流程先查订单再核实支付)
  • 实体记忆:从对话中提炼的结构化事实(用户偏好 Python、预算 5 万),信息密度高,查询快,不受原始表述影响。

设计记忆模块要回答三个核心问题:

1. 存什么? 判断标准:“这条信息下次任务开始时知道,会让 Agent 做得更好吗?” 值得存:用户偏好习惯、关键结论决策、外部知识。不值得存:中间推理过程、工具原始数据、闲聊(存了反而稀释信噪比)。

2. 怎么存? 不一刀切全塞向量数据库,按信息类型选介质:

  • 语义检索内容(文档知识、对话摘要)→ 向量数据库 + embedding
  • 结构化偏好状态(语言偏好、项目配置)→ 关系数据库/Key-Value(精确查询快)
  • 整段文档 → 向量数据库配合 RAG
  • 混合存储是主流:结构化用关系数据库,非结构化用向量数据库。

3. 什么时候取?

  • 主动检索:任务开始前用任务描述检索相关记忆,注入 system prompt 作背景知识。
  • 被动触发:执行中需要特定知识时,把"查记忆"封装成 Tool 让 Agent 自己调。
  • 实践:session 开始主动检索加载偏好背景;执行中按需检索专业知识。

5.4 记忆压缩的四种方法

短期记忆(context window)有硬上限,对话越长每次调用越贵。记忆压缩就是在保留关键信息的前提下,减少历史占用的 token。有四种方法,分别解决不同维度的问题:

方法一:滑动窗口(最简单最粗糙)

  • 只保留最近 N 轮,超出从最老丢。
  • 优点:极简无额外开销。缺点:硬截断,按时间一刀切,关键决策和闲聊同等对待。
  • 特性:“金鱼记忆”。适合短对话/历史不重要场景。

方法二:摘要压缩(丢之前先提炼)

  • 不直接丢,先 LLM 总结成精华摘要替换原文。
  • 类比:笔记本快满了,先把前半本要点整理成一页总结再收起来。
  • 代价:摘要会丢细节(LLM 按"重要性"省略,有些当时不重要后来需要的找不回)。
  • 层级式摘要:最近 10 轮原文,10-50 轮"中期摘要",50 轮前"长期摘要"(类比会议纪要体系)。
  • 最常见工程组合:滑动窗口 + 摘要——滑动窗口控总长,摘要负责丢弃前提炼。

方法三:重要性过滤(按价值筛选,不按时间)

  • 打破时间顺序,按内容实际价值决定去留:给每条打分,低于阈值淘汰。
  • 打分方式:规则打分(含"决定/确认/需求"关键词加分、被引用多加分;快但粗糙)或 LLM 打分(准确但开销大,批量清理时做)。
  • 观察遮蔽(Observation Masking):不删除低分内容,构造 prompt 时选择性"隐藏"。当前写代码就跳过需求讨论,进入测试再显示测试相关。信息没真删,动态选"当前最需要看什么"。
  • 主动压缩(Proactive Compression):不等快满才压,每步执行后主动判断哪些中间过程可压缩(如搜索返回 2000 token 立刻压成 200 token 要点)。适合工具调用频繁的 Agent。

方法四:结构化抽取(换载体存信息)

  • 质疑"对话文本是最佳载体吗"——很多场景有价值的是事实和状态,不是对话文字。
  • 主动提取关键信息存结构化字段(用户偏好 Python、预算 5 万、已确认方案 B)。
  • 类比医生病历(不存全程录音,存结构化档案)。
  • 信息损失最小,只要字段定义合理,重要信息精确保留。代价:开发成本最高,需预定义重要字段,通用性低。

四种方法解决三个不同维度的问题,可以组合:

维度 方法
历史太长怎么截 滑动窗口(直接截)/ 摘要压缩(截前提炼)
内容不等价怎么挑 重要性过滤(按价值,打破时间顺序)
对话文本是不是最佳载体 结构化抽取(换高效形式)

实际系统多方法配合:重要性过滤筛低价值 → 摘要压缩处理剩余 → 关键信息结构化抽取。

还有一个计算层的互补手段:Prompt Caching(Anthropic Claude 和 OpenAI 都支持)。背景是 LLM 每次请求需把输入所有 token"过一遍模型"(prefill),是延迟成本主要来源。固定 system prompt + 越来越长历史每次都重新计算。思路是:prompt 前缀在多次请求间一样,就把这部分计算结果缓存,下次前缀匹配直接复用。Anthropic 命中缓存 token 约为正常输入的 1/10。Agent 场景天然适合(system prompt + 长期记忆注入部分多轮不变)。

注意区分:记忆压缩在"信息层"(决定哪些内容保留),Prompt Caching 在"计算层"(对已决定带入的内容减少重复计算)。两者是互补关系,非替代,可同时用

5.5 长短期记忆系统的存储与使用

把两层记忆串起来,形成一个完整的"读 → 用 → 写"闭环:

def run_agent_with_memory(user_request, long_term_memory, short_term_memory):
    # 1. 任务开始前「读」:检索长期记忆,注入背景
    relevant_memories = long_term_memory.retrieve(user_request, top_k=3)
    system_prompt = f"你是一个智能助手。\n相关历史信息:\n{chr(10).join(relevant_memories)}"
    short_term_memory.add("system", system_prompt)
    short_term_memory.add("user", user_request)

    # 2. 执行中「用」:短期记忆全程工作(messages 追加)
    result = execute_task_with_short_term_memory(short_term_memory)

    # 3. 任务结束后「写」:重要结论写入长期记忆,短期记忆清空
    if result.is_important:
        long_term_memory.save(
            content=result.summary,
            metadata={"task_type": "coding", "timestamp": now()}
        )
    short_term_memory.clear()
    return result

这个"读-用-写"闭环是记忆系统的精髓:

  1. 任务开始前"读":实体记忆取结构化偏好 + 长期记忆语义检索 → 注入 system prompt。
  2. 任务执行中"用":短期记忆全程工作(messages 追加),需专业知识时临时检索注入。
  3. 任务结束后"写":新偏好更新实体记忆,有价结论写长期记忆,短期记忆清空。

记忆框架的趋势也值得关注:Mem0(记忆管理独立服务层,memory.add()/memory.search(),底层自动做 embedding/去重/冲突消解)、Letta(前身 MemGPT,灵感来自 OS 内存管理,三层:Core/Recall/Archival,Agent 自己通过工具调用管理)、Zep(Graphiti)(引入"时间感知",给记忆标"有效时间窗口",自动识别过时记忆)。

还有一个进阶话题是知识图谱让记忆产生关联:向量检索是"一条一条"存取,记忆间独立;知识图谱用"实体→关系→实体"三元组存储,可沿关系链多跳推理。实践上是和向量数据库配合——向量负责模糊语义检索,知识图谱负责精确关系推理。

记忆还需要定期整合升华(从碎片到知识):

  1. 去重:语义相近的多条合并。
  2. 冲突消解:矛盾时保留时间更新的,标记旧的过期(时间戳关键)。
  3. 抽象提炼(最有价值):情节记忆 → 语义记忆,把多次具体经历喂 LLM 总结通用规律。
  • 节奏:每次任务后轻量去重更新;每天/每周深度整理提炼。

实践要点

  • 长期记忆的核心是 Embedding + 向量数据库语义检索,不是"存数据库靠关键词搜索"。
  • 记忆粒度不是越细越好——太细导致碎片化,“一次完整交互"或"一个独立知识点"是合理粒度。
  • 两层记忆的作用时机要分清:短期是执行中工作台(结束清空),长期是任务前检索注入/任务后写入沉淀。
  • 记忆压缩四种方法解决三个维度问题,可组合;Prompt Caching 是计算层互补手段,不替代信息层的压缩。

第六章:Agent 规划能力

6.1 CoT → ToT → GoT 的演进

为什么需要规划能力?因为普通 LLM"一口气"生成答案,中间推理是隐式的,多步推导的误差在暗处累积(这是 Transformer next-token 预测机制决定的)。规划能力 = 把隐式推理显式化,不再"一步跳到答案”,而是"一步一步推到答案"。

规划能力的演进路径是 CoT → ToT → GoT,层层递进,每一层解决前一层的问题:

机制 解决的问题 代价
CoT 要不要把推理显式化(要,减少跳步出错) 几乎零成本
ToT 走错方向怎么办(多探索几条路,边走边评估边剪枝) CoT 的 3-5 倍
GoT 不同路径中间结论能不能复用(树换图,支持结论汇聚) 工程落地不成熟

6.2 Tree of Thoughts(思维树)

CoT(Chain of Thought,2022 Wei 等人) 是最简单的:prompt 加一句"让我们一步步思考",LLM 先写推理再给答案。有效原因:先输出的推理进入上下文,成为后续生成的依据(类比纸上演算数学题)。

两种触发方式:

  • Zero-shot CoT:直接加一句话,零成本即插即用,但不稳定。
  • Few-shot CoT:给带推理过程的示例,效果更稳定,需准备示例占 token。

CoT 的根本局限:只有一条推理路径,一开始走错全错,无纠偏机制

ToT(Tree of Thoughts) 就是为了解决"走错方向":把"一条链"变成"一棵树"——同时探索多条推理路径,边探索边评估边剪枝,选最优继续。

三步循环:生成多个候选思路 → 评估每个可行性打分 → 选优深入、剪掉差的。类比:CoT 只想一个解法做到底;ToT 想三种思路,评估选最好的继续,另两条放弃。

代价:多次 LLM 调用(多路径 × 多层深度 × 每层评估)。典型(每层 3 路径、搜 2-3 层)成本是 CoT 的 3-5 倍;极端(深搜/更多路径/每步打分)可能 10 倍以上。

6.3 Graph of Thoughts(思维图)

GoT(Graph of Thoughts) 解决的是 ToT 的另一个局限:树形结构分支独立,中间结论无法互相借用。GoT 把"树"变成"图"——允许不同路径的中间结果合并、复用,一个节点可以接收多个前置节点的输出。

例:研究竞品 A 和研究竞品 B 两条路径的结论,汇聚到"综合对比分析"节点(树结构每个节点只有一个父节点,难自然表达这种汇聚)。

GoT 能建模更丰富的推理模式,更接近人类复杂思考。但落地复杂度很高,目前主要学术场景,生产极少

6.4 规划能力的实现方式

CoT/ToT/GoT 讲的是"怎么让 LLM 推理更好",工程上真正常用的规划模式是 Plan-and-Execute

┌──────────────────────────────────────────────────────────┐
│            Plan-and-Execute 三步流程                      │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  1. Planner(规划器)                                     │
│     接收任务 → 生成步骤清单(只规划不执行)               │
│                                                          │
│  2. Executor(执行器)                                    │
│     按清单逐步执行(工具调用/LLM 推理)                   │
│                                                          │
│  3. Re-planner(重规划器)                                │
│     每步后回顾进展 → 判断计划是否适用 → 动态调整          │
│                                                          │
└──────────────────────────────────────────────────────────┘

为何需要:CoT 边想边做无全局视角,复杂多工具任务易跑偏。Plan-and-Execute 先一次 LLM 建立全局视角,再后续调用逐步落地,规划执行分两阶段。

与 ReAct 的关系:ReAct 每步即时决策无提前规划;Plan-and-Execute 在 ReAct 基础上加全局规划。不是替代,常搭配——ReAct 负责每步怎么执行,Plan-and-Execute 负责整体编排和动态调整。

工程好处:规划执行分离后,规划用强模型(GPT-4)保证方向,执行用快便宜模型提效,成本质量分别优化。LangGraph 内置支持这种模式。

工程选型

  • CoT 几乎标配(加一句话零成本)。
  • ToT 准确率要求高的复杂任务值得考虑(做好 3-5 倍成本准备)。
  • GoT 工程落地不成熟,了解思想即可。

实践要点

  • 典型误区:“CoT 就是规划能力”——CoT 只是最基础的实现手段,不是全部。
  • ToT 不是"想更多",而是"想多条路并评估剪枝",成本是 CoT 的 3-5 倍,用之前做好预算。
  • 工程上优先用 Plan-and-Execute,它比 CoT/ToT/GoT 更贴近真实任务编排。
  • 规划用强模型、执行用便宜模型,是 Plan-and-Execute 最重要的成本优化手段。

第七章:Agent 反思机制

7.1 反思的具体实现

反思的核心循环是 生成 → 评估 → 改进(Self-Refine,Madaan 2023),类比"草稿 → 批阅 → 修改",改完再审阅直到通过。

评估 prompt(检查者角色找问题)有两个关键设计

  1. 给出明确检查维度(事实/逻辑/完整性/表达),而非自由发挥——无方向评估会流于表面。
  2. 必须有"PASS"机制——给 LLM"够好了就停"的出口。没有则无限挑毛病,把原本对的改错。

改进 prompt 里三样东西缺一不可:原始任务 + 当前输出 + 评估意见。缺任何一个,改进就会变成无的放矢或偏离目标。

两个 prompt 循环调用,直到 PASS 或超最大轮次强制退出(普通 for 循环,不依赖 LLM 自己判断停止)。

7.2 反思与行动的关系

反思有两个粒度,适用不同场景:

粒度 触发时机 优点 代价 适合
步骤级 每步工具调用/推理后立即检查 错误早发现早纠正,不层层放大 每步多一次调用,10 步任务可能调 20 次 步骤强依赖、前步错后面全错
任务级 整个任务完成后整体评估 开销小(只多一次),能发现整体问题 中途大问题到最后才发现 步骤相对独立、整体质量重要(生成报告)

步骤级反思防止"错误传播",任务级反思发现"各步都对但结论矛盾/衔接不自然"的整体问题。两者不互斥,关键步骤用步骤级,整体用任务级。

7.3 反思机制的闭环设计

反思还有几个进阶机制:

多 Agent 互评(他人审视 > 自我检查):专门设独立的 Critic Agent 审查执行 Agent 输出。为什么更好?类比代码 review——自己写自己看容易"视觉疲劳",潜意识倾向认为逻辑正确。单 Agent 自我反思,评估者和生成者是同一模型,沿用生成时的内部逻辑,对自己的错误不敏感,容易陷入"自洽"。独立 Critic 没有这个包袱,唯一职责就是找问题,视角更客观。

流程:执行 Agent 生成 → Critic 审查给批注 → 执行 Agent 修改 → Critic 再确认。适合质量要求非常高的场景(代码生成后测试 Agent 验证、报告后事实核查 Agent 交叉验证)。代价是多一个 Agent 的成本和复杂度。

Reflexion(Shinn 2023):不仅反思当前输出,还把"失败经验"存下来,下次类似任务参考,避免重蹈覆辙。类比:Self-Refine 是"写完当场改";Reflexion 是"把这次犯错记笔记本,下次写前先翻笔记"。引入"经验记忆",适合重复执行类似任务的场景。

LATS(Language Agent Tree Search,Zhou 2024):反思 + 树搜索结合,MCTS 同时探索多条路径,每条路径执行后评估反思,反思结果作经验反馈后续探索。代价大,目前学术场景。

辩论式反思:多 Agent 互相辩论。正方提方案,反方专门挑毛病提反对意见,正方针对优化。对抗式比单方面审查更能暴露深层问题。偶用于高质量场景(商业决策分析、法律文本审查)。

7.4 实践中的调参经验

反思不是"万能 buff",要清醒地权衡:

  • 值得开:输出质量要求高、错误代价大的关键节点(最终报告、重要决策推理);任务复杂 LLM 易遗漏细节。
  • 不值得开:简单直接任务(格式转换、简单问答);实时性要求高(一次反思至少多一次调用,延迟可能从 1 秒变 3 秒)。
  • 防死循环:必须设最大轮次(通常 2-3 轮),绝对不能依赖 LLM 自己判断停止。LLM 会陷入"为了改而改"循环,每轮改动小但无实质进步。硬性轮次上限是唯一可靠退出机制。
  • 整体代价清醒认知:每轮反思含一次评估 + 一次改进,3 轮反思 = 额外 6 次 LLM 调用,延迟成本大幅增加。用在刀刃上,不是每步都做。

实践要点

  • 反思不是"不满意就重新生成"(随机重试),而是"生成→评估→改进"有结构的闭环。
  • 评估 prompt 必须有明确检查维度 + PASS 机制,否则要么流于表面要么死循环。
  • 多 Agent 互评往往比自我反思更有效——独立 Critic 没有"自洽"包袱。
  • 反思最多 2-3 轮,硬性上限是唯一可靠的退出机制,绝不能依赖 LLM 自己判断停止。

第八章:手搓 Agent vs 使用框架

8.1 为什么有时候要手搓 Agent

框架(如 LangChain)的价值是真实的:封装重复工作(工具格式定义、解析工具调用、维护对话历史、失败重试、向量库接入),早期上手快,能把两周缩短到两天。POC 阶段几乎无副作用,框架很爽。

但痛点随项目推进会浮现:

  • 第一个奇怪 bug:你代码 50 行,stack trace 40 层,追到框架内部。不知道是自己的问题、框架版本变化、还是 callback 触发时机。类比老式车(打开引擎盖自己看漏油)vs 现代豪华车(一堆电子设备只能诊断仪扫)。
  • 版本升级踩坑:依赖升级时 LangChain 改了接口,代码报错,要么回滚要么改十几处。早期 breaking change 常见。
  • 性能优化隐性开销:规模化时 profile 发现框架每次调用都在做你不需要的事(序列化中间结果、触发 callback、记录日志),高流量下累积成真实延迟和费用。

8.2 框架的局限性

框架的核心局限在于抽象层让你离底层更远。Anthropic 官方 Agent 构建指南也建议:不要一上来就用框架,先用最少抽象把核心逻辑跑通。“框架抽象层让你离底层更远,调试成本比省下的开发时间还高”。

类比:框架是"租房"(装修好直接住,但结构改不了,房东随时调政策);手搓是"自建"(建得慢,但所有结构熟悉,改什么都能改)。

对比一下两版代码就很清楚:

# 框架版(简洁但黑盒)
from langchain.agents import AgentExecutor, create_openai_tools_agent
agent = create_openai_tools_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools)
result = executor.invoke({"input": "帮我查一下今天的天气"})
# (AgentExecutor 新版已废弃,官方推荐迁移 LangGraph,印证升级痛点)

# 手搓版(代码多但每步在眼前)
messages = [{"role": "system", "content": system_prompt}]
messages.append({"role": "user", "content": user_input})
for i in range(max_turns):
    response = client.chat.completions.create(
        model="gpt-4", messages=messages, tools=tool_schemas
    )
    msg = response.choices[0].message
    messages.append(msg)
    if not msg.tool_calls:
        break
    for tc in msg.tool_calls:
        result = execute_tool(tc.function.name, tc.function.arguments)
        messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
        logger.info(f"工具 {tc.function.name} 返回: {result}")  # 随意加日志/监控/重试

8.3 手搓的核心要素

手搓的核心优势是完全掌控

  1. 链路透明、可观测性好:每行代码知道在干什么,任意位置加日志/断点/监控,无黑盒。线上出问题靠日志复现最快。
  2. 精确裁剪、无多余开销:只写需要的逻辑,无通用性包袱,优化空间完全在自己手里。
  3. 稳定可控、不受框架升级影响:自己接口不会突然变,依赖只有底层 LLM SDK 相对稳定。

8.4 什么时候该手搓,什么时候该用框架

场景 选择
POC 快速验证 idea 框架(速度优势真实)
团队刚接触 Agent 开发 框架(少踩基础坑)
周边工具依赖框架生态 框架
准备上生产,稳定性核心关切 手搓
流量上来,性能成本敏感 手搓
业务逻辑高度定制 手搓
需高可观测性 手搓

最务实的折中方案:核心手写,周边借用。

  • 核心逻辑手写(Agent 心脏):工具调用循环、对话历史管理、错误处理重试、任务状态维护——百分百理解百分百掌控。
  • 周边工具借用:LangSmith tracing、LlamaIndex 文档解析、向量库客户端——出问题一眼看出,不带来黑盒。
  • 类比盖房:自己设计核心结构承重墙,门锁插座水龙头买现成。

真实项目的演进轨迹往往是:框架快速跑通验证方向 → 遇线上问题把关键部分替换手写 → 流量上来性能敏感核心全手写 → 框架只保留周边工具。

判断信号:能清楚说出"框架在某处替我做了什么" → 理解它有掌控感;只调方法不知里面发生什么 → 黑盒需警惕。框架本身不是问题,“不理解就依赖"才是。

实践要点

  • 不要一开口否定框架——POC 阶段它的速度优势是真实的。
  • 手搓的价值是"完全掌控”:可观测、稳定、可裁剪。
  • 最务实的是折中方案:核心逻辑手写(Agent 心脏),周边工具借用框架(不带来黑盒的部分)。
  • 判断该不该手搓的信号:能否清楚说出"框架在某处替我做了什么"。

第九章:多 Agent 系统

9.1 什么是 Multi-Agent

Multi-Agent = 多个 Agent 协作完成任务,各有分工(搜索/写代码/评审)。价值不只是"多几个 AI",背后有两个具体的工程问题驱动

单个 Agent 有两个硬限制:

  1. context window 大小限制:复杂任务信息量一多就撑爆,早期内容"掉落",Agent 遗忘。这是结构性上限,非努力优化能绕过。
  2. 单点能力(专业度)问题:什么都让一个 Agent 做,每件事都是泛才,精力分散。一个 Agent 既搜信息又写代码又测试又写文档,每件都不够专注,互相干扰。某环节出问题整条链路卡住,无隔离性。

Multi-Agent 的核心思路是"团队作战代替单打独斗":按职能拆开,每个 Agent 只负责一件事,专心做好,做完传给下一个。关键好处:每个 Agent 的 context 完全隔离,工作台干净,只装自己那块信息,专业度更高;无依赖子任务可并行执行,整体速度提升;某环节出问题可隔离定位。

三种协作模式:

模式 说明
顺序流水线(Sequential Pipeline) A→B→C 依次处理,工厂流水线
并行扇出(Fan-out) 调度者同时分发独立子任务给不同 Worker,并行执行,最后汇总
辩论/评审(Debate/Review) 多 Agent 各给方案,裁判 Agent 或互相评审筛选最优解

9.2 Single-Agent vs Multi-Agent 选型

Single-Agent 的本质:一个 LLM + 一套工具,跑决策循环。最大优势不只是"架构简单",更核心是整条任务链路完全在掌控内——任务怎么走、用什么工具、何时结束都在一处写清,出问题链路短好排查。类比一个人独立写博客,自己查资料想大纲写下来,单人更高效,沟通成本为零。

Single-Agent 力不从心的三类任务(此时 Multi-Agent 有真实价值):

  1. 任务太长信息量太大,context 撑爆,Agent 遗忘。
  2. 不同步骤需完全不同专业能力,什么都塞一个 Agent 每件都不专注。
  3. 任务中有多个独立子任务可并行,单 Agent 只能一个个来。

不属于这三类就用 Single-Agent,不要为"用新技术"强行引入 Multi-Agent。

渐进式演进策略(实用):先 Single-Agent 跑起来,发现某环节成瓶颈(context 常撑满/某类子任务质量不行)再拆出来交专门 Worker Agent。不要一上来就设计五六个 Agent 的复杂系统,可能连真正瓶颈都没搞清。从 Single-Agent 演进到 Multi-Agent 是自然过程,非一开始的架构决策。

三方案对比:

维度 Single-Agent Multi-Agent(中心化) Multi-Agent(去中心化)
架构复杂度
Context 压力 全压一个 各独立 各独立,需额外共享协调状态
专业能力 泛才 专才分工 专才分工
并行能力 不支持 支持子任务并行 支持并行
可控性 高(Orchestrator 统管)
调试难度 容易 中(按调度链路追踪) 难(行为不可预测)
工程实用性 低(主要学术研究)
适用场景 任务清晰复杂度适中 需分工或并行的复杂任务 学术探索

9.3 多 Agent 通信方式(消息传递 vs 共享状态)

Agent 间传递信息有两种方式:

消息传递(像发邮件):

  • Agent 完成工作后把结果发到消息队列,下游 Agent 订阅感兴趣的消息取到再处理。
  • 核心优势:解耦——发送方不需知道谁在接收,接收方不需知道谁发送。
  • 缺点:需消息中间件维护机制,部署成本稍高。
  • 适合:Agent 间需独立运行、互相不感知。

共享状态(像共享白板):

  • 所有 Agent 读写同一状态对象,记录任务进展和中间结果。
  • 核心优势:直接——前一步写进去后一步直接读。
  • LangGraph 用此思路,贯穿所有 Agent 的 State,每个 Agent 执行完写入结果,下一个直接读。
  • 适合:各步骤依赖关系明确的流水线型任务。

怎么选:依赖强(前一步结果直接传后一步)→ 共享状态;希望解耦(互相不知存在)→ 消息传递。

状态管理设计要点(多 Agent 最易出 bug 处):

  1. 状态结构分层
    • 全局状态:所有 Agent 都需读取(用户原始请求、任务进展、最终输出)。
    • 局部状态:每个 Agent 自己的中间结果(搜索候选文档、代码草稿),不直接暴露给其他 Agent,避免信息污染。
  2. 写入规则明确:最简单可靠是"只追加不覆盖",每个 Agent 完成后追加而非修改已有字段。LangGraph State 更新机制即此思路——定义 schema,节点返回"增量更新",框架合并到全局状态,不会互相覆盖。
  3. 错误状态处理:Agent 执行失败,错误信息也写入状态而非悄悄吞掉。后续 Agent/Orchestrator 读到错误状态才能正确决策(跳过/换 Agent 重试/终止)。

9.4 路由策略(静态规则 vs LLM 动态决策)

Orchestrator 怎么决定叫谁?有静态和动态两种路由:

静态路由(提前写死规则):

  • “任务含搜索→Researcher"“步骤是代码写完→Reviewer”,找不到匹配→Orchestrator 兜底。
  • 像工厂流水线,每道工序完成后下一步固定。效率高、可预测、好调试。但覆盖不了没预料的情况。

动态路由(LLM 决策):

  • Orchestrator 把当前任务描述、已完成什么、可用 Agent 列表全告诉 LLM,让它判断"现在叫哪个 Agent”。
def dynamic_route(task_context, available_agents):
    prompt = f"""当前任务状态:\n{task_context}\n\n
    可用的 Agent:\n{chr(10).join(f'- {a}' for a in available_agents)}\n\n
    请根据当前进展,判断下一步应该交给哪个 Agent。只返回 Agent 名称,不需要解释。"""
    response = client.chat.completions.create(
        model="gpt-4", messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content.strip()

优点:灵活,能处理任何没预先设计的路径。缺点:每次路由多一次 LLM 调用(延迟成本增加),LLM 偶尔路由错,可预测性降低。实际还会加保护措施:校验返回名称是否在可用列表、设默认 fallback Agent、记录路由决策日志。

9.5 Orchestrator 中心化模式

Orchestrator(交响乐指挥/总调度员/项目经理)是最特殊的 Agent:不做任何具体工作,只负责三件事——读懂大目标拆子任务、判断每个子任务交哪个 Worker、收集产出拼最终答案。

Orchestrator 有三个变体:

变体 说明 复杂度
静态路由(Static Router) 任务拆分分配规则预先定义 简单可预测
动态规划(Dynamic Planner) Orchestrator 是 LLM,动态生成任务计划,可执行中调整 中(大多数场景够用)
自适应编排(Adaptive Orchestration) 不仅动态规划,还根据 Worker 结果实时调整后续计划 高(调试复杂)

Worker Agent 只关注自己那块,不需要知道整体任务和其他 Worker,拿指令做完返回结果退出,context 干净。

中心化最大好处:每环节出问题能精准定位(报告不准→Researcher;分析逻辑错→Analyst;格式不对→Writer),顺着调度记录追根源。

去中心化方案为什么"听起来灵活"却很少工程用? 因为实际工程问题太多(三 Agent 场景为例):

  1. 任务分配没协调(A 和 B 搜大量重叠内容,重复工作)。
  2. 执行顺序没保证(C 不知 A/B 何时搜完,不知等多久)。
  3. 失败没感知(A 中途出错,无中央调度收错误通知,B/C 还在跑,汇总出不完整结果但系统不知道)。
  4. 没人确认"任务整体完成了"。

类比无项目经理团队:每个人都能干,但没人协调时间节点和接口,交出互不兼容结果。生产环境几乎所有正经项目都选 Orchestrator 模式。去中心化多停留在学术研究。

9.6 多 Agent 协作与动态切换

多 Agent 协作有三种主要模式(不互斥,复杂系统常混合):

模式 说明
流水线模式 Agent 按固定顺序依次执行,前一个完成交下一个(工厂装配线)
层级模式 Orchestrator 分配任务收集结果,其他 Agent 各自执行子任务
协商模式 多 Agent 无严格上下级,通过互相沟通辩论达成一致

Handoff 模式(Agent 间"接力棒",OpenAI Swarm 框架推广):

  • 不需中央 Orchestrator 决定"下一步找谁",让当前执行 Agent 自己决定"我做完了,接下来交给谁"。接力赛跑,跑完自己那棒直接递接力棒。
  • 好处:每个 Agent 对自己任务边界最清楚,由它决定下一步找谁往往比外部 Orchestrator 更准;无中央节点瓶颈,扩展性好。
  • 缺点:无全局视角。A 交 B,B 觉得不是自己活交 C,C 又交回 A → 死循环。
  • 必须设计:每个 Agent 职责边界清晰 + 防循环机制(记录任务经过哪些 Agent,重复经过同一 Agent 强制终止)。

工程上怎么用

  • 最稳健:两种路由组合——主流程静态路由(确定性节点切换写规则,保绝大多数稳定可预测),边缘情况才交 LLM 动态决策。静态路由"保底",动态路由"兜住异常",互补。
  • Handoff:适合 Agent 职责边界非常清晰、任务流向相对确定的场景。Agent 数量不多、输入输出接口明确 → 比 Orchestrator 简洁;数量多流向复杂 → 用 Orchestrator 统一调度避免交接成乱麻。
  • 通信方式:相对清晰流水线(明确前后依赖)→ 共享状态;需多 Agent 独立并行互不感知 → 消息传递。

9.7 Multi-Agent 的工程挑战

Multi-Agent 不是"多个 AI 效率更高"那么简单,它带来真实的工程挑战:

  1. 通信开销:Agent 间传递信息、Orchestrator 调度决策,都增加额外的 LLM 调用和延迟。
  2. 状态一致性:多 Agent 读写同一状态,设计不好易被意外覆盖或读脏数据(“只追加不覆盖"是最简单可靠的规则)。
  3. 调试复杂度:行为路径不确定,出问题要顺着调度链路追根源,比 Single-Agent 难得多。
  4. 成本控制:每个 Agent 都是独立的 LLM 调用循环,多 Agent 系统的总 token 消耗和延迟会成倍增加。

框架生态方面:CrewAI、LangGraph 封装了通信/调度/汇总基础设施。Microsoft Agent Framework(MAF) 2025 年推出,合并了 Semantic Kernel(企业级)+ AutoGen(多 Agent 编排)为统一 SDK。选框架:微软技术栈生产优先 MAF;其他场景 CrewAI(上层易用)或 LangGraph(底层灵活)。

协议趋势:A2A(Agent2Agent,Google 2025 年 4 月提出)解决不同团队/框架开发的 Agent 间通信协作。之前每个框架自己通信方式,Agent 只能在同框架内协作。A2A 定义标准化通信协议,思路像微服务。目前已捐 Linux 基金会。但目前较早期,实际生态"真正即插即用跨框架调用"未完全成熟,多为社区实现和示范项目。

实践要点

  • 选型标准不能只说"任务复杂”,要说出三类具体场景(context 撑爆/需多专业/可并行)。
  • 生产环境几乎都选 Orchestrator 中心化模式——可控、可追踪、出问题能排查。去中心化主要在学术。
  • 状态管理用"只追加不覆盖"规则,避免多 Agent 互相覆盖。
  • 路由最稳健的组合:主流程静态路由保底 + 边缘情况动态路由兜底。
  • 不要一上来就设计五六个 Agent 的复杂系统,先 Single-Agent 跑通,遇瓶颈再渐进拆分。

结尾

核心知识点回顾

贯穿全文的核心原则,可以用八句话概括:

  1. 决策与执行分离:模型是大脑只决策,代码真正执行(工具调用、ReAct 循环驱动)。
  2. 谁做决策是核心区分:Tools 不决策、Agent 自主决策、Workflow 开发者写死决策。
  3. 可控性 > 灵活性(生产环境):能用 Workflow 就别用 Agent,Agentic Workflow 是主流。
  4. 够用就好,别过度工程化:先 ReAct 跑通,按需加 Plan-and-Execute / Reflection;先 Single-Agent,遇瓶颈再 Multi-Agent。
  5. 完全掌控优于黑盒:核心逻辑手写,周边工具借用框架。
  6. 工程取舍三维度:任务复杂度、流程确定性、输出质量要求决定范式选型。
  7. 记忆读-用-写闭环:任务前读记忆注入背景,执行中短期记忆维持状态,任务后写长期记忆沉淀。
  8. 防失控机制必备:最大循环次数/token 预算/超时(Agent);最大反思轮次 2-3 轮(Reflection);防循环记录(Handoff)。

用一张总览图把所有概念串起来:

                    【Agent 本质】自主闭环(感知→规划→行动→再感知)
                              │
              ┌───────────────┼───────────────┐
              ▼               ▼               ▼
         【四大组件】      【三层结构】     【三大局限突破】
         LLM(大脑)        Tools(积木)      工具调用(突破知识冻结/不能行动)
         工具系统(手脚)    Agent(决策者)    记忆机制(突破无持续状态)
         记忆系统(档案)    Workflow(总指挥) 多步推理(自主纠错)
         规划模块(PM)
              │
    ┌─────────┼──────────┐
    ▼         ▼          ▼
【设计范式】           【推理模式】
ReAct(边想边干)        CoT(线性写推理)
Plan-and-Execute       ToT(树形多路径)
(先规划再执行)          GoT(图形可复用)
Reflection(质量buff)
    │
    ├── 动态 Replan(计划遇意外调整)
    └── Reflexion(失败经验存记忆,错题本)
         │
         ▼
【工程实践】
任务拆分(静态/动态/自适应) + 并行优化(DAG)
记忆(四层) + 压缩(滑动窗口/摘要/重要性/结构化)
规划能力(CoT→ToT→GoT + Plan-and-Execute)
反思机制(生成→评估→改进, 步骤级/任务级, 多Agent互评)
手搓vs框架(核心手写周边借用)
         │
         ▼
【多Agent】
Single vs Multi(context上限/专业度/并行)
协作(消息传递/共享状态) + 切换(静态路由/动态路由/Handoff)
中心化(Orchestrator) vs 去中心化(少用)
协议(MCP管工具, A2A管Agent间通信)

与其他主题的关联

Agent 是整个 AI 工程知识体系的集大成者。前面几篇文章讲的知识,在 Agent 这里汇聚成一个完整的自主系统:

  • LLM(大语言模型):Agent 的"大脑",所有理解和决策的中枢。没有强 LLM,Agent 无从谈起——这正是 Agent 爆发的第一个条件。
  • RAG(检索增强生成):Agent 长期记忆的本质就是"按需 RAG"——任务开始前检索相关记忆注入 context,和 RAG 检索文档注入 context 是同一个机制。
  • 工具调用 / Function Calling:Agent 突破"不能行动"的关键,也是"决策与执行分离"哲学的落地。MCP 协议标准化的正是这一层。
  • Prompt Engineering:Agent 的 System Prompt 是它的"岗位说明书",调优占开发时间相当大比例。CoT/ToT 等"推理模式"本质也是 prompt 工程。
  • 框架(LangChain/LangGraph 等):降低 Agent 开发门槛的脚手架,但"核心手写、周边借用"才是生产环境的务实之道。

可以说,理解了 Agent,就理解了 AI 工程的全貌——它是 LLM + RAG + 工具调用 + 框架 + 规划 + 记忆 + 反思的融合体。任何一个环节的短板,都会成为 Agent 整体能力的瓶颈。

进一步阅读资源

  • ReAct 原始论文:Yao et al., “ReAct: Synergizing Reasoning and Acting in Language Models” (2022)——理解 Thought→Action→Observation 循环的理论源头。
  • Reflexion 原始论文:Shinn et al., “Reflexion: Language Agents with Verbal Reinforcement Learning from Multi-Aspect Feedback” (2023)——反思机制 + 经验记忆的奠基工作,HumanEval 80%→91% 的来源。
  • Self-Refine 论文:Madaan et al., “Self-Refine: Iterative Refinement with Self-Feedback” (2023)——生成→评估→改进闭环的正式提出。
  • Anthropic “Building Effective Agents”:Anthropic 官方 Agent 构建指南,“能用 Workflow 就别用 Agent"原则的出处,强烈推荐。
  • MCP 规范(Model Context Protocol):Anthropic 提出的工具标准化协议,工具世界的"USB-C”。
  • A2A 协议(Agent2Agent):Google 提出的 Agent 间通信协议,已捐 Linux 基金会。
  • LangGraph 文档:生产级 Agent/Workflow 编排框架,Plan-and-Execute、共享状态等模式的参考实现。
  • Letta(MemGPT):灵感来自 OS 内存管理的记忆框架,三层记忆(Core/Recall/Archival)值得研究。
  • Microsoft Agent Framework(MAF):2025 年微软统一 SDK,合并 Semantic Kernel + AutoGen。

Agent 不是终点,而是 AI 工程从"单点能力"走向"自主系统"的起点。当 Agent 能自主闭环、能跨任务记忆、能多体协作,我们离真正的"通用 AI 助手"就更近了一步。理解本文的每一层,都是在为搭建那个"能干的私人助理"打地基。