第一部分 理论篇:大模型Agent核心原理
1.1 Agent的定义演化时间轴

Agent = 模型 + 记忆 + 工具 + 规划 + 循环
1.2 现代Agent四层架构:感知、规划、执行、记忆

现代工业落地的大模型 Agent,一般拆解为感知层、规划层、执行层、记忆层四大核心模块。四层相互循环协作,记忆层贯穿整个生命周期,共同实现智能体自主思考、工具调用、任务迭代执行的完整能力闭环。
1.2.1 感知层(Perception Layer):多源输入与上下文组装
感知层是Agent的"感官入口",负责接收来自外部世界的各类信息,将多路输入整合、组装成完整Prompt上下文,喂给后续推理模块。
1.2.1.1 输入来源类型
- 用户文本指令:用户自然语言描述的任务目标和约束条件。
- 工具返回结果:函数调用、API执行完成后返回的数据,作为本轮任务的反馈信息。
- 历史对话记录:从记忆层读取出来的短期、长期上下文信息。
- 外部环境状态:网页内容、本地文件、代码仓库等环境读取的数据。
- 多模态输入(可选):图像、表格、PDF等非文本类信息。
1.2.1.2 Prompt上下文组装过程
感知层将多路信息拼接成大模型可识别的消息列表,依次放入系统提示词、检索得到的长期记忆内容、历史对话上下文、当前用户输入。
1.2.1.3 感知层核心设计问题
- 信息筛选:什么信息必须传入上下文?哪些冗余信息可以过滤?
- 上下文窗口控制:上下文超长时,如何截断、摘要压缩,避免超出模型Token上限。
- 多模态统一表征:图片、表格等异构信息,如何转换成模型可理解的格式。
1.2.2 规划层(Planning Layer):LLM作为推理引擎
规划层是Agent的大脑,Agent自主决策、任务分解、动态反思的能力全部由该层提供。规划层质量直接决定Agent能力上限,大模型本身的推理能力,就是Agent的规划智慧。
1.2.2.1 四项核心职责
- 目标理解:解析用户意图,提取任务核心目标与约束条件,把自然语言转换成机器可处理的任务表征。
- 路径规划:将复杂大目标拆解为多个子任务,确定任务执行顺序、挑选合适工具序列,生成行动计划。
- 动态调整:根据工具返回的执行结果实时更新计划;当执行结果不符合预期时,重新规划后续执行步骤。
- 自我反思:审查中间执行结果和历史操作,判断任务是否回退、修正或者直接终止,避免错误不断累积放大。
1.2.2.2 典型推理模式:思维链CoT
规划层最常使用Chain‑of‑Thought提示词范式,拆分Thought思考、Action行动两个阶段:
System:分步骤思考,先列出计划再执行。
Thought:用户要分析销售数据,需要:
- 读取 CSV 文件
- 计算各月环比
- 找出峰值月份
- 生成摘要报告
Action: 读取销售文件
1.2.3 执行层(Execution Layer):从指令到真实行动
执行层是Agent的手脚,负责落地规划层输出的行动指令,完成和外部世界交互,拿到任务执行结果再反馈回去,开启新一轮循环。
1.2.3.1 三大核心职责
- 工具调用:解析规划层输出的行动指令,分发到对应的工具、接口;同时处理调用超时、异常报错、权限不足等问题。
- 环境交互:操控浏览器、读写本地文件与数据库、运行脚本命令,完成真实环境操作。
- 结果回收:将工具返回的数据格式化为文本,注入下一轮Prompt上下文,触发规划层开启新一轮推理循环。
1.2.3.2 执行层完整工作流
规划层输出行动指令 → 工具路由器分发任务 → 工具执行 → 结果格式化与异常处理 → 将结果注入上下文,触发下一轮规划。
1.2.4 记忆层(Memory Layer):Agent的知识基础
记忆层相当于Agent的"记忆系统",用来存储对话、任务、知识信息,让智能体拥有跨轮次长期认知。Agent记忆体系一共分为四类:
- 短期记忆:当前对话消息历史,直接拼入Prompt上下文;受模型上下文窗口限制,一般保存最近N轮对话。
- 长期记忆:将重要信息做Embedding向量化,存入向量数据库;每次任务开始时通过语义检索,取出相关历史信息注入Prompt。
- 情景记忆:记录具体时序事件,例如"用户上次项目框架是React";偏向保存事件发生过程,类似人类经历回忆。
- 语义记忆:存储通用规则、抽象知识,例如"用户偏好简洁风格报告";偏向概念、事实、用户偏好类知识。
1.2.4.1 记忆读写时机
- 读取时机:每轮对话启动、感知层组装Prompt、规划层参考历史决策时读取记忆;
- 写入时机:对话结束提取摘要、检测重要偏好信息、任务完成保存执行过程与结论。
1.2.5 四层协作:一次完整Agent执行全流程
四层模块并不是一次性单向运行,而是循环迭代,记忆层全程贯穿任务生命周期,每一步都可以读写记忆。
完整执行链路:
感知层(接收输入) → 规划层(推理规划) → 执行层(调用工具) → 执行层(回收结果) → 规划层(再次规划迭代) → 记忆层(写入任务成果)
1.2.5.1 实战案例:任务「帮我写一份竞品分析报告」
- 感知层:接收用户「竞品分析」指令,从记忆层读取用户所在行业背景信息,组装完整Prompt;
- 规划层:任务拆解生成计划:搜索竞品A →搜索竞品B →对比分析 →生成报告摘要;
- 执行层:依次调用搜索工具,获取竞品A、竞品B结构化数据;
- 规划层:汇总搜索结果,再次推理分析,产出竞品对比文本;
- 记忆层:将本次竞品分析结论写入长期记忆,后续对话可以直接复用本次成果。
1.3 ReAct循环:Thought‑Action‑Observation推理行动交织
ReAct 是目前工业Agent最主流的执行范式,核心思想就是推理思考(Thought)和行动执行(Action)交替循环 。大模型不再一次性给出最终答案,而是先思考、再动手调用工具、观察返回结果,基于新信息再次思考,往复迭代直到任务完成。

1.3.1 ReAct完整执行流程
- 用户输入目标任务
- Thought(思考):分析当前任务,拆解步骤,制定下一步行动计划,判断是否需要调用外部工具。
- Action(行动):执行计划,调用对应的工具接口;如果信息已经充足,也可以直接输出最终答案结束任务。
- Observation(观察):接收工具返回的数据、结果反馈,把外部信息带回给大模型。
- Thought(再次思考):评估刚刚拿到的结果,判断任务是否完成、数据是否充足,规划后续步骤。
- 重复「Thought‑Action‑Observation」循环,直到模型产出Final Answer(最终答案),任务终止。
1.3.2 三个阶段详解
1.3.2.1 Thought 思考阶段
属于模型内部推理过程,不需要接触外部环境。
负责解析现状、反思上一轮结果、判断缺口、生成下一步策略。是Agent"动脑"的环节。
1.3.2.2 Action 行动阶段
Agent对外交互的环节。
按照思考得出的方案,发起工具调用,例如联网搜索、读取文件、查询数据库。
1.3.2.3 Observation 观察阶段
接收外部世界给到Agent的反馈。
将工具返回的原始结果整理成可读文本,送入上下文,供给下一轮思考使用。
1.3.3 ReAct 的优势与局限
1.3.3.1 ReAct 的优势
-
可解释性强
Thought 步骤暴露推理过程,方便调试、审计和用户理解。
-
动态适应
每一步 Observation 都能够修正计划,不再依赖一次性生成完美规划。
-
支持多步工具链
天然支持任务先后依赖关系(先查A才能查B),相比单次工具调用能力更强。
-
框架简洁
仅依靠提示词约束 + 工具路由即可实现,开发门槛低,LangChain、AutoGPT 等大量开源Agent框架均基于该范式。
1.3.3.2 ReAct 的局限
-
无显式验证步骤
行动完成之后缺少专门的校验环节。一旦工具返回结果出错,错误会在循环迭代中不断累积放大。
-
单路径推进
同一时刻只探索一条执行路线,无法并行尝试多种备选方案,也不具备任务分支回溯能力。
-
上下文随循环增长
每一轮 Thought‑Action‑Observation 的内容都会追加进Prompt上下文;长任务很容易逼近模型上下文窗口上限,同时带来更高的 Token 消耗成本。
-
依赖 Prompt 格式稳定性
强依赖大模型输出严格遵守指定格式。一旦模型发生输出漂移,返回格式错乱,工具解析失败就会直接造成Agent运行崩溃。
1.4 OTAC循环:Observe‑Think‑Act‑Check带校验的自主循环
OTAC 是在 ReAct(Thought‑Action‑Observation)范式之上迭代升级出来的Agent循环框架。最核心的改动就是在行动之后新增了Check自我检查环节 ,解决ReAct缺少结果校验、错误不断累积放大的痛点。

1.4.1 ReAct存在的核心缺陷
- 没有验证环节
行动完成后直接进入下一轮思考,Agent不会主动校验执行结果是否达到预期,错误会悄无声息流入后续步骤。 - 错误累积放大
在长任务流程里,早期步骤产生的错误结果被写入上下文,后续全部推理都会建立在错误信息的基础之上。 - 无回退机制
一旦执行路径出错,ReAct只会一直向前推进,缺少"退回上一步、更换备选方案"的纠错能力。
1.4.2 OTAC改进思路
- ReAct循环流程:
Thought → Action → Observation,循环过程中无校验步骤。 - OTAC循环流程:
Observe → Think → Act → Check,每一次行动结束之后都会执行Check验证,校验失败时可触发重试或者任务回退。
1.4.2.1 设计哲学
遵循「先做,再查」的执行理念。每次行动结束后主动校验执行成果,把错误消灭在当前步骤,而不是等到整个任务失败后再回头排查问题。
目前 Claude Code、Manus、Devin、OpenAI Operator 这类工程型Agent工具,都内置了该验证思想,在执行代码、操控网页之后添加结果校验步骤。
1.4.3 Check步骤:OTAC的核心创新
Check阶段负责检验Act行动产出的结果,校验完成后一共有三种决策分支:
-
继续(Pass)
- 条件:执行结果符合预期,无异常问题
- 处理方式:将结果写入记忆,进入下一轮Observe步骤,继续推进任务。
-
重试(Retry)
- 条件:执行结果没有达到预期,但是任务的前进方向正确
- 处理方式:调整参数或者更换工具,在当前步骤之内重新执行Act,一般设置最大重试次数防止无限循环。
-
回退(Rollback)
- 条件:执行出现严重错误、Agent走入错误路径
- 处理方式:回退到前一个安全状态,重新开启Think环节,制定全新的行动方案。
1.4.3.1 Check校验时需要思考的核心问题
- 结果是否包含任务预期产出的内容?
- 是否出现报错、异常、空返回等负面现象?
- 当前距离最终任务目标,还缺少哪些信息?
1.4.3.2 案例对比
┌──────────────────────────────────────────┐ ┌──────────────────────────────────────────────────────┐
│ ReAct(无校验,错误跑偏) │ │ OTAC(带Check自检,重试成功) │
└──────────────────────────────────────────┘ └──────────────────────────────────────────────────────┘
开始任务:读取网页价格 开始任务:读取网页价格
│ │
▼ ▼
Thought:打开网页获取价格 Observe:目标读取网页价格,暂无结果
│ │
▼ ▼
Action:访问目标网址 Think:计划调用浏览器访问网页
│ │
▼ ▼
Observation:页面空白、加载失败 Act:第一次执行访问网页
│ │
▼ ▼
Thought:网页无价格,改用搜索引擎查询 Check:页面空白加载失败 → Status:RETRY,刷新重试
│ │
▼ │
Action:搜索商品价格 ┌───────────┘
▼ ▼
Observation:拿到第三方报价 Act:第二次重新访问网页
│ │
▼ ▼
输出最终答案 Check:页面加载成功,读到价格¥199 → Status:PASS
│
▼
任务完成,输出价格结果
1.4.4 Check 对比 ReAct 里 Thought 的核心区别
Thought 的首要目标是「往前规划下一步干什么」;Check 的唯一目标是「回头核验上一步有没有干成」。
| 维度 | ReAct 的 Thought(顺带判断结果) | OTAC 的 Check(独立校验步骤) |
|---|---|---|
| 核心目标 | 规划后续行动,向前推进任务 | 核验上一步行动是否达标,审查成果 |
| 校验属性 | 隐性、可选,可跳过校验 | 显性、强制,每一步 Act 之后必经关卡 |
| 失败分支 | 无原生重试 / 回退机制,容易跑偏 | 三分支:PASS / RETRY / ROLLBACK |
| 视线方向 | 看向未来:下一步干什么 | 看向过去:刚才有没有做成 |
| 容错方式 | 发现异常就换一条新路往前走 | 发现异常优先在原地修复错误 |
1.5 自主决策与复杂任务分解策略
1.5.1 agent 自主策略
依靠大模型理解目标,实时做出判断,摆脱固定路由(严格规定的if else)代码。
Agent 在执行任务的全过程,需要自主回答三个核心问题:
- 选什么工具?
当前目标需要调用哪一个工具、参数如何配置。大模型依据工具描述、上下文动态匹配,不需要硬编码路由逻辑。 - 继续还是停止?
判断任务是否完成,剩余多少步骤。评估当前进展是否达成目标,决定是否终止循环。 - 自己做还是求助?
遇到高风险操作(删除文件、发送邮件)或者信息不足时,主动暂停任务、向用户确认,拒绝盲目执行。
Agent 根据自身信心程度,输出三种决策结果:
| 决策状态 | 触发条件 | Agent 动作 | 典型场景 |
|---|---|---|---|
| 继续执行 | 信心充足,信息完整 | 按计划执行下一步行动,无需等待确认 | 搜索公开信息、读取本地文件、生成文稿;低风险、可逆操作 |
| 主动停止 | 不确定性高,缺少关键信息 | 向用户提问,补齐缺失信息之后继续执行 | 报告受众不明确,需要确认是面向内部员工还是外部客户 |
| 拒绝执行 | 高风险、越权操作 | 告知用户风险,等待用户显式授权才可执行 | 删除数据库表、群发邮件、修改生产环境配置;不可逆高危操作 |
1.5.2 复杂长任务:任务分解
为什么需要任务分解?
- LLM 上下文窗口有限,单次无法容纳全部中间结果;
- 子任务可以并行执行,提升执行速度;
- 分治策略降低单步出错概率;
- 每个子任务结果能够独立校验。
1.5.2.1 三种任务分解策略
- 顺序分解(Sequential)
任务拆分成存在先后依赖的子步骤,一步一步执行;前一步输出作为后一步输入。
示例:分析论文 →读取 PDF →提取摘要 →查找关键词 →生成报告
适用场景:子任务之间强前后依赖。
- 并行分解(Parallel)
子任务之间互不依赖,可同时分配给多个 Agent 或多线程执行,最后汇总全部结果。
示例:竞品调研,同时搜索 A、B、C 三家公司资料,之后汇总对比。
适用场景:多个独立任务,没有数据依赖关系。
- 层级分解(Hierarchical)
大任务拆成中型任务,中型任务继续拆分更小任务,形成多层嵌套:Planner → Sub‑Planner → Executor。
示例:开发功能 →设计模块 →(设计接口 + 编写单元测试 + 实现代码) →集成测试
适用场景:任务复杂度很高,需要多层规划。
1.5.2.2 企业 Agent 四大共性决策原则
- 最小权限原则:只申请完成当前任务最小权限,不主动扩大权限范围;
- 可撤销优先:优先执行可逆操作(草稿 > 发送、移动 > 删除);
- 透明行动:重要操作向用户展示过程,禁止后台无声执行;
- 人在回路:高风险节点永远保留人类确认入口;Agent 自主决策不等于无监督运行。
1.6 Agent面临的边界挑战与Multi‑Agent展望
1.6.1 挑战一:幻觉传播(循环错误放大)
1.6.1.1 幻觉传播发生流程
- 步骤1:LLM产生幻觉输出(错误事实 / 虚假数据)
- 步骤2:错误 Observation 被写入上下文
- 步骤3:后续所有 Thought 基于错误上下文推理
- 步骤N:最终答案建立在完全错误的基础上
风险说明:幻觉比单次调用更危险,幻觉在循环中被不断「确认」和放大。
1.6.1.2 缓解幻觉的三层策略
| 层级 | 措施 |
|---|---|
| 工具层 | 1. 工具返回值做格式验证,拦截异常输出 2. 高风险工具结果做二次 API 查证 3. 工具调用失败时返回明确错误而非空值 |
| 循环层 | 1. OTAC 的 Check 步骤提前发现矛盾 2. 设置关键事实的「校验点」Prompt 3. 跨轮次检测信息前后一致性 |
| 系统层 | 1. 使用 Retrieval‑Augmented 减少凭空生成 2. 关键输出步骤引入人工审核节点 3. 日志记录每轮 TAO/OTAC,便于事后溯源 |
1.6.2 挑战二:工具滥用与安全对齐
1.6.2.1 三大安全风险
| 风险类型 | 问题描述 | 对策 |
|---|---|---|
| 工具过度调用 | Agent 为「确保结果」频繁调用工具,导致API成本失控(千刀慢剐),或因重复写操作产生副作用。 | 设置工具调用预算(max_tool_calls),并在 Check 阶段判断是否「已足够」,避免冗余调用。 |
| 权限蔓延攻击 | 恶意用户通过 Prompt 诱导 Agent 调用超出授权范围的工具(Prompt Injection / 越权指令)。 | 工具调用白名单 + 上下文沙箱隔离;每次工具调用前验证是否在当前任务的权限范围内。 |
| 不可逆操作风险 | Agent 执行了删除数据、发送邮件、转账等不可撤销操作,且没有提前向用户确认。 | 操作前分类:可逆操作自动执行,不可逆操作强制暂停等待显式授权(人在回路)。 |
1.6.2.2 Agent安全对齐的四个维度
| 维度 | 说明 |
|---|---|
| 意图对齐 | Agent 真正执行的是用户的目标,而不是字面指令(避免目标错位) |
| 行为约束 | 操作边界由权限系统而非 Prompt 决定(不依赖 LLM 的「自觉」) |
| 透明可审计 | 所有工具调用和决策过程可追溯、可解释 |
| 可撤销设计 | 优先选择可撤销方案,为人类干预保留空间 |
1.6.3 从单Agent到Multi‑Agent协作
1.6.3.1 单 Agent 的天花板
- 上下文窗口限制:超长任务中间信息丢失
- 单一能力瓶颈:一个 LLM 无法精通所有领域
- 串行执行慢:复杂任务各步骤无法并行
- 单点故障:一个 Agent 出错,整个任务失败
1.6.3.2 Multi‑Agent角色分工(突破限制)
| Agent角色 | 职责 | 类比 |
|---|---|---|
| Orchestrator(调度Agent) | 总调度Agent,负责任务分解、分配给子Agent、汇总结果 | 项目经理 |
| Specialist Agent(专家Agent) | 只负责单一领域(代码、搜索、写作...),模型和工具针对领域优化 | 领域工程师 |
| Critic Agent(评审Agent) | 专门验证其他Agent的输出,类似OTAC的Check,但由独立Agent执行 | 质检员/审核员 |
| Memory Agent(记忆Agent) | 负责信息检索、存储和压缩,为其他Agent提供统一的知识服务 | 知识库管理员 |
第二部分 实战篇:解析LLM如何调用Tool(ReAct教学项目)
2.1 方式一:手写Prompt实现工具调用
不依赖 API 的 Function Calling 能力,而是在 System Prompt 里和模型约定一种固定的输出格式,程序再用正则把这个格式"翻译"回结构化数据,从而知道模型想调用哪个工具、传什么参数。
| 字段 | 含义 | 由谁输出 |
|---|---|---|
| Thought | 推理过程:分析当前状态,决定下一步做什么 | 模型 |
| Action | 要调用的工具名 | 模型 |
| Action Input | 工具入参(JSON 格式) | 模型 |
| Final Answer | 模型认为信息够了,输出最终答案,循环结束 | 模型 |
| Observation | 工具执行结果 | 程序执行后填回(模型不输出) |
流程如下:
① 调 LLM(带 stop=["Observation:"],让模型停在调用工具前)
↓
② 正则解析输出
├─ 有 "Final Answer:" → 结束,返回答案
├─ 有 "Action:" → 继续
└─ 都没有 → 格式解析失败(unparseable)
↓
③ 程序执行工具 TOOLS_MAP[action](**action_input)
↓
④ 把 assistant 输出 + "Observation: 结果" 追加回 messages
↓
⑤ 回到 ①,循环直到 Final Answer 或达到 max_steps

2.2 方式二:原生Function‑Calling实现工具调用
把"工具说明书"用 JSON Schema 传给 API 的 tools 参数,让模型原生返回结构化的 tool_calls,程序只需消费这些结构,不再自己解析文本。
| 名称 | 作用 |
|---|---|
| tools=TOOLS_SCHEMA | 传入工具列表的 JSON Schema(工具名、描述、参数类型、必填项) |
| tool_choice="auto" | 让模型自己决定:调用哪个工具,或直接回答 |
| finish_reason | 判断模型为什么停:tool_calls = 要调工具,stop = 给答案了 |
① 调 LLM(带 tools=TOOLS_SCHEMA, tool_choice="auto")
↓
② 看 finish_reason
├─ == "stop" → 模型直接给答案,循环结束
└─ == "tool_calls" → 继续 ↓
↓
③ 遍历 msg.tool_calls,逐个执行:
- tool_call.function.name → 工具名
- tool_call.function.arguments → 参数(json.loads 转 dict)
- 执行 TOOLS_MAP[name](**args) → 得到结果
↓
④ 把结果以 role:"tool" + tool_call_id 回填进 messages
↓
⑤ 回到 ①,循环直到 finish_reason == "stop" 或达到 max_steps
