课程背景与核心议题:超越上下文窗口的记忆机制

本讲承接上一节课关于Agent如何在有限上下文窗口内选择保留信息的讨论,重点转向如何突破上下文窗口的限制。在上一讲中,我们探讨了Agent通过选择保留哪些信息来存储任务内的知识,而今天的核心议题是如何让Agent跨任务在外部存储器中保存信息。这种机制旨在帮助Agent在未来的任务中提升表现,主要涉及两个互补的视角:一是技能归纳(Skill Induction),即从过往经验中自动提取可复用的模式;二是人类编写的技能指令,即将最佳实践或领域知识编码为Agent可执行的规则。这两者并非孤立存在,而是可以形成人机协作的闭环:人类可以从Agent的经验中提炼最佳实践并加以编辑,或者Agent可以根据实际执行经验对人工编写的指令进行优化和细化。

"A big part of today is going to be about how can agents go beyond the context window and store information across tasks in external stores..."

这种跨任务的记忆机制对于构建长期有效的AI Agent至关重要。传统的上下文窗口即使扩展到百万级token,也难以覆盖Agent在漫长生命周期中积累的所有任务经验。因此,我们需要构建外部存储系统(如数据库或文件系统)来管理这些长期记忆。这不仅是简单的数据保存,更涉及如何表示、检索和更新这些知识单元(即“技能”或“子任务代表形式”)。通过这种方式,Agent能够摆脱单次会话的限制,实现真正的持续学习和性能迭代。

动机分析:共享结构与技能复用案例

为了理解为何需要跨任务记忆,我们可以考察一个具体的电商购物场景。假设Agent被赋予任务“将索尼耳机添加到我的愿望清单”。在高阶抽象层面,这一过程包含一系列动作:导航至商店网站、定位搜索框、输入文本并点击搜索。随后,Agent会筛选匹配产品并将其加入愿望清单。如果未来用户提出另一个任务“查找无线键盘的价格范围”,且在同一网站操作,大量动作结构是重复的。Agent需要再次导航、搜索(尽管关键词不同),只是后续处理逻辑变为获取价格并反馈。

"If it's difficult for the agent to figure out how to do this search, once it knows how to do it, it should be able to reuse that knowledge in the future..."

这里的关键在于共享结构(Shared Structure)的识别与复用。如果Agent能够将从第一次任务中学到的“搜索流程”抽象为一个可复用的技能,它在执行第二次任务时就能显著提高效率。这种复用不仅限于原始动作序列的复制,更可以抽象为代码函数。例如,“搜索产品”可以被封装为一个黑盒函数或具有层次结构的模块,供其他任务调用。这种抽象使得技能不仅可以被执行,还可以被测试、组合和模块化调用。因此,核心挑战在于如何表示这些共享结构:是直接保留原始动作日志,还是将其抽象为可执行的代码单元?这决定了技能的可复用性和泛化能力。

技能的生成、管理与生命周期维护

一旦确立了技能复用的必要性,接下来的核心问题是如何构建和管理这些技能的记忆库。这涉及三个层面的更新机制:首先是基于当前上下文窗口的即时记忆(如ReAct模式中的历史观察与动作记录),这是上一讲的重点;其次是外部存储的长期记忆管理,即本讲的主体内容;最后是模型权重的直接更新(如监督微调或强化学习),这将在后续课程中深入探讨。外部存储的优势在于其可移植性(Portability)和可解释性(Inspectability)。例如,一段描述“如何搜索产品”的技能文本或代码,可以被任何支持该框架的模型调用,而不像权重更新那样绑定于特定模型。此外,外部存储允许人类介入审查和修改技能内容,提供了更清晰的人机交互接口。

然而,管理这些外部记忆并非简单的“只增不减”。我们需要解决技能的生命周期问题(Life Cycle Management): 1. 增长策略:如何决定何时将新经验转化为技能存入外部存储? 2. 冲突处理:当遇到相互矛盾的经验或发现更优的执行路径时,如何更新现有技能? 3. 淘汰机制:当某些技能不再适用或过时,如何安全地删除它们?

"How can we um kind of manage the life cycle of these skills... and subtask representations that are learned?"

这要求Agent具备元认知能力,能够评估技能的效用并动态调整其记忆库。与内部上下文管理不同,外部存储的管理更加复杂,因为它涉及到持久化数据的结构化、索引和版本控制。未来的讲座将详细探讨具体的算法和方法,以实现这些技能的高效检索与更新。

三种记忆机制的对比与外部存储的优势

在深入具体技术之前,有必要明确区分Agent记忆的三种主要途径及其优劣。第一种是上下文窗口内的即时记忆。这种方法依赖于模型当前的注意力机制,通过压缩(Compaction)和选择策略来保留关键信息。其局限性在于上下文长度的硬性约束,即使使用百万token的窗口,也无法覆盖Agent跨天、跨月的长期任务历史。

第二种是外部存储(External Artifacts)。这是本讲的核心,包括数据库、文件系统或代码库等Agent可访问的结构化存储。外部存储的主要优势在于其独立于模型权重。这意味着技能可以被不同版本的Agent共享,且人类可以直观地查看、编辑和验证这些存储内容(如检查搜索逻辑是否正确)。这种可解释性对于构建可信的AI系统至关重要,因为它允许人类在“人机回路(Human-in-the-loop)”中发挥监督和指导作用。

第三种是模型权重更新。通过微调或强化学习直接改变模型的参数,使技能内化到模型中。虽然这种方法可能带来更流畅的执行体验,但其不可移植性和黑盒性质是主要缺点。权重更新仅对特定模型有效,且难以进行人工审查和精确修改。

"External artifacts are also more inspectable by people... there's it's easier to kind of like have an interface between the person and the system if your method of remembering is interpretable."

综上所述,外部存储提供了一种平衡了通用性、可解释性和持久性的记忆解决方案。它允许Agent在多次任务中积累结构化知识,并通过人机协作不断优化这些技能库,从而为构建更强大、更可靠的长期Agent系统奠定基础。

智能体自写技能的实践体验与失败案例

在关于“让智能体自行编写技能”的课堂讨论中,约有一半的学生曾尝试此方法。参与者分享了具体的实践经验:有时模型在构建技能时会过度推断(overinfer)应有的操作范围。当这些指令被传递给另一个智能体时,后者会严格遵循字面意思执行,导致完成的工作量远超预期。这种“过度详细”的问题表明,模型在模拟他人视角时存在局限。

“Sometimes the models will write too much in the skill like they'll kind of overinfer the what should be done and then when that's handed off to another model it will kind of follow it to the letter and do a lot more than you actually wanted it to.”

然而,当提示词明确指示智能体为“另一个代理”编写操作指南时,效果显著改善。这类似于模拟理论心智(theory of mind)的过程:通过要求智能体站在接收者的角度思考,模型能更好地生成简洁、可复用的指令。这种从“自我中心”到“用户/代理视角”的转变,是提升自动生成技能质量的关键。

智能体记忆的三种主要类型与抽象层级

为了在交互中保留有价值的信息,可以将记忆分为三个层次。首先是片段(Episode)记录,即保存来自环境或用户的所有观察序列及采取的动作。这是最高保真度(maximum fidelity)的记忆形式,保留了特定环境和指令的所有细节,但也是成本最高、最耗Token的方式。由于不需要也不应该保留所有细节以利于泛化,因此需要更抽象的形式。

其次是事实(Facts)记忆。早期工作多聚焦于此,例如记录用户的个人信息(如年龄、居住地)。Anthropic 和 ChatGPT 的记忆系统正是基于此原理:由 LLM 从过往交互中提取事实,存储在外部数据库中。这类似于数据压缩,将冗长的对话历史转化为简洁的知识条目。

最后是技能(Skills)。这是针对智能体的特定概念,指从任务细节中抽象出的、可重复使用的子任务执行方法。例如,“在特定网站上搜索产品”的技能,不应包含具体 searched 的产品名称,而应保留通用的操作步骤。技能只有在重复执行相同子任务时才有价值。

技能的来源:人工编写与自动诱导的权衡

技能可以被视为一种指令(instructions),其来源主要分为人工编写和自动诱导两类。人工编写的技能通常用于编码个人偏好或组织政策(如公司的代码编写规范)。其优势在于来源明确、质量可控且易于维护标准,但缺点是耗时费力。相比之下,自动诱导的技能由智能体从过往经验中生成。

“If you've used like Anthropic or Chatbt's uh memory systems, they're doing this basically... It's generated by an LLM. Gets stored in this external thing.”

自动诱导技能通过一个闭环流程实现:生成技能 -> 尝试用该技能重做任务 -> 评估指标是否改善。这种方法实现了自动化,但可能引入噪声和意外后果(unintended consequences)。特别是当技能被其他智能体使用时,若生成过程缺乏对接收者心智模型的准确模拟,可能导致执行偏差。因此,结合记忆(具体经验)与技能(抽象知识),从成功或失败的经验中提炼通用规则,是提升智能体长期性能的核心路径。

技能表示形式与混合记忆策略

技能的表示形式多样,可以是纯文本指令、实际执行的动作序列或代码。关键在于其抽象程度:它必须剥离具体任务细节(如特定产品),保留通用逻辑。例如,发布应用到生产环境的技能可能是一个检查清单(checklist)。

记忆与技能的交集在于:利用智能体的过往交互经验来诱导(induce)技能。如果某次搜索产品的操作被判定为成功,系统可以从中提取出类似技能的指导原则供未来使用。这种机制将具体的记忆(memory)转化为可复用的知识(skills),从而在保持灵活性的同时提升效率。人工技能提供基准和约束,自动诱导技能则通过迭代优化适应新场景,两者结合构成了智能体长期学习的基础架构。

Agent Skills 标准结构与文件组织

在构建可重复执行且遵循固定规范的智能体功能时,采用“技能(Skills)”机制比硬编码提示词更为高效。Agent Skills 标准规定,技能以文件集合形式存在,智能体通过读取这些文件获取指令。一个标准的 Python 代码审查技能文件夹包含核心元数据文件和可选资源目录。skill.md 是必须存在的 Markdown 文件,其头部包含 YAML 元数据,其中 name(名称)和 short description(简短描述)至关重要。简短描述用于指导语言模型判断何时应用该技能,因此必须保持简洁以避免占用过多上下文窗口。文件主体部分则提供详细的执行规范,例如列出应使用的 linter 工具及测试流程。

除了核心文件外,技能包还包含三个可选文件夹以支持更复杂的任务。scripts 目录存放可执行代码,如运行 linter 的 Python 脚本;references 包含补充文档,智能体仅在需要时按需加载;assets 则存储模板或资源文件(如 Ginga 条件配置)。这种结构允许智能体在保持指令清晰的同时,灵活调用外部资源。正如讲师所言:> “You should reach for a skill when you want to do something repeatedly following kind of like a fixed specification.”

渐进式披露机制与上下文管理

由于技能可能包含大量信息,直接将所有内容加载到模型上下文中会导致性能下降。渐进式披露(Progressive Disclosure)机制通过分层加载来解决这一问题。第一层是 YAML 元数据,始终显示在系统提示中。第二层是 skill.md 的其余文本内容,仅当模型判断技能相关并通过工具调用读取时才加载。第三层是 scripts、references 和 assets 中的资源,同样通过工具调用按需获取。

这种机制要求 skill.md 提供足够的信息让模型意识到何时需要深入查看子文件夹。然而,即使元数据简短,技能数量过多仍会影响性能。Hermes Agent 等先进智能体的系统提示中,技能描述的总长度约为 3,000 tokens。研究表明,添加不相关的技能会增加上下文噪音,导致模型分心并降低性能。因此,保持技能数量适中并根据软件任务按需加载是关键。讲师指出:> “Adding in irrelevant skills can drop performance because the context gets longer. The model might be distracted by things that are actually irrelevant.”

触发敏感性、标准化与格式选择

技能的触发依赖于模型生成的工具调用,其敏感度完全取决于模型的预测能力以及对过往上下文和技能描述的理解。因此,需要专门的评估方法来优化触发机制。skill.md 是标准化名称,模型和框架均针对此标准进行训练。虽然允许使用替代格式,但建议尽可能接近该标准以确保兼容性。

关于为何选择 Markdown 作为技能描述格式,讲师解释这是为了在机器可读性和人类可读性之间取得平衡。Markdown 支持线性文本、超链接甚至嵌入图片,便于描述动态内容。尽管可能存在比 Markdown 更优的格式(如支持更多动态交互的结构),但当前的标准化实践倾向于使用这种广泛兼容且易于维护的格式。讲师提到:> “It is a balance of machine and human readability, I think.”

技能数据的存储格式与渐进式披露

在构建AI Agent时,技能的呈现方式至关重要。Markdown被视为一种通用且可读性强的格式尝试,但系统往往依赖大语言模型去解释其他特定格式。在科学文献中,技能主要分为两类:文本型技能(Textual Skills)和程序化技能(Programmatic Skills)。前者通常嵌入在Markdown文件中,后者则存在于脚本中。这种分类涵盖了从描述性指导到可执行代码的广泛范围。为了应对大规模环境(如拥有数十亿资源的AWS基础设施),不可能将所有工具或技能一次性放入上下文。因此,渐进式披露(Progressive Disclosure)成为关键策略:首先向模型展示一级技能索引,通过系统提示词告知可用技能的元数据(如YAML格式),并介绍一个名为“skill view”的工具。当用户请求相关任务(如Python代码审查)时,模型会调用该工具读取具体的Markdown技能文件。随后,系统可能执行脚本目录中的代码并获得结果作为观察值。这种机制允许Agent按需加载技能,避免上下文过载。>

基于过往交互数据优化Agent技能

在构建AI Agent的技能时,依赖先验知识往往效果不佳。研究表明,让模型仅凭任务描述自行创建技能会导致性能下降。相比之下,基于人类过往的交互经验来构建技能更为有效,因为实际执行任务的过程会揭示出预先未知的操作细节。以代码审查技能为例,可以通过分析Pull Request(PR)的后续处理情况来评估和改进该技能。具体做法是:当Agent生成审查评论后,由人工决定是否采纳这些建议。通过统计被人类实际采用的评论数量,可以量化技能的有效性。在收集了数百或数千个样本后,可以利用推理模型总结数据,例如发现忽略仓库规范的代码建议往往不被采纳。基于这些证据,可以指导模型更新技能文件,从而提高未来审查意见被人类接受的可能性。这种从真实交互中迭代优化的方法,比凭空设计更为可靠。

MemGPT:突破上下文窗口限制的外部记忆架构

为了解决大模型上下文窗口的局限性,2023年发表的MemGPT论文提出了一种将记忆管理从上下文窗口中分离出来的系统级方案。该架构借鉴了计算机系统的内存层级概念:快速访问的上下文窗口与容量更大但访问较慢的外部存储。尽管当前模型的上下文窗口已显著扩大,但随着Agent需要处理的信息量激增,这种外部记忆策略依然具有极高的动机和价值。在该架构中,系统指令保持不变,而工作上下文(Working Context)则通过工具调用从外部存储中读取相关事实并注入到模型的上下文中。同时,模型也可以通过工具将新信息写入外部存储。这种读写操作完全由模型的API调用控制,实现了记忆的动态管理。此外,系统还维护一个独立的消息存储区,其管理机制与外部记忆类似。

记忆的检索、更新与冲突处理机制

MemGPT不仅支持记忆的增加,还引入了Delta Paper中提到的更新与删除逻辑,以处理信息随时间变化的情况。当新消息进入系统时,模型会提取潜在的事实片段。通过基于嵌入的检索器(Embedding-based Retriever)在外部数据库中查找Top-K个相似事实,系统判断新提取的事实与现有记忆的关系。如果新事实在检索结果中不存在,则将其作为新知识添加;如果存在且发生冲突(如用户更换工作),则用新信息替换旧信息;若新事实否定了旧事实(如“我被解雇了”),则直接删除相关记忆;若无关联,则忽略。这种机制类似于哈希表中的键值更新,但操作对象是文本事实而非向量。通过这种方式,Agent能够保持记忆的时效性和准确性,避免存储过时或错误的信息。

记忆机制中的遗忘与反馈学习

在构建智能体(Agent)的记忆系统时,除了存储和更新向量以优化查询性能外,模型权重的调整与遗忘机制同样至关重要。特别是在面对相互冲突的知识时,让模型具备“忘记”旧有错误信息的能力有助于提升准确性。目前已有研究探索通过非学习(Unlearning)等技术手段来实现这一目标,这是记忆基础研究中不可忽视的一环。

"Yeah, you could also think about like um for the third type of learning for updating the weights of a model, it's potentially helpful there to be able to forget stuff also."

除了静态记忆,轨迹反馈(Feedback on Trajectories)是提升智能体表现的有效途径。其中,《Reflection》论文提出了一种简单但极具影响力的方法,使智能体能从过去的经验中受益。该方法的核心在于利用自然语言反馈(Natural Language Feedback)作为条件,指导智能体在第二次尝试时修正错误。例如,当用户要求列举一系列战役而智能体仅回答一个时,系统可通过LLM生成指出错误的反馈文本。这种基于自然语言的纠错信息能显著帮助模型在后续尝试中得出正确答案,证明了反馈 conditioning 的有效性。

基于轨迹检索的经验复用(RAG for Agents)

智能体改进的另一种基础方式是记忆并检索完整的轨迹(Trajectories)。这类似于为智能体构建一个“经验库”,其中包含过去执行任务时的完整序列,包括观察、行动(如工具调用)、思维链等。当面临新任务时,系统会从这些历史轨迹中检索相关片段,并将其放入模型的上下文窗口中。

"So this is sort of like rag for agents, right? Um and uh it's pretty effective."

具体实现中,系统首先收集训练任务或智能体自行执行的任务轨迹。这些经验可能被附加上类似 Reflection 生成的描述性文本,形成一个庞大的体验池。当新任务输入时,系统通过嵌入模型(Embedding Model)对新任务的描述进行向量化,并从历史轨迹池中检索最相关的片段。这种机制允许智能体通过展示过去的成功或失败案例来指导当前行为,从而提升性能。检索策略可以是常规的嵌入相似度匹配,也可以是对序列进行集合比较。

技能的定义与可复用性分析

在掌握记忆基础后,进一步探讨如何诱导智能体形成技能(Skills)。技能被定义为任务中可跨不同场景复用的部分。以“搜索产品”为例,智能体的执行过程包括生成思维链、识别网页元素ID(如搜索框)、输入查询词以及点击搜索按钮。这一系列动作构成了一个具体的任务片段。

"So we can think of a skill as being um a specific like reused part of the task."

这种模块化思维的优势在于复用性。例如,当用户后续询问“该商品的价格范围”时,智能体可能需要重复上述搜索步骤,再执行额外的解析动作。因此,将“搜索”抽象为一个独立技能,可以避免重复构建相同的交互逻辑。然而,这种表示方式也面临挑战:如何确保技能的边界清晰且足够通用?这引发了关于技能粒度定义及潜在问题的讨论,为后续更复杂的技能组合与编排奠定了基础。

技能表示的脆弱性与文本vs代码之争

在构建AI智能体的技能库时,基于网页元素ID的技能表示存在显著的脆弱性。如果页面结构发生变化或元素编号不同,原本有效的技能就会失效。虽然可以通过调整动作空间来缓解这一问题,但当智能体面对具有不同搜索界面的新网站时,技能依然会崩溃。因此,学术界通常将文本表示与代码表示作为两种主要的技能表征方式进行对比。这种对比不仅关乎技术的可行性,更涉及系统在动态环境中的鲁棒性。正如演讲者所言:"如果页面上的元素ID发生变化,技能就会失效……如果你去一个具有不同搜索界面的网站,它就会崩溃。"

技能诱导的基础:从Minecraft到DreamCoder

理解如何从经验中学习技能,需要回顾早期的代表性工作。Voyager项目展示了在Minecraft游戏中通过代码控制智能体的能力,它将制作物品或对抗僵尸等子任务实现为函数。这种将子任务表示为函数的方法允许函数相互调用,使得智能体能够组合简单技能以执行日益复杂的任务。另一条重要的研究线索来自程序诱导社区(Program Induction Community),特别是名为DreamCoder的工作。该系统通过搜索低层函数构建完整对象的示例中的重复模式,将这些模式抽象为函数并反复迭代,从而压缩构造这些对象所需的程序。后续研究进一步整合了大型语言模型、Python代码和自然语言描述,这些思想同样适用于利用LLM与世界交互的智能体。

在线学习设置与技能库的生命周期管理

评估技能诱导系统的典型场景是在线学习环境(Online Learning Setting)。在这种设置下,任务按顺序依次出现,系统需要在解决当前任务的同时建立技能记忆。例如,当用户要求"将索尼蓝牙耳机添加到我的愿望清单"时,系统会执行一系列操作并诱导出一个通用的技能(如"搜索产品并添加到愿望清单")。随着类似任务的重复出现,系统应能利用已诱导的技能提高未来任务的成功率。评估的核心指标是随着经验积累,智能体在解决越来越复杂任务时的成功率是否持续提升。技能库的管理包含三个关键步骤:首先是诱导阶段,从交互中提取潜在可复用的技能;其次是存储决策,决定哪些技能值得存入长期记忆;最后是维护与优化阶段,包括删除未使用的技能、将过于具体的技能泛化或合并相似的技能。正如演讲者指出的:"我们感兴趣的是,如果我们能衡量每个任务的成功率,我们的成功率是否越来越好?"

Agent Workflow Memory:基于LLM的工作流诱导

以CMU Zora Wong等人提出的Agent Workflow Memory为例,该方法专门针对网页任务设计。当智能体执行查询(如"告诉我我们的商店收到了多少条评论")时,系统会记录其产生的工具调用序列。核心机制是利用语言模型分析这些工具调用轨迹,识别出未来可能复用的部分。LLM被要求输出被称为工作流(Workflows)的技能表示,这是一种基于文本的动作序列描述。为了增强通用性,系统要求模型创建模板以抽象出初始动作序列中的特定部分。例如,将搜索"索尼耳机"泛化为搜索任意商品。这一过程虽然看起来像代码,但演讲者强调:"这开始看起来有点像代码了……稍后我们将比较代码与文本,并展示它在某些方面更好但也更脆弱。"

质量评估:裁判模型的作用机制

在将诱导出的工作流存入记忆之前,必须确保其正确性。Agent Workflow Memory引入了一个裁判模型(Judge Model)来评估生成的轨迹。该模型的职责是预测给定的工具调用序列是否正确。只有当裁判模型确认轨迹有效时,诱导出的工作流才会被添加到技能库中。这一机制至关重要,因为存储错误的技能可能会在未来误导模型。通过这种严格的过滤机制,系统旨在构建一个高质量、可复用的技能库。演讲者总结道:"我们将应用裁判模型来判断轨迹是否正确……我们不想记住错误的东西,因为那可能会在未来误导模型。"

基于上下文窗口的记忆机制与性能提升

为了让模型能够访问一系列工作流(workflows),最直接的方式是将这些技能直接放入模型的上下文窗口中。这种处理方式类似于“Agent Skill Standard”,开发者可以根据技能的多少和模型上下文长度的限制,选择展示所有细节还是仅保留文本描述。为了节省时间,演讲者略过了诱导提示(induction prompt)的具体细节,但重点展示了拥有过去子任务记忆的Agent在在线学习过程中能显著提升性能。在一项涉及与地图工具交互的基准测试中,实验结果呈现出明显的对比:横轴代表按固定顺序排列的不同任务,基线Agent(无记忆机制)的准确率收敛在约10%。相比之下,引入了子任务记忆的Agent(黑色线条)表现大幅改善。这种记忆机制使得Agent能够执行日益复杂的任务,例如在特定位置附近查找酒店或展示步行路径,而这些是基线Agent无法完成的。这表明,将文本和示例动作混合使用来代表技能并保留在上下文中,能有效增强Agent的学习能力和任务完成度。

代码技能与文本技能的权衡:灵活性与刚性

除了使用文本来表示技能,另一种方案是使用代码。演讲者对比了两种实现搜索产品功能的示例:一种是基于文本和示例的上下文内调用,另一种是封装好的代码函数。使用纯文本和示例时,模型具有极高的灵活性。例如,如果网站结构发生变化导致原有的搜索框元素失效,或者需要插入不同的搜索结果,模型可以自主决定新的工具调用方式。然而,这种灵活性也意味着Agent必须亲自生成所有的底层动作和工具调用。相反,如果使用代码函数作为技能表示,只要传入正确的参数且函数本身正确,Agent只需调用该工具即可。代码技能的执行由环境中的程序自动完成,无需模型重复生成低层级的动作序列。这种差异引出了关于代码作为技能表示形式的优缺点讨论,其中主要的缺点在于其刚性(rigidity)。调用该工具的模型将严格执行预定义的三个步骤,几乎没有偏离或自定义的空间。

代码技能的优势:模块化、可测试性与重构

尽管存在刚性问题,但使用代码作为技能表示带来了诸多显著优势。首先,代码支持函数嵌套和层级结构,允许构建更复杂的逻辑流。其次,开发者可以独立于整个执行轨迹为特定函数生成测试用例,并进行代码重构(refactoring)。Zora团队在《Inducing Programmatic Skills》一文中展示了这一过程:利用语言模型擅长生成代码的特性,将包含工具调用的轨迹抽象为函数。例如,LLM会编写一个search_reviews函数及其文档字符串,并将低层级的工具调用作为代码行嵌入其中。随后,LLM还会重写原始轨迹以使用这些新技能。代码技能的一个关键优势在于其可执行性。与之前对原始轨迹应用评判器不同,现在可以直接执行生成的抽象代码并评估最终结果。如果执行结果显示正确,这比单纯评判轨迹提供了更强的证据,证明诱导出的代码技能是正确的。一旦验证通过,这些技能就会被存入记忆库并作为工具供LLM在后续任务中使用。实验数据同样显示,这种方法也能带来性能的提升。

技能迭代与优化:Lint反馈与环境交互减少

为了进一步优化代码技能,研究者引入了类似SkillWeaver的伪代码循环机制:提出一组代码技能 -> 尝试执行任务 -> 应用奖励模型评估。如果成功,则将诱导的技能存入记忆;如果不成功,则进行修订。这种机制允许利用静态代码分析工具(Linter)提供反馈。例如,在一个名为identify_pill的药物网站交互技能中,初始版本忽略了“颜色”参数。通过Linter反馈,系统可以识别出未使用的参数,并以反思(reflection)的方式生成更新后的函数版本并存储。此外,代码技能还能显著减少Agent与环境交互的次数。由于这些诱导出的函数现在本身就是工具调用,Agent无需在每一步都进行环境查询。这种封装不仅提高了效率,还通过利用奖励模型反馈和技能迭代修正机制,确保了即使代码本身较为刚性,其整体表现也能通过不断的自我优化得到增强。这种从轨迹到可测试、可迭代代码技能的转化,为构建更稳健的Agent工具库提供了有效路径。

代码技能显著提升执行效率与准确性

在Zora的ASI论文研究中,针对更新网页地址的任务进行了对比实验。基础Agent需要执行大量低层级操作,如导航表单、输入具体地址信息;而具备诱导代码技能的模型仅需调用预先生成的“导航至地址设置”和“更新地址详情”函数,即可在三个步骤内完成任务。代码技能通过封装重复性操作,大幅减少了Agent与网页的交互次数。由于视觉观察和思维链生成消耗大量Token,减少交互轮次成为提升效率的关键瓶颈。研究团队进行了受控比较,发现在具有重复结构的任务中,代码技能相比无记忆或纯文本技能,不仅在系统准确性上表现更佳,还在效率提升方面取得了显著进步。

泛化困境与抽象类解决方案

技能的一个主要风险在于缺乏通用性。研究团队尝试将在一个网站诱导的代码技能应用于Target购物网站,结果失败。原因为不同网站的UI元素结构差异巨大:源技能假设交互元素为下拉菜单,而Target网站使用的是单选按钮组。为解决此问题,研究引入了抽象类概念(如Poly Skill论文所述)。Agent首次访问新网站时编写不包含具体实现的抽象类,随后根据特定网站(如Amazon)生成具体的实例化代码。这种机制允许Agent在遇到不匹配的元数据时触发重写逻辑,既保持了大量特定技能的存在,又确保同一时间仅激活相关子集,符合软件工程的最佳实践。

从失败轨迹中学习策略反馈

除了基于成功经验的技能诱导,从失败中汲取教训同样重要。以搜索“蓝牙耳机”为例,若网站使用OR逻辑而非AND逻辑,Agent可能面临5000条无关结果并因分页处理而迷失。通过反思式观察失败轨迹,Agent可以生成文本形式的策略指导:例如建议使用更具体的搜索词或增加每页显示数量以优化上下文窗口。研究对比了不同记忆类型,发现仅存储完整轨迹或工作流并未带来性能提升,但引入文本描述的策略(包括正面和反面示例)能显著改善表现。因为用通用语言描述“如何避免失败”比单纯记忆错误轨迹更具指导意义。

评估器噪声对记忆算法性能的影响

在基于示例的学习中,系统通常依赖模型作为裁判(Model as a Judge)来判断轨迹是否成功。这种机制的核心在于评估器的质量直接决定了算法的最终表现。为了量化这一影响,研究人员在 Reasoning Bank 论文中进行了控制实验。他们首先使用完美的裁判(即拥有地面真值知识)来运行方法,随后向判断结果中引入噪声,从而模拟不同准确率的裁判环境。实验结果显示,随着评判准确度的下降,算法性能确实会出现衰退。然而,研究也发现存在一个“甜蜜点”(sweet spot),即在较宽的准确率范围内,利用裁判诱导记忆仍能带来显著的性能提升。这表明当前的评估器虽然不完美,但仍具备足够的鲁棒性来支持记忆机制的有效性。未来的工作仍有空间去进一步优化评估器的准确性及其对算法的边际贡献。

技能冗余与检索器质量的消融分析

针对“拥有过多非必要技能是否会损害性能”以及“检索器的质量是否关键”这两个问题,Reasoning Bank 提供了详细的消融实验。数据显示,随着可用经验数量的增加,性能呈现下降趋势。这种衰退可能源于两个层面:一是环境层面的局限性,即如果智能体尚未在足够多的任务上运行,记忆库中缺乏相关性内容,强行增加数据只会引入无关噪音;二是模型层面的局限性,即语言模型可能因上下文窗口中信息过载而分心。解决这一问题的潜在方案包括训练模型以更好地忽略无关上下文,或显式地缩小记忆规模。例如,通过类似缓存的机制监控技能的使用频率,若某项过去使用不频繁则将其剔除。这种策略不仅减轻了语言模型的负担,还能通过减少干扰项来提高成功率。

基于强化学习的技能诱导直接训练

以往的技能生成多依赖于提示工程(Prompting),即让语言模型预测未来可能有用的技能,这种方法具有一定的随意性。最近的研究开始探索直接通过强化学习(Reinforcement Learning)训练语言模型进行技能诱导。在 ACL 今年发表的相关工作中,研究者采用在线学习设置,让智能体在处理一系列相似任务时构建记忆。由于强化学习能够处理复杂的非可微过程,它可以直接应用于包含存储、检索和使用技能的整个复杂流程中。奖励信号来源于后续任务的成功与否,以及是否复用了过去诱导的技能。实验发现,引入鼓励技能重用的奖励项有助于提高成功率。此外,还可以设计其他奖励机制(如最小化技能库规模)来防止过拟合。这一方向展示了通过端到端训练优化记忆机制的巨大潜力,为未来的研究提供了新的视角。

结论

外部存储机制是突破上下文窗口限制、实现Agent长期记忆与技能复用的核心方案。相比权重更新,其具备可移植性与人类可解释性优势;相比纯文本技能,代码化表示虽具刚性但支持模块化测试与重构。实证表明,基于过往交互诱导的技能能显著提升复杂任务成功率并减少环境交互次数。

然而,该体系仍面临技能脆弱性、检索噪声及冗余干扰等挑战。过度依赖不完美裁判模型或引入无关技能会导致性能衰退,且跨网站泛化需借助抽象类解决。未来优化方向在于提升检索器质量、精简记忆规模,并探索通过强化学习直接训练技能诱导过程,以构建更稳健的长期Agent系统。