跳到主要内容

1 篇博文 含有标签「talk」

查看所有标签

从evo-memory看self-evolving agent

· 阅读需 21 分钟

ps:这是我为一个一个关于self-evolving agent的talk准备的逐字稿,请配合PPT食用:

那我们就进入evolve agent的部分

我会先讲一讲为什么会有self evolving agent,接下来总整体上讲一讲自进化智能体的地图,接着落到我们这次focus的Evo-Memory这篇工作,从WHAT,WHEN,HOW这三个坐标分别分析这个工作的motivation以及具体实现。最后我会讲一讲实验结果,带给我们的启发,局限性以及未来我们可以做的工作。

好的,第一个问题:为什么我们要让智能体自我进化? 想必各位也有许多使用智能体工作的经验。但是我们在使用的时候会发现一个问题:人是会自我反思并且迭代自己的工作流的,而Agent似乎很难自动地做到这一点,往往需要我们去提醒Agent。 这可能是因为在预训练和后训练的过程中,大模型内部的权重已经被确定,而强化学习只会让大模型在一系列人类构造的任务上达到人类想要的成果,Agent很难自己做到遇到新任务的时候自主学习,自我进化,也很难在长线任务中达到整体的稳定性。我们在谈论AI发展的最终愿景的时候常常谈到AGI,或者Super intelligence,我们会发现,现在的agent,要想抵达这个愿景,就需要自我进化,在长程任务中不断学习。这就是为什么我们要构建可以自我进化的智能体。

那么,目前自我进化智能体的发展如何呢?我们从这张PPT中可以看到当前self evolving agent的一个基本的坐标系。当我们遇到一个自我进化智能体的工作的时候,就可以通过这个坐标系来确定它在整个领域的位置。坐标系分为WHAT,WHEN,HOW三个层次。首先是WHAT:自我进化智能体进化的具体是什么呢?可以看到,我们可以进化智能体使用的基础模型本身,比如模型的权重,以及模型的结构。同时,我们也可以进化智能体的上下文,比如prompt,以及这里的memory(因为memory也会作为智能体的上下文给到agent)。除此之外,我们也可以进化智能体使用的工具,比如智能体使用的代码,以及最近比较火的新概念:skills。

而对于WHEN,也就是自我进化智能体何时进行进化,也可以分为两类:Intra-task和Inter-task。Intra-task主要指的是,智能体在完成单个任务的过程中不断地反思前面的步骤做得对不对,进行不断迭代和自我进化。而Inter-task则是考察智能体在不同任务间复用任务经验的能力,看智能体是否能在完成后面任务的时候使用前面任务成功/失败的经验。

而最后一个问题:HOW,也即智能体如何自我进化,则可以被分为三种主要的方法或者说策略:首先是基于环境Reward的自我进化,这个Reward有可能是数值的Reward,就像强化学习的很多方法;也可能是文字主导的Reward,这个在Evo-Memory这篇工作中就体现得很明显。除此之外,还有基于模仿学习的方法。比如我们挑选出一个模型在特定任务上表现比较好的轨迹,然后根据这些轨迹对模型做微调,不断左脚踩右脚。最后一种思路是基于种群的演化,采用了类似进化算法的思路,比如我们可以让模型在参数或者prompt上产生很多随机的微小变化,看哪些变化让模型在特定的任务序列上表现得好,我们就挑出来将这些变化进行杂交。

通过上述的坐标系,我们就可以基本定位一篇self-evolving agent的工作在整个领域之中的位置了。那么在这里我们也可以看到我们今天主要探讨的Evo-Memory是这样回答WHAT,WHEN和HOW这三个问题的:对于WHAT to Evolve,它的回答是:我们要Evolve context,尤其是Memory。对于WHEN to Evolve,它focus在了Inter-task self-evolving,也就是Lifelong Self-evolving这个层次。而对于How to evolve,它则采用了Reward-Based的思路。

那我们自然就要问一个问题:为什么Evo-Memory在整个领域中关注这样一些子问题呢?那么下面我就来讲一下这篇工作的动机。

首先,从WHAT to Evolve的层面,它发现,我们之前的一些有关memory的benchmark都focus在了检验Agent对知识的记忆这一点上,对于Agent对之前轨迹的复用并没有涉猎。

而在WHEN to Evolve的层面,它发现,之前的一些研究都focus在Agent如何使用Memory在单个任务中与用户的对话中如何保持一致上,而非Agent如何在一系列的任务中不断进化上。

而在HOW的层面,它发现传统的记忆机制只是被动地存放记忆,缺乏对记忆进行结构化整合和提炼的机制。

目前的agent的memory系统只是单纯地记忆,而非在任务间进行自我进化。这样一来,这篇工作的动机也就很清楚了。

而这篇工作首先要做的,就是提出一系列新问题:在WHAT的层次上,它提出:Agent的Memory不能仅仅记住事实,也需要记住经验。在WHEN的层次上,它提出:Agent的Memory不能仅仅在单个任务内迭代进化,也需要在一系列动态的任务之中不断提升自身复用经验的能力。 总而言之,这篇工作提出的就是 Agent Memory要在多个任务流中不断复用经验,这样的问题。

为了测试现有的Agent设计是否能回应这个问题,这篇工作复用了一系列benchmark;同时,从HOW的层次上,这篇工作也提出了分析这一问题的思路,并提出了两个Baseline。

下面我们就逐个从WHAT,WHEN,HOW入手来具体看一看这篇工作

在WHAT这一页,我们可以看到,正像我们之前提到的,传统的RAG通常是静态的,目标是对话召回。它存储的大多是事实和对话历史,例如某个特定的题目的答案。而Evo-Memory则focus在这个问题之上:self-evolving的Memory Agent应当追求经验复用,存储过程性知识和策略。也即,未来的self-evolving agent应当追求如何推理,而非仅仅记录“观察到了什么”

而在WHEN这一页,如前所述,对于何时进行进化这个问题,传统的Benchmark只是测试对于每个孤立的任务之中agent自我进化的能力,而Evo-Memory则希望显式地评估Agent在连续任务流之中,在测试的同时自我进化的能力。 因此Evo-memory复用了一系列已有的Benchmark,将其构建为一系列任务流,记忆会在一系列任务序列中不断进化,影响着agent完成任务的策略。这其实更符合我们在现实中对“智能”的期待,它可以从失败中汲取教训,并且在连续工作中变得越来越强。

有了评估的Benchmark,也需要有一些具体的实现来作为benchmark的baseline。因此,论文中也举出了两个具体的实现。左侧的实现是基于RAG的,注意它记忆的更新发生在任务级别,每次完成任务的时候,就把完成的轨迹追加到记忆池之中。而右侧的实现则是更Agentic的实现,它的设计让它既能够在完成一个任务另一个任务还没完成之前,在任务间进行更新,同时还会在任务内的每一个step中进行实时提炼。通过这一提炼的过程,Agent会自主决定哪些经验有价值,哪些需要重写。我们可以看到,这两种实现不仅在记忆更新的时间,也就是when上面有差距,在how的层次上也存在着差距,前者是单纯的搜索和召回,后者则有Agent的加入。下面,我们就从HOW的角度看一看Evo-Memory如何提出一套分析在任务间自我进化agent memory的机制,并看一看基于这一机制,这一页的两个实现具体的细节是怎样的。

我们首先来看这一页之中,Evo-memory提出的分析任务间自我进化Agent的一套方法。如前所述,在Evo-Memory前面定义的这个问题域之中,self-evolving是由环境反馈:也就是整个traj驱动的。在左下角我们可以看到形式化定义:agent遇到一个任务流X,在每个任务之中,agent在输入xt的情况下做出action,并得到反馈。之后,也就是问题的关键:agent如何把反馈转化为经验。 根据左边的形式化,我们要考虑的问题也就变得清晰起来:当我们设计一个任务间自我进化Agent的过程中,主要考虑的是右下角的三点: 首先是search,也即agent如何根据当前输入检索历史记忆;合成,agent如何结合当前上下文检索到的经验生成action;演化:如何利用反馈更新记忆库。

带着这样的思路,再去看之前我们提到的两个实现: 左边的RAG实现在检索上直接取数据库中最相似的topk个traj,基于基模的能力实现新动作的合成,而更新记忆库的方式则是直接取并集。不过,它盲目堆砌的性质让它很容易受到噪声中毒的影响,失败的尝试很可能导致Agent反复犯错。 而右边的ReMem则借鉴了经典的ReAct思路,将记忆进化建模为主动的马尔可夫过程,将精炼记忆这件事直接加入Agent的动作空间之中。在prompt之中,精炼记忆主要分为这样一些动作:删除(直接将记忆从库里面删除),压缩(将good case精炼压缩为经验),过滤(分析bad case例获得教训)这一思路主要影响了上一页pipeline中的合成与演化这两件事。精炼记忆主要影响了上一页之中设计自我进化agent需要注意的三点之中的合成和演化,而对于search,它和RAG实现一样,都是从向量数据库中检索相关性top-k(k=4)的记忆。二者都使用BAAI开发的开源Embedding模型做嵌入。

ok那么我们自然会好奇这样的baseline是否能在Evo-memory重构的benchmark上达到比那些不自我进化的agent更好的效果。

在实验部分呢,论文试图去探究这样一些问题: 首先,self-evolving agent是否真的在有效性和效率上提升整体的的性能? 其次,不同顺序的任务流,以及bad case带来的噪声是否会对我们的这些baseline造成影响? 这之后,还有最重要的问题:随着任务流推进,agent是否真的自进化了,也就是是否在任务上越做越好了?

结果可以回应上的三个问题。左上的结果说明,self-evolving agent在有效性和效率上均比没有self-evloving的agent效果更好;而任务顺序从易到难/从难到易,带来的结果基本是稳定的;并且,ReMem相比ExpRAG,它的精炼记忆的机制能够更好地防止失败轨迹带来的记忆中毒。右图可以看出,我们的baseline真的自我进化了,成功率随着任务数量稳步上升。 (History 最近k回合,ExpRecent,最近N个任务的traj)

那么,下面我们可以对Evo-Memory这篇工作做个总结,并且给出一些takeaway了。我们同样从WHAT,WHEN,HOW三个角度入手: 从WHAT这个角度:在agent memory的研究这个领域,memory已经从记录静态事实走向经验复用;而从WHEN这个角度,智能体的进化应当在部署的过程中,在连续的任务流中不断发生。而从HOW这个角度,我们意识到,在Reward-based尤其是text-Reward based这个向度上,要实现自我进化,不能只靠把原始轨迹塞入上下文,而要进行主动精炼

不过,在我看来,Evo-Memory虽然提出了一个很好的问题以及一套很好的分析问题的方案以及对应的baseline,但是它的思路以及实现还是有一些局限性的。大概是这里的三点

首先,在WHAT和HOW的层次,我们注意到论文中两种实现的方案在search上均高度依赖RAG从记忆池中检索对应的记忆。我们知道,RAG的主要思路是对文本做嵌入,根据语义相似度检索出topk。但是语义的相似度并不等于逻辑上相关。这种检索有可能引入语义噪声,影响模型的推理。

除此之外,在WHEN和HOW的层次,我们可以看到,目前evolving memory的基本单位是轨迹级的,它带给agent的经验是长线的,也就是当且仅当agent手头的任务整体上解决的思路跟agent之前遇到的经验比较相似的时候,agent才能复用这样的经验。而实际上agent在完成任务的过程中,也有很多单步或者跨步骤的经验可以复用,但这部分原子级的经验在目前的baseline中是被忽略掉的

最后呢,在DOMAIN Specific的层次,也就是WHERE的层次上,我们发现当前的记忆复用高度依赖于具体的领域,有关具体的领域词汇。但是实际上,我们知道,人类是可以提取出一些“元经验”复用在不同领域上的。现在的agent记住的也只是一个特定领域的相关经验,而不是形式化的推理逻辑和思路。

而基于上述三点,我也提出了三个可能的进路,也希望可以跟各位交流讨论一下

从WHAT&HOW的角度,我们可以尝试用skills代替RAG。我们不再像RAG那样进行语义搜索,而是用Agentic search取而代之,将记忆封装为可以利用的skill module,让Agent渐进式地检索之,既避免了语义相关但逻辑不相关的问题,也相对比较省token。

其次,从WHEN&HOW的角度,我们可以尝试实现原子经验解耦,从记忆整个轨迹,转向对步骤级经验的提取和组合,实现更灵活的知识迁移

最后,从DOMAIN也就是WHERE的角度,我们可以尝试让Agent记住逻辑因果,而非特定领域的具体经验/知识。我们可以用代码或其他的形式化的方式记录任务背后的逻辑关系,这样,自我进化智能体就可以实现跨领域的泛化与进化

现在我们可以发现,开头的那个MAP对我们看一篇Self-evolving的工作是很有帮助的,它可以帮我们梳理思路,思考它的核心创新点,并从WHAT,WHEN,HOW这样的角度进行延伸思考。