主题
2.4 Agent 机制与运行原理:给大模型装上眼睛、双手与规划大脑
读菜谱的人能够告诉你步骤,实际做饭的人还要检查食材、开火、尝味道,并根据结果调整。模型与工具执行系统的关系可以这样理解:模型参与判断,程序负责行动,执行结果再成为下一步判断的依据。
本节比较的是单次模型调用与带工具循环的应用。网页聊天产品也可能接入搜索和代码执行,不能仅凭界面判断它是不是智能体。
智能管家做大餐:一图看懂 Agent 运作机制
普通大模型 与 Agent:到底差在哪?
| 对比维度 | 普通大模型(LLM) | Agent(智能体) |
|---|---|---|
| 生活比喻 | 提供建议的顾问 | 自己动手的智能管家 |
| 能力边界 | 生成文本或其他受支持的输出 | 能“说”更能“做”(调工具、跑代码、改文件) |
| 是否联网 | 只靠训练时的记忆,不会实时查 | 可实时搜索、调用网络 API |
| 记忆能力 | 每次对话相对独立,容易“失忆” | 可配置会话状态或长期存储,并非自动具备 |
| 自我纠错 | 答错了就错了 | 根据反馈重试或调整,也可能失败并停止 |
| 典型代表 | ChatGPT 网页版纯聊天 | Claude Code、Cursor Composer、Devin |
💡 一句话总结:大模型是“军师”,Agent 是“军师 + 手脚 + 记忆 + 复盘”的完整作战单元。
Agent 高级思考流派:CoT、ToT 与 ReAct
在 Agent 自主解决问题时,有三种最主流的思考架构:
1. 思维链 CoT(Chain of Thought / 草稿纸模式)
- 做高考数学大题。如果直接心算容易出错,但在草稿纸上一行一行写下推导步骤
因为 A=B,所以 C=D,可以把中间步骤拆开检查,但效果依任务而定。
2. 思维树 ToT(Tree of Thoughts / 脑内沙盘推演)
- 专业棋手下围棋。面对一个局面,脑海中同时模拟走法甲、走法乙、走法丙。推演到第 3 步发现走法乙会导致丢大子,立刻在脑中“剪枝放弃”,最终选择胜率最高的走法甲。
3. ReAct(Reason + Act / 试错自愈模式)
- 炒菜调味。大厨不会只凭空推算放多少克盐,而是加一小勺盐(行动),用舌头尝一口(观察),发现还是偏淡(思考),再补加一小勺(自愈修复),直到咸淡刚好。
ReAct 的运行细节:三步循环伪代码
下面的伪代码概括一类常见的工具循环,不代表所有产品都采用同一实现:
# ReAct 循环伪代码:想想再动手,动手再想想
while 任务未完成 且 未超过步数、时间与费用限制:
思考 Thought: 根据当前信息,决定下一步做什么
行动 Action: 调用某个工具(或直接给出回答)
观察 Observation: 拿到工具返回的真实结果(成功 / 报错)实战示例:让 Agent 修一个报错
| 轮次 | 思考 Thought | 行动 Action | 观察 Observation |
|---|---|---|---|
| 第 1 轮 | 页面报 500,先看后端日志 | 运行 tail -n 100 server.log | 日志显示数据库连接超时 |
| 第 2 轮 | 可能是数据库没启动 | 运行 systemctl status mysql | 数据库进程确实未运行 |
| 第 3 轮 | 启动数据库并重测接口 | 运行 systemctl start mysql && npm test | 测试全部通过 ✅ |
💡 这就是 Agent 能“自我修复”的秘密:它不是一次性背出答案,而是把“猜测 → 验证 → 修正”循环跑很多遍,并结合验收条件决定结束;重复失败时应停止或请求补充信息。
Agent 的模型、状态、工具与反馈
┌─────────────────────────┐
│ 1. 核心大脑 (LLM) │
│ (规划/推理/拆解目标) │
└────────────┬────────────┘
│
┌───────────────────────┼───────────────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 2. 记忆系统 │ │ 3. 工具箱 │ │ 4. 环境反馈 │
│ (短期/长期记忆) │ │ (终端/API/文件) │ │ (执行输出/报错) │
└─────────────────┘ └─────────────────┘ └─────────────────┘- 核心大脑(Planning):负责把“我要上线一个商城”这样的大目标,拆解成 20 个井井有条的执行步骤;
- 记忆系统(Memory):记住主人喜欢吃几分熟、记住上次哪个步骤失败了;
- 工具箱(Tools):拥有操作系统的权限,可以自己读写本地文件、执行命令行、调用网络 API;
- 环境反馈(Observation):工具执行后的真实返回值(终端报错、网络返回代码),能让 Agent 当场看清现实,不做无头苍蝇。
工具调用(Function Calling):Agent 怎么让“手脚”听话干活?
四大支柱里的“工具箱”具体是怎么工作的?靠的是 Function Calling(函数调用 / 工具调用):
- 递小票——大厨(模型)不亲自去仓库拿菜,而是写一张标准点单小票(工具名 + 参数),交给跑腿小哥(程序)去执行。
- 模型并不能真的执行命令,它只负责“下指令”。当它决定要用工具时,会输出一段结构化 JSON(工具名 + 参数),由外围程序代为执行,再把真实结果回传给模型继续思考。
json
{
"tool_name": "run_command",
"parameters": {
"command": "npm test",
"timeout": 60
}
}💡 流程:模型输出小票 → 程序执行
npm test→ 把 stdout/stderr 作为“观察 Observation”传回模型 → 模型看到结果继续规划下一步。模型负责聪明,程序负责执行。
Agent 的失败情况与三道安全护栏
Agent 能力越强,出错的破坏力也越大,这些场景你迟早会遇到:
| 失败情况 | 生活比喻 | 防护手段 |
|---|---|---|
| 死循环 | 扫地机器人原地转圈 | 设置最大步数 / 超时熔断,跑不完就强制停止 |
| 预算失控 | 出租车计价表狂跳 | 设置预算上限 + 消耗告警,超额自动暂停 |
| 越权操作 | 管家乱动你的银行卡 | 权限最小化:只给需要的那几个工具,别给全部权限 |
| 幻觉放大 | 越自信越敢瞎编 | 关键信息走 RAG 检索 + 工具核实,别让模型凭空编造 |
🛠️ 这些防护手段,正是后续 2.11 章 Harness 工程(赛车底盘) 要重点解决的内容——给 Agent 装上“方向盘限位、刹车与保险杠”。
计划、执行和完成判断如何配合
假设任务是“把目录里的笔记整理成索引”。计划可以先列出读取文件、提取标题、生成目录、检查链接四步。执行时发现有文件没有标题,智能体就需要按照事先约定使用文件名,或者报告缺失,而不是悄悄跳过。
计划是一份可以调整的工作安排,不是正确性的证明。每一步还需要产出:读到了哪些文件,提取了多少条记录,有哪些例外。最终是否完成,应根据输入文件与输出索引逐项核对。
| 应结束的情况 | 应交付什么 |
|---|---|
| 目标已经满足 | 成果、修改说明与验证结果 |
| 缺少必要信息 | 缺少的具体字段,以及已完成的部分 |
| 依赖暂不可用 | 实际错误和可重试条件 |
| 同一步骤反复失败 | 已尝试的方法、失败依据与下一步建议 |
| 达到预算或时间限制 | 当前进度、保留的中间结果与剩余工作 |
工具执行成功,不等于任务完成
文件写入工具返回成功,只能证明文件写到了指定位置;索引中的链接是否正确、标题是否重复、输入是否遗漏,还需要另行核对。同样,测试命令退出成功,也要确认它确实发现并运行了预期测试。
智能体需要区分“动作完成”和“目标达成”。这一点像寄包裹:柜台收件不等于收件人已经拿到包裹,不能用前一个事件替代后一个事件的证明。
固定流程与自主选择怎样取舍
报销表格式校验、字段转换等规则稳定的工作,通常可以先用固定流程实现。需要根据检索结果决定下一步、处理多种未知情况的任务,才更适合开放更多自主选择。
CoT 是一种分步推导思路,ToT 涉及候选路径的搜索与评估,ReAct 强调推理与行动反馈的结合;它们不是互斥的三款产品,也不是每个智能体都必须配齐的组件。可以对照 CoT 论文、ToT 论文和 ReAct 论文理解各自研究的问题。