Agent基础
执行循环、工具、状态、恢复和协议
沿着对象与状态理解本章
把模型、宿主、工具画成不同泳道后,问“谁真正改变了文件”就有明确答案。跟踪每条返回消息,再判断需要继续调用模型、执行工具还是结束;不要把模型说完成当成环境已经完成。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
把一个Agent任务拆成真正发生的几轮
同一句用户任务,为什么可能调用模型不止一次?
LLM生成下一步提议,宿主执行获准的动作,把结果再交给LLM。这是外层任务循环;每次模型调用内部还要经历逐Token生成。外层的一轮工具行动不等于内部生成一个Token,两种“循环”不能混用。
输入与适用条件:构造的只读教学任务:文件config.txt含timeout=30。泳道展示职责边界,不声称调用了真实商业API;数据和动作顺序固定。
1 / 8 · 1. 用户任务:读config.txt中的timeout
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
模型尚未看到磁盘文件。先区分用户给的任务与环境真实内容。
未读取默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
模型可以借助工具获得新证据,而不把一切都塞入参数。
怎样实现
按请求、校验、执行、结果回填、继续决策组织循环。
可能的代价与误解
忘记回填工具结果会让模型重复请求;把输出文本当执行证明会误报完成。
如何判断是否做对
对照每轮模型输入和工具日志,确认结果与call_id匹配。
从响应到决策循环
Agent把模型输出连接到真实环境,再把观察交回模型。ReAct研究推理、行动与观察交替;重要启发是行动取得新信息,新信息又修正下一步。它不要求生产系统公开全部内部推理,也不证明链条越长越好。[S052]
最小系统包含模型、工具、状态和循环控制。模型提出动作,程序执行并记录,控制器检查预算、权限和结束。框架封装这些职责,但不能让责任消失。[S053][S055]
# 厂商无关教学伪代码,不是任何SDK的完整接口
while not state.terminal:
context = assemble(task, state, tools)
proposal = model.generate(context)
if proposal.is_final:
verify_before_finish(proposal, state)
break
call = validate_and_authorize(proposal)
result = execute(call)
state.record(call, result)
真实实现还需要超时、取消、重试与持久化。最初可以简单,但副作用和恢复不能只靠模型“记住”。
Workflow与Agent如何组合
已知步骤的流程适合显式编排;依赖新观察才能决定的步骤适合动态决策。固定报表提取不必启用复杂探索;未知Bug调查则可能需要搜索、复现和回溯。两者可组合,外层流程限制阶段与权限,内层Agent探索未知。[S003][S125]
原创判断:在看到观察前,下一步是否已能可靠确定?能确定的部分尽量程序化;需要理解新证据的部分交给模型。任务稳定后,可以把反复有效的方法沉淀为代码和测试,而不是永远重复推理。
工具设计就是操作界面设计
工具要说明用途、输入单位、范围、结果与失败。太细会增加往返,太宽会增加权限和噪声。搜索结果应含路径、片段和截断标识;写入结果应说明实际修改,而非只表示请求已接受。[S058][S132]
search(query, root, glob, limit)比“搜索全部”更易控制。只返回文件名会导致重复读取,返回整个仓库又增加干扰。适当粒度需要按任务验证。
工具执行失败不能用空字符串冒充成功。区分无匹配、无权限、超时和语法错误,才能让模型采取正确恢复动作。自动执行器仍要验证模型参数,不应因为Schema合法就允许任意路径或命令。
对话、执行与环境三种状态
对话状态是可见消息和压缩信息;执行状态是调用、待审批和验证记录;环境状态是真实文件与远端变化。丢失对话不会自动回滚环境,程序重启也不意味着远端动作没发生。
原创例子:创建PR成功,但网络返回丢失。盲目重试可能创建重复PR。应先查询实际状态,再决定重试。幂等键、动作ID和结果查询能帮助处理,不能只写“不要重复操作”。[S062][S142]
Checkpoint保存可恢复点,长期记忆保存可复用知识。二者都持久化,却不是同一对象。恢复后若代码已变化,旧测试通过记录也必须重新判断。
反馈、反思与停止
Toolformer研究在训练中学习工具使用;Reflexion利用语言反馈影响后续尝试。一次会话总结不等于参数训练,模型自我批评也不保证正确。[S056][S057]
“nested_paths测试在输入src/a.py时错误保留”比“请更认真”更可行动。终止状态应包含成功、证据不足、权限缺失、环境失败和预算耗尽,避免模型为交终稿伪装完成。
MCP与A2A的边界
MCP连接Host、Client和Server,区分工具、资源与提示。协议标准化交互,但不保证服务可信、权限继承或模型一定调用。版本、认证与能力协商仍需核验。[S059][S060]
代码执行可先筛选、聚合大工具结果,减少搬进上下文的内容;这需要执行环境与安全边界,并非所有MCP客户端自动支持。A2A关注Agent之间的发现和任务通信,与工具接入不是同义。[S061][S063]
自检:Checkpoint能否撤回已发送消息?不能,恢复状态与撤销副作用不同。多个模型互相同意就可靠?不一定,它们可能共享同一错误前提。
逐项中文讲义
保留拓展阅读目录编号与A/B/C优先级;每项包括机制解释、边界与原创练习。
A5.1 · 推理、行动与观察
对应资料:ReAct
ReAct把推理与行动交替组织,行动获取新信息,观察帮助修正后续判断。它区别于只在固定输入中一直生成答案。
关键是信息闭环,而非必须输出某种长格式。行动可以失败,观察可能不完整,模型应依据真实结果继续,而不是沿原计划假装成功。
ReAct中的观察改变下一步
输入与条件。第一次搜索foo返回无结果。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1推理/行动 | 提出检查符号名与目录 | 不是马上编造foo实现。 |
| 2观察 | 目录列表发现名称为foo_v2 | 获得新证据。 |
| 3下一步 | 读取foo_v2定义 | 行动由观察更新。 |
把过程连起来。循环的价值是接入环境反馈,不是把三种标签写在回答里。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:对一个未知函数错误先搜索,再读定义,再运行最小测试。每一步写出新增事实与被排除假设,指出什么时候没有必要继续探索。
完成标准是能解释行动如何减少不确定性。工具数量和循环轮次不是能力指标,若没有新证据,反复推理可能只是浪费。
拓展阅读目录事实依据 [S052] · 练习与工程推导为本书独立编写。
A5.2 · 构建Agent的实践方法
对应资料:A Practical Guide to Building Agents
实用Agent指南将模型、工具和指令作为基本组成,并讨论何时需要动态决策。Agent适合某些复杂流程,但不是所有自动化都需要LLM控制每一步。
先明确目标与可验证结果,再选择模型和工具。低风险确定步骤可程序化,未知判断交模型,高风险副作用保留边界。
先确定一个最小可交付任务
输入与条件。目标只读报告测试失败原因,不自动修改。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1工具集合 | read/search/test只读或受控 | 不提供提交权限。 |
| 2成功条件 | 定位失败断言与相关代码 | 不能只泛泛建议重试。 |
| 3失败条件 | 测试环境无法运行 | 如实报告缺口并给已取得证据。 |
把过程连起来。从边界清楚的小任务开始,比先搭多角色平台更容易验证。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:将一个工作任务拆成确定步骤与需要理解的新信息,构建最小可行循环。逐项说明新增机制防止哪一种真实失败。
完成标准是有可执行闭环而非复杂架构图。框架和指南提供起点,真正的工具语义、状态和验收仍由应用设计。
拓展阅读目录事实依据 [S053] · 练习与工程推导为本书独立编写。
A5.3 · Agent组件与工作流
对应资料:Agents Documentation
Agent文档组织模型、工具、状态与工作流等能力。产品入口会演进,学习时应关注职责,而非把某一界面的全部名称记成永久标准。
应用需要决定信息来源、工具作用域、失败处理和完成条件。托管能力减少部分基础设施工作,却不自动理解用户业务规则。
计划节点不等于执行节点
输入与条件。计划写“运行测试”,执行日志却没有测试事件。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1计划 | 表示意图 | 不是事实。 |
| 2工具调用 | 产生执行请求 | 也未必完成。 |
| 3结果 | 退出码与日志对应当前版本 | 才是验证证据。 |
把过程连起来。状态机需要明确区分planned/requested/completed。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:为文件调查Agent列出输入、允许工具、状态、输出与异常。再标出哪些交平台、哪些必须自己实现,避免责任空白。
完成标准是理解API调用之外的执行系统。一个模型响应成功只说明某次调用结束,不说明外部目标已达到。
拓展阅读目录事实依据 [S054] · 练习与工程推导为本书独立编写。
A5.4 · 运行器、会话与追踪
对应资料:OpenAI Agents SDK
Agents SDK提供Agent、Runner、会话、交接与追踪等抽象。Runner组织循环,Agent描述配置,工具承担动作;抽象帮助实现,但不能替代需求与安全边界。
会话历史、业务状态与外部环境要分开。SDK保存消息不代表远端副作用可回滚,Trace也不是业务数据库。
同一任务的Runner与Session各持有什么
输入与条件。任务T由runner执行,session保存历史,trace记录时间。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1Runner | 推进调用与工具循环 | 决定何时继续/结束。 |
| 2Session | 保存需要跨轮引用的状态 | 不等于所有外部数据的真相。 |
| 3Trace | 记录调用、工具与耗时 | 用于排查,不自动恢复业务副作用。 |
把过程连起来。运行、持久化与观测不能只用一个“会话”概念代替。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:用纸面接口设计一个只读研究Agent,列出正常结束、无结果、限流和取消路径。先用假模型与假工具测试控制流,再接真实模型。
完成标准是理解框架背后的状态机。不要在尚未定义失败语义时直接堆叠Handoff和多Agent,否则调试会更困难。
拓展阅读目录事实依据 [S055] · 练习与工程推导为本书独立编写。
B5.5 · 在训练中学习工具使用
对应资料:Toolformer
Toolformer研究让语言模型通过训练学习何时以及如何使用外部工具。它属于能力训练路线,不等于给普通模型列几个工具就复现同样机制。
工具可以补充计算与外部信息,但调用是否有益取决于选择、参数和结果解释。模型可能使用工具却仍错误理解返回。
训练工具使用时,外部结果何时进入样本
输入与条件。文本需要精确算17×19,候选工具返回323。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1无工具 | 模型可能猜数 | 错误风险存在。 |
| 2插入调用与结果 | 示例含计算器请求及323 | 后续文本可条件化于真实结果。 |
| 3训练选择 | 比较调用对目标预测的帮助 | 不是所有位置都必须调用工具。 |
把过程连起来。工具学习改变何时/怎样请求外部能力;323由算术验证。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:比较心算、计算器和资料检索三种任务,判断何时工具减少不确定性,何时只是增加往返。设计结果验证,而不只检查调用发生。
完成标准是区分训练得到的工具能力与应用层工具协议。工具使用频率高不是更聪明,关键是必要调用能否改善最终任务。
拓展阅读目录事实依据 [S056] · 练习与工程推导为本书独立编写。
B5.6 · 语言反馈与任务反思
对应资料:Reflexion
Reflexion利用任务反馈形成文字反思,影响后续尝试。外部经验可以在不更新参数时改变行为,但反思文本本身可能错误。
失败总结应关联实际观察,而非泛泛“下次更仔细”。如果根因判断错,反思可能把错误固化为后续规则。
反思必须保留失败的具体原因
输入与条件。上次修复仍用startswith,ab反例失败。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1记录反馈 | ab不属于a目录却被排除 | 具体证据。 |
| 2形成改进 | 改为目录边界判断 | 行动针对真实失败。 |
| 3下轮验证 | 重跑ab反例与子目录正例 | 不是只写“以后更仔细”。 |
把过程连起来。可复用反思应产生可测试的行为变化。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:对测试失败分别写一条有证据的经验和一条未经证实的猜测,标记它们的状态。下一次相似任务先验证适用条件再使用。
完成标准是把反思当待验证知识而非自我认证。重复生成相同总结也不形成独立证据,多轮反思不一定比一次实际测试更有效。
拓展阅读目录事实依据 [S057] · 练习与工程推导为本书独立编写。
A5.7 · 面向Agent设计工具
对应资料:Writing Effective Tools for Agents
工具设计要让模型知道用途、边界、输入单位和返回语义。名称模糊、参数重叠或结果冗长会增加误用与上下文成本。
过细工具导致多次往返,过宽工具扩大权限并难验证。应围绕典型任务提供适当粒度,并清楚报告截断和失败。
工具返回10000行还是10条带来源结果
输入与条件。任务需要最近失败的构建记录。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1筛选 | 服务端限制相关状态与时间 | 减少无关内容。 |
| 2返回 | 10条记录附ID、时间、错误、截断标记 | 仍可回取原文。 |
| 3不足 | 用户需要更早记录 | 分页或按ID补取,不谎称已给全部。 |
把过程连起来。压缩工具输出的关键是保留任务信息和恢复入口。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:比较返回所有日志与返回相关错误、命令、退出码和完整日志位置的工具。检查模型是否仍能追溯原证据,是否减少重复读取。
完成标准是用任务成功和误用率评价接口,而非只看函数签名美观。工具描述不能替代执行器对路径、参数和副作用的实际检查。
拓展阅读目录事实依据 [S058] · 练习与工程推导为本书独立编写。
A5.8 · MCP的作用与边界
对应资料:MCP Introduction
MCP为模型应用接入外部能力提供标准化交互。它不是一个模型,也不是所有工具必然可用的保证,更不自动解决授权。
客户端必须支持协议和能力,服务器必须提供实现,Host决定如何向模型暴露。连接成功与模型真正调用是不同状态。
装上MCP服务器不等于模型已经能用
输入与条件。服务器启动成功并监听本地端口。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1连接 | 客户端完成协议初始化 | 只是通路建立。 |
| 2发现 | tools/list取得工具定义 | 模型未必收到。 |
| 3暴露授权 | 宿主挑选本轮允许的工具 | 此后才可能生成可执行提议。 |
把过程连起来。连接、发现、可见和授权是四道不同门。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:画本地Agent、MCP客户端和文件服务器之间的关系,标出发现工具、发起调用和返回结果。再模拟服务器可访问但工具未暴露的情况。
完成标准是能定位连接、能力发现、权限和模型选择分别在哪层失败。不要把“支持MCP”当作一项能自动提升所有任务的模型能力。
拓展阅读目录事实依据 [S059] · 练习与工程推导为本书独立编写。
A5.9 · MCP主机、客户端与服务器
对应资料:MCP Architecture Overview
MCP架构区分Host、Client与Server,并组织工具、资源与提示等原语。工具执行动作,资源提供内容,提示提供可复用交互结构,职责不同。
协议版本、传输、认证和能力协商可能影响互操作。服务端返回的数据仍需按可信边界处理,不因通过标准协议就成为高优先级指令。
Host、Client、Server各自处理哪条消息
输入与条件。编辑器内运行Agent,要读MCP文件服务。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1Host | 管理用户任务与模型 | 决定是否提供工具。 |
| 2Client | 维护协议连接与请求ID | 发送tools/call。 |
| 3Server | 执行已授权读取并返回 | 不自动决定用户整体任务。 |
把过程连起来。协议角色与LLM角色不是一对一同义词。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:为一个代码文档服务选择哪些作为资源、哪些作为搜索工具、哪些只是提示模板。再明确用户允许读取不等于允许写入。
完成标准是理解协议如何降低集成摩擦,同时识别它不负责业务正确性、数据新鲜度和安全授权的全部问题。
拓展阅读目录事实依据 [S060] · 练习与工程推导为本书独立编写。
B5.10 · 通过代码组合工具
对应资料:Code Execution with MCP
通过代码执行组合MCP工具,可以在执行环境中筛选、聚合大结果,再把必要信息交给模型。这减少上下文搬运的思路不等于所有客户端自动支持。
执行代码增加灵活性,也增加环境、权限与调试负担。不能因为少传Token就忽视脚本错误或敏感数据流向。
用代码组合三次查询,哪些数据不必进模型
输入与条件。程序取3页数据,每页100条,只需统计failed数量。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1代码执行 | 在受控环境拉取与遍历 | 300条不必全部转成对话。 |
| 2聚合 | failed计数分别2、3、1 | 总6。 |
| 3反馈 | 返回6、查询范围及错误/分页状态 | 不能漏掉某页失败还称完整。 |
把过程连起来。确定性聚合可减少上下文,但环境权限、来源和完整性仍须保留。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:假设工具返回一万条记录,比较全部传模型与先程序筛选相关项。保留查询条件、计数和原始结果位置,避免过滤后无法审计。
完成标准是同时评价信息保留、程序正确性与成本。代码聚合是工程选择,不应被写成无需验证的万能压缩方式。
拓展阅读目录事实依据 [S061] · 练习与工程推导为本书独立编写。
B5.11 · 检查点、恢复与状态持久化
对应资料:LangGraph Persistence
持久化与Checkpoint保存执行状态,使中断后可以继续。它不自动复制所有环境,也不等于外部副作用回滚。
恢复需要知道保存点对应哪个代码版本、哪些动作已发生、哪些只是计划。网络超时后若远端操作已成功,重试可能重复。
检查点后追加的事件也要恢复
输入与条件。检查点记录到10,随后事件11写成功,12测试通过。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1加载点 | 先恢复状态10 | 不能直接当最新。 |
| 2应用后缀 | 重放11/12到本地状态 | 得到最新已验证状态。 |
| 3外部操作 | 不因重放11再写一次文件 | 重放与重执行分离。 |
把过程连起来。恢复等于检查点加未包含事件,不是只读一份摘要。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:模拟创建记录后响应丢失,设计动作ID、状态查询和幂等策略。恢复时先核查事实,不把“没收到成功”当“没执行”。
完成标准是区分消息历史、控制状态和真实环境。选择持久化库不能替代对重放、取消、并发和副作用语义的设计。
拓展阅读目录事实依据 [S062] · 练习与工程推导为本书独立编写。
C5.12 · 跨Agent通信协议
对应资料:Agent2Agent Protocol
A2A面向Agent之间的发现、任务与消息交互。它与MCP工具接入有不同重点,不是给同一协议换个名称。
跨系统协作还要处理任务状态、权限、身份、结果和失败。标准消息结构不保证对方Agent的结论正确或执行符合本地要求。
跨Agent收到结果不等于结果可执行
输入与条件。Agent B返回“部署v8”,父任务只允许研究。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1协议层 | 消息传输与身份关联成功 | 通信完成。 |
| 2业务层 | 检查是否在原任务范围 | 研究不授权部署。 |
| 3结果使用 | 把建议作为参考,不执行写操作 | 父级承担权限与整合责任。 |
把过程连起来。A2A互操作不替代授权和真实性判断。
边界与反例。本表是独立教学构造,用来解释该研究主题的一个局部机制,不是原论文实验或产品实测;完整方法与适用条件仍需结合本节正文。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
原创练习:一个研究Agent委派另一个Agent处理独立材料,明确输入范围、返回证据和结束状态。再模拟超时、部分完成与拒绝授权。
完成标准是因真实互操作需求选择协议,而不是为单进程小任务增加跨服务架构。协议解决通信契约,业务验收仍需自己定义。
拓展阅读目录事实依据 [S063] · 练习与工程推导为本书独立编写。