2026年讨论Agentic AI,大家基本不再纠结“能不能做出来”,而是盯着一件事:做出来之后,快不快、稳不稳、省不省。我刷到的这份综述来自9所高校的联合研究团队,把高效智能体的核心收敛到了记忆、工具、规划三条线上,等于把散在各处的Agent实践做了一次系统梳理。这篇文章我就围绕这份综述展开,讲讲这三个方向到底在解决什么问题、工程上怎么落地、以及我在实际调试Agent应用时踩过的坑。适合正在做Agent应用、做技术选型,或者单纯想搞明白Agentic AI未来走向的朋友读。
1. 先搞清楚这份综述在解决什么问题
1.1 为什么2026年大家集中讨论“高效”这个词
过去两年做Agent,大家普遍是拿大模型API拼一个能跑通的Demo,任务能完成就已经很兴奋。但到了2026年,情况完全变了。任务复杂度和业务真实度上来了,一个Agent系统跑一次长任务,调用次数可能几十次甚至上百次,模型推理成本、Token消耗、延迟、失败重试带来的损耗,全部变成账面上的真金白银。我自己调试过一个多步骤信息整理类Agent,最初版本只追求功能正确,结果一次完整任务下来Token消耗是手工拆解任务的三倍还多,效果却没明显更好。这其实就是“效率”问题:同样的任务,能不能用更少的资源完成,能不能更稳定地完成,能不能在出错之后快速恢复而不是从头再来。
综述把“高效”拆成了三个观察维度:成功率、资源开销、鲁棒性。这个视角很务实。只看成功率,你会忽略成本爆炸的风险;只看成本,你又可能牺牲任务完成质量。鲁棒性则是另一个容易被忽视的维度——一个Agent在理想环境下表现好,但环境一变、输入一变就崩溃,在真实业务里没有价值。所以综述讨论的记忆、工具、规划,本质上都是在为这三个维度服务。
这份综述的另一个价值在于,它把研究视角从“换一个更大的模型”转移到了“改一层更聪明的外围系统”。这是2026年一个非常重要的认知变化。基座模型的边际提升越来越小,但Agent的外围架构——怎么记忆、怎么调工具、怎么规划——还有很大的优化空间,而且这些优化是应用层可以直接干预的,不需要动模型权重。对一个做应用的团队来说,这是性价比最高的发力点。
1.2 三大方向的选型逻辑:为什么偏偏是记忆、工具、规划
智能体的核心运行逻辑,其实可以压缩成一句话:观察环境、思考方案、执行动作。对应到系统组件上,就是记忆负责记住观察到的信息,规划负责思考方案,工具负责执行动作。这三样东西形成一个闭环:环境信息进入记忆,规划模块基于记忆做出决策,决策通过调用工具落地,工具返回的结果又写回记忆,开启下一轮循环。
所以综述选这三个方向,并不是随便挑的。它们是Agent系统得以运转的三根支柱,任意一根薄弱,整个系统都会出问题。记忆弱,Agent就像个健忘症患者,上一轮查到的重要信息下一轮就丢了;工具弱,Agent就只是个会说话的聊天框,没法真正改变外部世界;规划弱,Agent想得再好也执行不下去,拆出来的步骤要么太粗要么太乱。
还有一个工程上的原因:这三个方向都是应用层可以直接干预的。模型能力不足你可以换模型,但记忆、工具、规划是在模型外围搭建的,用什么存储、怎么注册工具、按什么策略规划,全都取决于你写的那套代码。这意味着哪怕你手里的模型不是最强的,只要这三层搭得好,你的Agent也能做出远超模型原生能力的效果。我在实际项目里深有体会:同一个模型,换了一套更合理的工具编排和记忆策略之后,任务成功率能上去一大截。
1.3 这份综述适合谁,读之前要有什么基础
我个人判断,这份综述最适合两类人。一类是正在做Agent应用开发的人,你大概率已经踩过记忆丢失、工具乱调、规划死循环这些坑,读这份综述能让你把这些零散的教训串成体系。另一类是做技术选型或者写方案的人,Agent项目立项时,你总得回答“用哪套思路来做”这个问题,这份综述可以直接作为方法论参考。
基础要求不高。你知道大模型API是怎么调的,知道Prompt大概是怎么回事,了解过类似ReAct这样的Agent工作流,读起来就不会有障碍。不需要你会训练模型,也不需要你懂复杂的强化学习。综述里涉及的一些偏研究性的概念,我也会在下面尽量用工程化的语言讲清楚,不会让整篇文章飘在理论上。
2. 记忆:让智能体不再“每次重新认识世界”
2.1 短期记忆和长期记忆的分工与代价
记忆这块,综述里最核心的一个观点是:把“上下文窗口”和“记忆”分开看。上下文窗口是当前任务进行中使用的工作台,所有正在处理的信息都摊在上面,模型可以随时读到。但窗口有长度限制,费用也不便宜,你不可能把任务的所有历史都一直堆在里面。所以必须有长期记忆——一块存在模型之外的存储区,可以是向量库、数据库,也可以就是普通文件。长期记忆的作用,是让Agent跨任务、跨轮次保留经验,下次遇到类似场景时不用从零开始。
这个短长期分工,本质上是在做成本权衡。短期记忆贵但快,适合保存任务中正在处理的信息;长期记忆便宜但访问有开销,适合沉淀跨任务的结论性知识。我见过不少失败的Agent设计,就是不懂得做这个区分:要么把所有历史全部塞进上下文,导致Token爆炸;要么把有价值的信息随手丢进向量库,但检索策略一塌糊涂,查出来的全是噪声。这两种情况都会让Agent在同一个坑里反复摔跤。
综述里提到的理想状态是:Agent能自己判断什么信息值得长期记住,什么信息用完即弃,什么信息需要从长期记忆中检索回来。这个判断能力本身很难做到完美,但通过合理的读写策略,可以做到八九不离十。
2.2 记忆的读写机制与结构化存储
记忆模块的工程实现,关键在读写两侧。写的时候要克制,读的时候要精准。
写侧最常见的问题是“什么都存”。工具返回的原始内容、模型中间推理过程、用户的每一句话,全都往长期记忆里塞,结果就是记忆库变成一个巨大的垃圾场,检索时什么都能捞出来,但哪一条都不准确。综述建议的写策略是:只保存对后续决策有影响的信息。具体来说,任务里程碑、工具调用的关键结论、用户明确表达的偏好,这类信息要写;无关闲聊、重复中间结果、临时计算过程,这类不写。
读侧的关键是检索策略。纯向量相似度检索只能处理“语义相似”的问题,但Agent的记忆需求往往是复合的:既要考虑语义相关性,也要考虑时间的近远、重要性的高低。综述里提到的改进方向是用加权混合检索,把时间衰减、重要性权重、语义相似度结合起来排序。我在实践中的做法是给每条记忆打标签,检索时按任务类型过滤,效果比单纯靠向量相似度好得多。
另外,综述特别强调了一个容易被忽视的点:记忆不一定都要用自然语言存。结构化的方案,比如关系表、键值对、事件流,往往比一段自然语言更好用。自然语言记忆适合给模型“阅读”,但当你需要精确统计、去重、按条件过滤时,结构化的优势就显现出来了。好的记忆模块通常会做一个分层设计:顶层用向量库存自然语言摘要,底层用数据库存结构化事实,两者配合。
2.3 实操中记忆模块的配置要点
这块我多说点实践经验。首先,记忆不是越大越好。我给一个客服类Agent做过记忆模块,一开始设了超大的记忆容量,什么对话历史都留着,结果检索回来的内容里大半是无关的闲聊,模型反而被带偏了。后来加了过期时间,超过一定时长的记忆自动降权,问题立刻缓解。记忆一定要有生命周期概念,区分短期驻留和长期归档。
其次,多轮任务的中间结果,强烈建议用结构化方式保存。比如一个调研类Agent,需要分多轮收集资料,每一轮查到什么结论、信息来源是哪里,用字段拆开存,比一长段自然语言好使。因为后续规划模块在决定下一步做什么时,需要的是精确的数据点,而不是一大段描述。
第三点很关键:隐私和权限边界。记忆是Agent系统里最容易触碰数据红线的地方。写入长期记忆之前,要明确哪些信息允许存、哪些必须脱敏、哪些根本不允许落盘。很多人在做Demo时忽略这一点,但一旦上了生产环境,这可能是最致命的问题。
注意:记忆写入一定要设计去重机制。我见过一个Agent因为同一个工具结果被写入了三次,导致后续每一次检索都重复返回同一份信息,规划模块被干扰得来回摇摆。简单的哈希校验就能解决,别省这一步。
3. 工具:从“会聊天”到“会办事”的关键一跃
3.1 工具调用的三种模式与标准协议的作用
Agent能不能真正“办事”,靠的就是工具。综述里梳理了工具调用的几种典型模式:第一种是让模型在文本输出里声明要调用哪个工具并给出参数,由运行时代理解析执行,ReAct是这类模式的代表;第二种是模型侧做了专门对齐的Function Calling,模型会输出结构化的调用请求,参数解析更稳定;第三种是通过标准协议统一注册和发现工具,让Agent在不预知全部工具的情况下按需查找并使用。
第三种是这两年工程界比较关注的方向,类似MCP这类思路。它的价值在于:工具不再是“写死在代码里的函数”,而变成了一套可注册、可发现、可鉴权的服务。想象一下,你给Agent接一个搜索功能,以前要写专用代码,工具多了之后每加一个就要改一遍调度逻辑;如果有标准协议,新工具只需要按规范注册一下,Agent通过描述就能知道它是什么、能干什么、参数怎么传。
我自己的体会是,工具侧的效率瓶颈,很大程度不在模型能不能理解工具描述,而在工程侧的编排是否顺滑。模型调用工具的泛化能力已经很成熟,真正让人头疼的是工具越来越多之后,选择哪把工具、参数怎么对齐、出错了怎么恢复,这些全是工程问题。
3.2 工具选择的策略:选得准,调得快
工具数量少的时候,把全部工具描述放进Prompt里让模型挑就行。但工具一旦超过十几个,你会发现两个问题:一是描述太长挤占上下文空间,二是模型选择工具的准确率开始下降。综述提到的解法是工具检索:给每个工具写一段语义描述,先把描述向量化,模型需要执行动作时,先在向量库里检索出最相关的一小批工具,再把它们的描述放进上下文让模型精确选择。这很像人类查字典,先定位到大概的页码,再去精读具体词条。
另一个提升效率的点是并行调用。Agent在一次决策中可能需要执行多个互不依赖的工具,如果按顺序一个个调,延迟就是N倍。我在系统里会把当前所有待执行的工具调用做依赖分析,没有依赖关系的放进一个批次并发执行,整体耗时有明显下降。
还有个容易被忽视的细节:幂等设计。工具一定要能安全重试。网络超时中断重试是常态,如果工具不是幂等的,重试就会产生副作用——比如一个“支付”类工具重复调用就出大事了。我习惯给关键工具加请求ID,同一个ID重复执行直接返回上一次结果,这能省掉大量重试造成的麻烦。
3.3 工具组合的工程问题:参数对齐、错误恢复、权限边界
真正的Agent应用很少只调一个工具。多工具组合使用时,第一个要处理的是参数对齐。上游任务的结果是一套数据结构,下游工具接收的可能是另一套字段,中间这层映射关系需要你提前设计好,而不是指望模型每次都能自己做对。我的做法是给每个工具定义严格的输入Schema,同时在调度层写一个转换器,把通用任务状态里的字段映射到工具参数。
错误恢复则更考验设计。工具返回异常信息时,直接把堆栈或者错误码抛给模型,效果很差。模型不理解你的系统内部异常是正常的,你应该把工具错误翻译成模型能理解的语义:比如“搜索服务超时”翻译成“暂时无法获取外部信息,可以重试或改用本地数据”。这样才能让模型基于错误做出合理决策,而不是陷入无从下手的状态。
权限边界是很多人做Demo时不考虑,但做交付时绕不开的问题。给Agent分配工具权限时,一定要遵循最小权限原则。一个只需要读数据库的Agent,绝不给它删除或写入的权限;一个需要调用外部服务的Agent,要对它可以访问的地址、操作类型做严格限制。我见过因为没有做权限隔离,Agent在一次自主探索中调用了不该调用的接口,后面排查时非常被动。工具层面加一层沙箱执行或者审批机制,看起来多一道手续,但长远看能救你很多次。
实操心得:与其让模型临场发挥去组合工具,不如把高频出现的工具组合预先做成工作流模板。举个例子,一个“查询订单状态”的Agent,你提前把“身份验证—订单查询—结果格式化”三个工具串成一个模板,模型只需要填参数。这样既稳定又省钱,因为模型不需要每轮都重新规划整个调用链。
4. 规划:把“想做什么”拆成“怎么做到”
4.1 单次规划与循环规划怎么选
规划模块负责把任务拆解成可执行的步骤。综述里区分了两种典型路线:单次规划和循环规划。单次规划是模型接到任务后一次性输出完整计划,然后Agent按计划逐步执行,中间不回头重新规划。这种方式的优点是省Token、响应快、可解释性强,缺点也很明显:计划一旦在中间环节偏离现实,就一错到底,没有修正机会。
循环规划则是每执行几步就暂停一下,结合当前最新状态重新评估计划,必要时调整后续步骤。这种方式的容错率明显更高,代价是每次重规划都要额外调用模型,成本和延迟都会上升。综述的一个新角度是“规划的粒度控制”:不是所有任务都需要细粒度规划,也不是所有任务都应该粗粒度推进。简单任务一次规划到底,复杂任务细粒度循环调整,最理想的状态是Agent能自己判断当前任务的复杂度和不确定性,动态切换规划密度。
我自己在项目里用的策略是:先做一次粗粒度规划,把大阶段分出来,然后每个大阶段内部再根据执行情况决定是否细化。这样既不会在简单任务上浪费太多规划开销,也不会在复杂任务上因为计划过粗而失控。
4.2 反思式重规划与基于反馈的重规划
规划这块,综述里最有价值的讨论我认为是关于“重规划”的两种触发方式。第一种是反思式重规划:Agent在执行过程中发现自己走错了路,比如某个步骤连续失败、某个假设被推翻,它会停下来总结失败原因,调整计划再出发。这类做法的核心是让模型充当自己的复盘者,把失败经验转化成新的规划依据。第二种是基于外部反馈的重规划:执行结果出来以后,环境会返回新信息——工具结果、报错信息、用户意见——Agent根据这些外部反馈判断原计划是否还成立。
这两种方式在实际系统中往往一起用。反思式重规划解决的是“内部认知偏差”,基于反馈的重规划解决的是“外部现实变化”。一个完整的Agent循环里,每执行一个关键步骤,都应该先看一眼反馈,再决定是继续原计划、微调计划还是彻底重来。
综述里提到的一个设计思路我特别认可:把计划本身当成数据来管理。也就是说,计划不是一次生成之后就固定不变的文本,而是一个可以被读取、更新、局部替换的结构化对象。计划里每个步骤有状态、有依赖关系、有执行结果;某一步出错了,只需要局部更新受影响的步骤,而不是整份计划推翻重来。这种做法能省下大量Token,也让整个Agent的行为更容易追踪。
4.3 规划失败时最常见的几类问题
规划模块出问题,通常不是模型能力不够,而是设计上埋了雷。我把踩过的坑梳理一下。
第一个坑是规划过于乐观。模型很喜欢输出一份看起来非常完美的计划,但实际执行时发现很多步骤卡在细节上,比如某个工具返回的数据格式和你预期的不一致、某个外部服务突然不可用。这类问题,单靠规划模块解决不了,需要配套的错误容错机制——计划里要预留“如果这一步失败,就怎么做”的兜底选项。
第二个坑是规划过于抽象。模型输出的步骤像“调研市场情况”“分析用户需求”这样的大话,执行时根本没法转化成具体的工具调用。解决方法是给规划模块强约束:每一步必须关联至少一个可执行的动作或工具,第一时间在规划阶段就把不可执行的抽象步骤过滤掉。
第三个坑是上下文污染。随着任务推进,计划文本加上各步的执行结果,占用的token越来越多,到最后模型反而找不到关键信息了。处理方式是做计划压缩:已经完成的步骤折叠成一行摘要,只有未执行的步骤保留详细描述。
注意:写规划Prompt时,给模型一个明确的输出模板,比如要求每一步必须是“动作+对象+预期结果”的结构,并用JSON返回。自由文本规划看起来自然,但解析可靠性和后续状态跟踪都很费劲。结构化输出是让规划模块真正可用的前提。
5. 三大方向的耦合:好的Agent是一个系统工程
5.1 记忆×规划:先想后记,还是先记后想
记忆和规划不是两个独立的模块,它们的配合顺序直接影响Agent行为质量。我总结的循环是:规划之前,先检索记忆——看看以前有没有做过类似任务、目前任务进行到了哪一步、有没有已知的坑;执行之后,把新经验写入记忆——这次的教训是什么、哪个工具有效、哪个参数组合不可行。
这个“检索-规划-行动-沉淀”的循环,是记忆与规划耦合最理想的状态。很多Agent设计失败,是因为忘了“先查再想”。它们接到任务直接开始生成计划,完全不看历史经验,结果就是同一个错误反反复复,浪费一轮又一轮的模型调用。反过来,如果只记不想,记忆库里的信息永远是死数据,从不参与决策,那记了也白记。
我在实际调试中观察到一个很有意思的现象:当记忆模块工作正常时,规划模块的首次步准确率会明显提升,因为模型在做计划时有了参照物,而不是全靠脑补。这本身就是一个很好的可观测指标——如果你发现Agent的规划质量忽高忽低,先去看看记忆模块是否正常工作。
5.2 工具×记忆:工具结果要不要写回记忆
工具执行完之后的结果,是暂时用一下,还是存起来以后再用?综述的观点是:分情况。工具返回的原始结果,量大、噪声多,适合放进短期记忆,供当前任务后续步骤使用;但从中提炼出来的结论性信息,比如“这个接口对某类请求不支持”,值得沉淀到长期记忆,避免下次重复踩坑。
这里有一个关键技巧:写回之前一定要清洗。工具返回的原始内容直接入库是很大的陷阱,我踩过。搜索结果里掺杂的广告、日志格式的干扰信息、接口返回的冗余字段,都会成为之后检索时的噪声源。正确做法是让模型做一次轻量提取,只把“对以后有用的结论”转成结构化字段存下来。
另一个我实践后觉得很有用的点:工具结果写回短期记忆时,如果有内容指纹,可以先做一次哈希判断,确认和已有记忆不重复再写。连续搜索场景最常见的问题就是反复搜索得到同样的结果,结果每条结果都被当成新记忆写入,污染严重。去重之后,Agent在后续决策时拿到的参考信息干净得多。
5.3 一个简化落地示例
综合三者的耦合关系,最核心的Agent循环用伪代码看会更清楚:
state = init_state(task) while not is_task_finished(state): # 1. 从记忆检索与当前任务相关的历史经验 context = memory.recall(query=state.task_desc, top_k=5) # 2. 基于历史经验和当前状态生成/更新计划 plan = planner.make_plan(state=state, memory_context=context) # 3. 按计划执行步骤,需要时调用工具 for step in plan.get_pending_steps(): if step.require_tool(): result = tool_runner.execute(tool_name=step.tool, args=step.args) # 4. 工具结果先进入短期状态,供后续步骤参考 state.update_step_result(step_id=step.id, result=clean_step_result(result)) else: state.update_step_result(step_id=step.id, result=reasoner(step)) # 5. 检查是否需要重规划 if planner.should_replan(state): plan = planner.replan(state) break # 6. 每完成一个里程碑,沉淀结论性信息到长期记忆 for milestone in plan.get_completed_milestones(): summary = summarize_milestone(milestone, state) memory.commit(entry=summary, tags=milestone.tags)这个伪代码里,第1步是记忆读取,第2步是规划,第3-5步是工具执行与反馈驱动的重规划,第6步是记忆写入。看到没,三者的关系是环环相扣的:没有记忆,规划就没有参考;没有规划,工具调用就散乱无章;没有工具,记忆和规划都只能停留在空想层面。工程上把这三层循环搭好,Agent的基本盘就稳了。
6. 实践中的高频问题与排查笔记
6.1 问题速查表
我在调Agent应用时,反复遇到过一些典型问题,整理成一张速查表,按排查顺序排列:
| 现象 | 可能原因 | 排查顺序 | 解决办法 |
|---|---|---|---|
| Agent反复调用同一个工具但结果不变化 | 工具本身无状态或输入参数没变 | 1.查工具请求参数 2.查工具是否真的执行 3.查缓存策略 | 给工具加带参刷新机制;确认参数确实更新 |
| 记忆检索出来一堆无关内容 | 检索策略太粗暴,缺乏过滤条件 | 1.查写入内容是否被清洗 2.查检索是否按标签过滤 3.查是否需要时间衰减 | 增加标签过滤;清洗写入内容;引入时间权重 |
| 规划卡在某一步不断重试 | 缺少终止条件或重规划条件过激 | 1.查重试上限 2.查失败后的重规划策略 3.查计划是否陷入局部循环 | 设置最大重试次数;失败N次后强制切换策略 |
| 工具调用参数总出错 | 参数对齐层有问题或模型理解偏差 | 1.查Schema是否完善 2.查参数转换器逻辑 3.查工具描述是否清晰 | 补充必填字段说明;转换层增加默认值处理 |
| 上下文窗口不够用 | 记忆和计划没有做压缩处理 | 1.查是否所有历史都堆在上下文 2.查计划是否折叠 3.查短期记忆是否溢出 | 已完成的步骤折叠为摘要;历史对话做窗口裁剪 |
这张表不完全,但覆盖了我在实践中碰到的绝大多数异常。值得强调的是,排查顺序很重要,先查自己的代码逻辑,再怀疑模型能力。我见过太多团队一出问题就归因为“模型不行”,结果查到最后发现是自己的工具注册逻辑写错了参数映射。
6.2 排查思路的实操心得
Agent系统的调试和传统后端调试有个很大的区别:你不能只盯着模型输出看,你必须看整个循环的轨迹。我在本地调试时,会给Agent系统加一个事件日志模块,每个步骤记录一个结构化条目,包含当前状态摘要、规划决策、工具调用请求、工具返回结果、模型的关键推理片段。这么做的原因是,Agent的一个错误的根因可能不在出错的那一步,而在几步之前的一个信息丢失或一次错误决策。
另一个心得是:做最小复现。Agent出问题后,不要立刻修改整套逻辑,先把任务裁到最简单、最可能复现问题的那个单元,单独验证。比如怀疑记忆检索有噪声,就单独测试“写入十条记忆后检索一条查询”这个小场景,快速定位是写入问题还是检索问题。最小复现比直接看完整日志更高效,因为完整日志里的噪声太多了。
最后补充一个我自己的习惯:定期对Agent的记忆库存量做检查。记忆库会慢慢膨胀,里面会有大量过时的、重复的、低价值的条目,如果一直不清理,检索质量会持续下降。这跟人要定期整理笔记、归档旧文档是一样的道理。综述里讨论记忆管理时也强调了这一点,算是理论和实践互相印证了。
我对这份综述的评价是:它没有强行制造新概念,而是把Agentic AI最关键的几个坑系统化地摆了出来。记忆、工具、规划,单独拎出任何一个方向,都有不少成熟经验;难的是把它们当作一个整体来设计——规划前知道查记忆,执行后知道沉淀记忆,工具结果知道如何反哺决策。做到这一步,你的Agent才算真正从“能跑通Demo”进化到了“能扛住真实任务”。2026年往后,拼的就是这部分工程功底,而不是谁的模型参数又多了一截。