Agent Memory的反思(四)

继上次的探讨。其实会发现,虽然现在好似各种AI概念层出不穷。但追溯它们要解决的问题,会发现仍然非常朴素,抓住这个问题再去看各个概念,会发现它们都是在此长出的枝叶。Agent Memory始终在面对的问题是: 如何把合适的内容塞入AI有限的上下文? 也就是, 如何召回?和存入什么? 的问题。

这边刻意不去讨论模型上下文的问题,意在我们可以把注意力集中在各种层出不穷的,可谓是新基建问题的Agent Memory这一概念上。作为非专业人士,我的论述可能不是很全面,佬友们有问题的欢迎指出。

在这一问题的受限度在于,其实我们能采用的召回手段相当有限,这也是我在自己做项目的时候,发现的一大痛点。召回的方法大致可以用以下内容来概括:

  1. 稀疏文本检索。也就是关键词、BM25、SQLite FTS、OpenSearch、Lucene 这一套。它非常像是我们打开搜索引擎,输入我们想要去查找的内容时,所经历的一切。好处在于,可解释、便宜、稳定、对于精确实体/术语/代码/时间很强。而问题也出在,语义的跳跃性、多语言等方面,效果就不是很好。所以它往往依赖于更好的写入、存储结构。像是从翻书进化到查字典进化到查百度(有了摘要和排序逻辑)等等。

  2. 稠密向量检索 + 重排序。这也就是非常传统的RAG路线(所以说RAG已死么?其实只是被别的概念囊括进去了罢)。Embedding 先粗召回,cross-encoder 或 LLM 再 rerank。它的优点是语义召回强,在同义表达、隐式表述、跨段落相似等方面做的就更好。但问题在于,成本高、黑箱、面对冲突问题不是很可靠,以及可能把“语义相似”误当作“任务相关”。比如:“我喜欢用Python来实现项目”,不等同于我在进行项目的时候,就要用Python来完成。

在这两种手段的基础上,我们可以很快的推导出以下可用的方法逻辑。

  1. 语义理解我们可以不交给嵌入式模型、重排序模型。我们直接让Agent自己去查,然后把查到的结果返回不就好了嘛?恭喜你,发明了Agentic retrieval / progressive retrieval。也就是让 LLM 自己把查询拆开,多轮调用检索工具,逐步扩大范围、修正搜索词、检查证据。需要注意的是,其实这一方法还是没有办法避免幻觉、腐化和成本经济性问题。
  2. 这两种查询为什么不可以都用呢?以及那我是不是造一个好的检索系统就好了?恭喜你,这里就可以自然延伸出,图结构(其实就像是系统推送一样,就是根据各种关系推断出相关的内容。AI出现与否,抖音都是如此收割大家的Attention的)或者说结构化。召回可以不只是按相似度,可以按实体、关系、事件、时间线、因果链、任务状态去走路径。就像是Map一样,我告诉AI,怎么走可以到达要去的地方。(这里的嵌入/重排序模型可以用于范围的粗筛,结果的精选等等)

所以,一个记忆系统好用与否的上限,往往不是由检索方式单独决定的。而是由写入时,或者说存储的记忆形式决定的。这么听起来挺泄气的。好像折腾来去听起来非常容易被取代。我的观点是,不是说未来会出现汽车,所以马车和马车的各个轴承等的研发就没有意义了。恰恰相反,功不唐捐。至于说以指数形式跃进故而很多东西都会失去价值的加速主义派别,我只能说,首先,我上一期说的第二个问题我觉得还是不能解决。其次,我个人觉得这样的判断,是非现实的。而关于控制器的技术,其实好像不论技术怎么发展,都是不可避免的热门问题。原因就在于,人本身的匮乏导致,我们其实不能接受,不能由我们主观掌握的东西存在。

回归整体,所以存入什么也可以这么划分为两大类。(我这个划分方法主要是便于理解,但是并非很准确的概念划分。)

  1. 对象。对象可以是原始对话、用户原话、文档片段、工具输出、代码 diff、网页来源、邮件内容、运行日志等等。以及从中抽象出的,类似用户偏好、任务状态、事实性断言、程序性记忆/方法记忆(类似于skills和工作流,其实表征的是在具体工作场景下,固定的SOP)等等。也就是说,可以是原始内容、从原始内容中提取的经验描述(正面经验 eg:偏好、负面经验 eg:问题、固定模式 eg:skills)以及对原始内容的结构化表达和索引。
  2. 关系。可以细分为对象、对象之间的关系、事件之间的因果或时序。在某种意义上来说,对原始内容的结构化表达和索引也可以被放在这里。它是把“谁和谁有关”“什么属于什么”“什么依赖什么”“什么冲突什么”这些单靠只存储对象没有办法解决的语言之外的指向性,去明白的写出来。比如昨天我在写Agent Memory相关的代码,那我今天就一定在写么?不一定,但是存在关系。如果只靠对象,那就是单点式的,而关系把隐式的逻辑给表征出来了,所以对象和对象相互连接,也就成为了图。

但需要知道的是,再怎么细的去划分,如果停留在这里,其实也只是目录学的范畴。控制的含义可以更深一步,前面的我们其实可以理解为,让AI知道什么。而往下,其实就进入到很火的harness的范畴,也就是,让AI能做什么。以下是一些有代表性的研究,大家可以去看一下。

timeline
    title Agent Memory 与 Context Management 演化时间线
    2021 : RETRO
    2022 : Memorizing Transformers
         : Recurrent Memory Transformer
    2023 : Generative Agents
         : Reflexion
         : Voyager
         : MemGPT
         : LongMem
         : MemoryBank
    2024 : LoCoMo
         : LongMemEval
         : Infini-attention
         : AriGraph
    2025 : RMM
         : MemInsight
         : A-Mem
         : MemoryOS
         : Mem0
         : Zep
         : MemoryAgentBench
    2026 : H-Mem
         : LightMem
         : AMA-Bench
         : MemoryArena
         : MemGUI-Bench
         : LongMemEval-V2
         : Memora

这里也开出几个我自己不成熟的关于技术的思考:1. 所以从本质上看,其实skills也好,tools也好,其实都是归到上下文管理。 2. 知道其实和能做是不是一回事?如果AI不知道一个工具,那么它不就不能做么?只不过我们是为了防止AI原生的世界知识的影响,越过了我们划分的知道的边界,创造出一个有限的沙盒去承载它。3. 认为LLM可以通向AGI的,前提思想是不是就是,智能可以从对世界规律的压缩、预测、建模和行动反馈中涌现出来。但从中我觉得可以进一步推到其实世界是虚拟的幻象?因为概率的潮落和聚集如果可以发挥不可匹敌的能动作用,就说明,我们自认为的“我”在,也只不过是概率的聚集罢了。

27 个赞

大佬,最近也对这个agent memory挺感兴趣,但是不知道怎么入门,基本了解也就停留在很多agent memory在用RAG做的层面。想问问大佬是怎么了解相关工作的呀?(想弥补一下信息差说是 :nerd_face:)

2 个赞

佬觉得memory会不会、会在哪些层面影响后续推理问题的回答呢?我最近在想是不是只要memory抽取到了正确的那几条信息,其他方面对推理来讲其实影响不大?我看到有专门做推理memory的,在memory内部就提前做推理的准备工作,这样是否有意义呢

1 个赞

可以了解一下楼主那张图里最近三年的工作,我感觉就能了解当前发展的现状了

1 个赞

我其实一开始也只是自己感兴趣。然后开始琢磨怎么把自己的理解落地为项目。然后开始逐步学习的。我觉得核心一个是要去做,另一个是要输出。就是你得对自己的项目不断的去理解。我印象很深的是我一开始实习的时候,我带教和我说,要在项目中学习。

看模型。其实某种意义上来说,我的理解是,其实和之前大家玩提示词一样。就是把内容丢给AI,它会根据这个进行推理。所以我理解的在memory内部,如果你说的是类似插件一样其实也是外部性的memory的话,我觉得其实和提示词是一样的,记忆也可以理解为提示词拼贴或者上下文拼贴。和skills也很相似。其实就我上面说的本质来说,是在做很相似的事情的。所以如果要问有没有意义,肯定是有意义的,因为从skills和提示词这样的静态输入,变为动态受交互影响的过程了。我个人的理解是这样

我部分见解和楼主相同
1.引入embed模型和向量数据库是非常多余沉重的,因为大模型会分析搜索字段拆解成,
2.sqllite引入也是非常多余的,因为codex在安装目录已经有完整的jsonl备份,体积巨大,数据齐全
3.唯一可以减少token损耗是索引简单化,遍历代码块,生成AST片段,这样,大模型就不要grep一次大海捞针,只需在很少的AST精准找到位置
4.Agents.md是一个好习惯,可以想象是人类的便利贴。

1 个赞

最近看到一篇论文讲memory没用,佬也可以读一下(我也还没细读)

1 个赞

这篇里面粗略看了一下,不是说memory没用的。是说只靠压缩记忆,就是我提到的从原始记忆中抽出所谓经验、偏好等。结论是这个连续整合过程本身会制造错误记忆,甚至让模型在原本会做的任务上退化。我觉得和我之前说到的幻觉问题是一样的,就是由于压缩导致的信息减损会放大幻觉。

不错的文章,作为科普文是不错的。我认为专门弄一个 agent 去管理记忆也是个不错的路子。

1 个赞

最近就在做agent memory,我现在做下来最大的感想就是:

  1. 目前大部分agent的框架已经趋同了:多层的memory架构,顶层一般是一个小而精的markdown文档(claude.md)这种,而下一层会针对一些细粒度知识搜索会从原始的session出发,也就是对于session再进行拆分和归档(openviking)这类都是如此
  2. 什么东西让模型记、什么不让模型记其实是个需要思考的问题。我不知道佬怎么想,我自己之前用hermes最大的感受就是,他对于写入顶层memory是非常谨慎的,我之前说“我喜欢xxx”这种信息她也不会记录,我自己设计的又有点过分的宽松,经常会有我在叙述一个内容,然后他也会顺手把它写入。
  3. memory的分层其实有些讲究,我很赞同佬的分层属性,哪些memory应该被一直选用,哪些memory又可能只是作为reference但不是完全的金标准,这很需要在最开始设计memory种类的时候就确认好。
  4. 跨session搜索、思维链我认为是后续需要发力的方向。其实大伙实际的使用场景是很复杂的,经常会涉及到跨session之间的隐含关系,这点我觉得目前很多memory策略做的都不行;还有一个更重要的,类似于深度学习的可解释,在你调用memory后,你应该给出完整的推理链条,这点大部分memory都做不到
1 个赞

大佬,你的前三个帖子可以贴一下吗?也想学习一下

1 个赞

从三开始看吧,前面两个我觉得写的不好,我不是很满意。关于Agent Memory的反思(三)

是的,可以看看我前面,有提到我的设计。虽然还不是很满意,我目前在跑benchmark优化算法。