解析TencentDB Agent Memory:四层记忆机制与使用指南

很多使用AI辅助编程工具的开发者都遇到过这样的困扰:明明已经提醒过工具要用HTML格式生成PPT,不要导出pptx文件,但下次开启新会话时,工具依然会返回默认格式的文件;反复纠正过的使用偏好,只要对话结束就会被清空,每次都要重新说明需求。这类问题的核心在于,绝大多数通用AI工具在对话结束后会直接销毁上下文,无法保留跨会话的持久记忆。
国内某云厂商推出的Agent记忆系统开源,该系统能够自动将碎片化的对话沉淀为可检索的长期记忆。同年7月,团队进一步升级了Memory Hub的团队记忆功能,将操作流程、团队文档、代码仓库知识、历史交互四类资产整合到同一个AI协作资源池中,目前该项目在开源社区已获得超1.1万Star的认可。
为了直观了解这款系统的实际表现,我们避开上层的AI编程工具,直接调用其自带的服务入口,通过输入对话、观察提取结果、验证检索逻辑的方式,将完整的记忆机制以可见的输入输出形式呈现出来。接下来,我们将按照Agent记忆的全生命周期,对该系统展开深度实测与技术拆解。
从个人记忆到团队协作:Agent记忆系统的完整能力
要理解Agent记忆系统的运行逻辑,可以从四个核心维度展开。一份能够被共享的记忆,首先需要具备完整性。一条记忆从产生到被调用,需要经过写入、提炼、检索、更新四个环节,每个环节环环相扣,前一步的输出是后一步的基础。任何一个环节出现问题,都会导致当前会话无法获取需要的记忆,而且这类故障往往不会抛出明确错误,只会返回空结果。
与个人记忆不同,团队记忆需要解决更复杂的问题:当多个Agent、多名团队成员共用一套记忆时,如何实现知识的跨主体迁移、如何划分访问权限、如何界定资产归属,这些都是团队级记忆需要系统性解决的课题。
Memory Hub:打通个人与团队记忆的桥梁
这款系统的团队记忆方案,将四类核心资产整合到统一资源池中:Skill模块存储经过验证的标准化操作流程,Wiki模块归档团队公共文档,CodeGraph模块记录代码仓库的关联知识,Chat Memory模块保留历史交互对话内容。经过审核与权限配置后,这些资产可以直接挂载给新的Agent,让新的协作Agent能够直接承接团队已有的工作进度,无需从零开始熟悉上下文。
与个人记忆不同,团队记忆并非个人记忆的简单扩容:个人记忆的错误只会影响自身使用,而团队记忆的偏差会被所有使用者继承;个人记忆没有明确的权限边界,但团队记忆需要清晰定义谁可以查看、修改或删除特定记忆内容。
全维度实测:Agent记忆系统的实际表现
时效性测试:从对话到可检索记忆的完整周期
我们首先测试了记忆的时效性,也就是用户说完一段内容后,系统需要多久才能将其转化为可检索的记忆。记忆写入分为两个层级:第一层是原始对话落盘,用户的对话内容会被原样写入本地流水账,整个过程仅需毫秒级,确保不会丢失任何原始信息;第二层是内容提炼,系统会在后台调用大模型,通读对话内容,按场景分类并提取核心信息,生成结构化记忆卡片,这一步是为了让记忆能够被快速检索。
我们以设置作息偏好为例,用户输入“我习惯早上6点起床跑步,晚上11点前睡觉”,助手确认后,系统立即将原始对话写入存储,没有任何等待。当我们使用“跑步”作为关键词查询时,前5秒未能检索到结果,第10秒时结构化卡片成功返回。后台日志显示,原始对话落盘后随即触发提炼任务,模型整理对话耗时约6秒,生成的卡片完整保留了用户的两条作息习惯,措辞与用户原话基本一致。
整个流程从对话结束到可检索记忆生成仅需10秒,且全程无需手动干预,自然聊天时几乎感受不到延迟。唯一需要注意的是批量载入历史对话的场景,此时需要预留一定的处理窗口,完成写入后不能立即执行查询。
提炼质量测试:不同表达节奏对记忆的影响
我们还测试了不同表达节奏对记忆提炼的影响,也就是一次性说完多条规则和分多次表述时,系统生成的卡片是否存在差异。为了避免主题重复导致的去重干扰,我们设计了两组对照实验:A组一次性说完三条项目开发规范,B组分三轮表述另外三条文档格式规范,两组都手动触发提炼以确保后台任务完成。
A组的一轮对话结束后,系统仅生成1张规则类卡片,将三条规范完整整合其中:包管理器使用pnpm而非npm、代码注释需使用中文、提交记录以中文动词开头。而B组分三轮写入后,系统生成了2张规则卡片:第一张合并了第2、3轮的两条约束——避免使用第一人称、章节标题需使用陈述句而非疑问句;第二张单独保留了第1轮的约束——统一使用Markdown格式而非Word。
尽管生成的卡片数量不同,但两张卡片共享同一个场景名称,说明系统会将分批提炼的内容判定为同一主题,差异仅在于组织粒度:一次性表述时系统倾向整合为单张卡片,分多轮表述时则会按提炼批次拆分,但所有内容仍会归属于同一场景,不会被打散。
这意味着用户无需为了让系统准确记忆而刻意一次性说完所有内容,分多轮自然表达即可,同一主题的约束会被自动归集到同一记忆场景,检索时也能一并召回,两种表达的信息完整度没有区别。
检索命中测试:不同表述下的记忆匹配能力
真实对话中,用户往往会用不同的表述方式提及同一需求,比如今天说“我完全不能吃辣”,明天问“附近有什么川菜馆”,系统能否识别出这两个表述指向同一需求,是检索环节的核心考验。
我们先将“用户完全不能吃辣,对辣味食物有严格禁忌”存入记忆库,待后台提炼完成后,使用八种不同的表述进行查询。结果显示,所有包含“辣”字的查询都能成功召回记忆,但“川菜”“忌口”“spicy food”等相关表述却无法召回。
进一步分析发现,该系统默认关闭语义召回功能,此时系统仅能通过字面匹配进行检索,因此无法识别“川菜”与“不能吃辣”之间的关联。如果开启语义召回功能,系统会同时启动第二种检索路径:将查询问题和记忆卡片分别转换为语义指纹(即通过数字坐标表征文字含义),两段文字的含义越接近,其坐标距离就越短,系统会根据语义距离判断查询与记忆是否相关。
更新演化测试:用户偏好变化后的记忆处理
用户的偏好并非一成不变,比如之前要求项目使用PostgreSQL数据库,后续又改口改用MySQL,这种情况下系统会如何处理旧的记忆记录?我们特意选择“数据库选型”作为测试话题,避免与之前的包管理器规范主题重复导致去重机制干扰测试结果。
本次测试共进行四轮对话:第一轮用户设定“项目数据库必须使用PostgreSQL”,中间两轮聊无关内容以确保旧卡片固化,第四轮用户提出“改用MySQL”。查询存储库后发现,新旧两条记忆都被保留:旧卡片的内容与编号完全保留,未被删除或修改;新卡片则明确记录了“决定将数据库从PostgreSQL切换到MySQL”,完整保留了时间顺序与变更动因。
在写入新卡片前,系统会执行冲突仲裁:先从现有记忆中检索相似的旧卡片,再将新旧内容提交给模型,由模型判断应该执行新增、跳过、覆盖还是合并操作。本次测试中语义召回功能未开启,系统仅能通过关键词检索相似内容,由于新旧记录除“数据库”三字外几乎无字面重叠,未能找到足够相似的候选,因此新内容被直接存储为一条独立的变更记录。
旧的偏好未被删除,新偏好则附带时间戳与变更原因一并存入,当后续Agent同时检索到两张卡片时,可以通过时间线与内容细节判断当前生效的偏好。
底层机制拆解:Agent记忆系统的核心设计
通过拆解系统源码,我们发现这款Agent记忆系统的设计主要分为七个核心模块:底层为四层记忆金字塔结构,上层包含写入、检索、注入三条核心链路,另外配置了冲突仲裁、短期记忆、故障降级三处兜底机制。
记忆金字塔:四层分层的存储逻辑
为何不能将所有记忆直接存储为简单列表?记忆本质是一系列事实,但无法同时满足“完整保留原始证据”与“节省Token消耗”两个需求——若要完整留存对话细节,就需要原样存储用户与助手的原话;若要提升检索效率,就需要将内容压缩为精简摘要。
该系统通过四层结构解决了这一矛盾,从底层到顶层内容越来越精简,官方将其命名为记忆金字塔:
L0层为原始流水账:每次对话结束后,系统会将用户与助手的原话原样写入本地文件并同步到数据库,不做任何提炼或修改,完整保留原始证据。
L1层为记忆卡片:系统在后台调用大模型通读对话,按场景分段并提取结构化事实,每张卡片仅记录一个核心信息,类型分为偏好、事件、规则三类,还会为每张卡片分配优先级,重要内容将排在前面。
L2层为场景档案:将同一情境下的多张记忆卡片打包为一个文件,按主题而非时间顺序组织。文件头部记录创建时间、更新时间、摘要与热度值,每被检索命中一次热度加1,热度越高的档案排序越靠前。
L3层为人格摘要:从所有场景档案中提炼出的稳定用户画像,用于描述“该用户的核心特征”,而非单次对话内容。这是四层结构中唯一无需检索即可使用的模块,每次新会话都会无条件注入,因此它必须保持足够简短与稳定,不会占用过多对话固定成本。
四层结构各司其职:L0留存原始证据,L1保障记忆精度,L2维护场景关联性,L3提升会话效率。底层存储于数据库支持全量检索,高层则以Markdown格式呈现,便于人类直接阅读和修改。四层结构还支持联动查询:从人格摘要可以下查到对应的场景档案,再从场景档案追溯到具体记忆卡片,每张卡片都带有来源标记,可一路回溯到原始对话记录。日常使用时系统会提供高密度的摘要信息,当需要溯源纠错时,则可以调取完整的原始对话证据链。
写入与提炼:异步处理的交互逻辑
分层结构解决了记忆的存储问题,接下来我们来看记忆的写入时机与处理逻辑。向记忆库写入一条新记忆仅需一个简单动作:将当前轮次的用户输入与助手回复提交给系统,原始对话会在毫秒级完成落盘,这一步仅完成“录音式”存储,不做任何语义理解。
而记忆卡片的生成并未与原始对话落盘同步,这是因为提炼过程依赖大模型的语义理解能力:“我不吃香菜”是长期使用偏好,“今天中午吃了火锅”是一次性事件,这两句话在字面文本上没有任何差异,仅通过关键词或规则统计无法区分其类型,必须依靠大模型理解内容才能正确分类。同时,大模型调用存在成本与延迟,如果将提炼过程放入主流程,用户说完一句话后需要等待模型执行完成才能收到回复,严重影响交互体验,因此提炼任务被放在后台异步执行。
我们之前实测时效时遇到的6秒等待,正是因为原始对话虽已毫秒级落盘,但必须等待后台提炼任务完成后,记忆卡片才能进入检索范围。事实上,所有具备语义提炼能力的记忆系统都存在这段时间差,差异仅在于处理速度快慢。
提炼任务默认有两个触发条件:每满5轮对话,或者用户停止输入10分钟,同时也支持手动立即触发提炼。新会话初期有一个预热机制,前几轮的提炼阈值会从1开始递增:1轮、2轮、4轮,之后才稳定为5轮,因此在对话刚开始时,第一轮就会触发提炼,无需等待满5轮对话。
每张记忆卡片的类型与优先级由大模型根据内容动态判断,没有固定的硬编码规则,这种设计的优势是灵活性强,但代价是存在一定的不可预测性,同一句话在不同上下文环境中可能被判定为不同的记忆类型。
检索与注入:平衡精度与效率的交互设计
将记忆存储完毕只是第一步,系统还需要能够从海量记忆中精准筛选出当前会话需要的内容,并将其整合到对话流程中。该系统设计了三种检索方式:
第一种是字面匹配检索:底层通过全文索引结合关键词稀有度打分实现,中文查询会先经过分词器切分为多个词汇,再以“或”的逻辑关系匹配记忆卡片,命中稀有关键词的卡片会排在更靠前的位置。这种方式的优势是速度快、成本低,但缺点是灵活性差,仅能匹配字面完全一致的内容。当记忆卡片总量较少时,稀有度打分机制会出现失真的问题,源码中为此预留了一条补救路径:当检测到这种情况时,会放弃阈值过滤,直接信任索引排序结果,我们之前实测“你能吃吗”时出现的意外命中,正是该补救路径生效的结果。
第二种是语义指纹检索:系统将查询问题与记忆卡片分别转换为一组数字坐标,两段文字的语义越接近,其坐标距离就越短,系统会根据坐标距离判断查询与记忆是否相关,因此即使字面文本没有任何重叠,也能成功召回相关内容。该方式需要额外配置一个模型服务,默认处于关闭状态,开启后不仅支持不同表述方式的召回,还能实现跨语言的记忆检索。
第三种是混合检索:同时启用字面匹配与语义指纹检索,再通过排名叠加器将两份检索结果合并为一张完整榜单。其规则非常简单:一张卡片在各自的检索结果中排名越靠前,获得的加分就越高,若卡片同时出现在两份结果中,则会累加得分。排名叠加器仅比较名次而非原始分数,这是因为字面匹配与语义相似度是两套完全不同的计分体系,直接比较原始分数没有意义,仅通过名次比较才能将两份结果合理整合。
这里有一个容易被忽略的配置陷阱:系统默认的检索策略是混合检索,但语义检索功能默认关闭,两者结合会导致检索实际降级为纯字面匹配。也就是说,零配置安装完成后,系统实际运行的仅是字面匹配检索,混合检索模式需要在配置语义服务后才会生效。
检索完成后是记忆注入环节:检索结果并非给用户查看的,而是提供给大模型使用的。每轮对话开始前,系统会将当前用户输入与记忆库进行匹配,召回最相关的几张卡片,整个过程设置了5秒的超时保护,若超时则会跳过本轮注入。
召回的记忆内容会被放置在两个位置:一处是用户消息的前方,作为本轮动态召回的记忆卡片,每轮对话都会变化;另一处是系统提示的末尾,包含人格摘要、场景导航与工具指南,这些内容通常几轮对话才会更新一次。这种分离放置的设计是因为大模型服务商会缓存系统提示这段稳定的前缀内容,命中缓存后无需重复计费,而如果将每轮都会变化的动态记忆卡片放入系统提示,会立即导致缓存失效,增加Token消耗与交互延迟。
注入环节还设有预算控制:单条记忆有长度上限,本轮注入的总字符数也有限制。此外,系统会在提示词中对Agent进行约束,要求每轮主动检索的总次数不超过3次,这属于软约束,依赖模型自觉遵守,而非代码层面的硬限流。
冲突仲裁:解决记忆矛盾的核心机制
记忆能够被准确检索和注入后,还需要解决一个核心问题:当用户前后表述出现矛盾时,系统应该如何处理?比如之前要求使用PostgreSQL数据库,后续又提出改用MySQL,这种情况下系统该保留哪一条记忆?
这类判断在工程实现上比想象中复杂很多:“必须使用PostgreSQL”与“改用MySQL”在字面文本上存在矛盾,但这种矛盾可能对应三种完全不同的场景:用户确实改变了主意,此时应该覆盖旧的记忆记录;用户正在讨论两个不同的项目,此时应该保留两条独立的记忆;用户自身表述前后不一致,此时应该同时保留两条记录,由人类使用者自行判断。
这三种场景在文本上看起来完全相同,只有结合上下文理解才能区分,因此写入一条新记忆时,需要额外调用一次大模型进行判断。
该系统采用分阶段的冲突仲裁机制:
第一阶段为候选召回,无需调用大模型。系统首先将新生成的记忆卡片转换为语义指纹,在已有的记忆库中检索距离最近的几张相似卡片,若语义检索功能不可用,则降级为关键词检索,若两种检索方式都无法生效,则跳过候选召回步骤。
第二阶段才会将内容提交给大模型进行判断。将新卡片与候选召回的旧卡片打包在一起,一次性询问模型应该执行新增、跳过、覆盖还是合并操作。
需要特别注意的是,第二阶段的判断质量完全取决于第一阶段的候选召回结果:模型只能在提供的候选卡片范围内进行判断,未被召回的旧记忆在模型眼中相当于不存在。
兜底设计:保障对话不中断的降级机制
以上介绍的都是记忆系统的正常运行路径,但我们需要考虑一个现实问题:记忆系统依附于对话主流程,任何一个环节出现卡顿或故障,都可能导致Agent无法正常回复。这也是引入记忆系统时最需要顾虑的点,因为额外的记忆处理流程很可能拖慢甚至拖垮主对话链路。
在系统源码中,明确设置了一套降级路线,其核心原则是故障容忍优先于功能完整。在检索环节:若语义检索与关键词检索都可用,则执行混合检索;若仅有一种检索方式可用,则降级为该方式;若两种方式都无法生效,则返回空结果。在写入环节:若去重判断过程超时,则直接将新内容存储为独立卡片;若语义指纹写入失败,不会影响已经落盘的原始对话记录;若检索过程超时,则跳过本轮记忆注入。最糟糕的情况是本轮对话没有可用的记忆,但对话本身仍可以继续进行。
除此之外,系统还针对长任务场景设计了额外的优化方案:当你让Agent修改一个跨十几个文件的bug时,它会反复调用工具、读取报错信息、再次调用工具,经过几十轮对话后,上下文窗口会被完全撑爆。
该系统的解决方案是将详细的执行过程转存到外部文件,仅在对话上下文中保留一张任务地图。这张地图通过节点与箭头展示任务状态的流转过程,每个节点都标注了编号与下一步动作,当Agent需要核对具体细节时,可以通过编号回溯到对应的详细记录。这种设计思路与长期记忆的逻辑一致:平时提供折叠后的精简视图,当需要详细信息时再展开查看完整内容。根据官方在WideSearch长任务基准上的测试数据,该方案将Token消耗从2.21亿降至8500万,任务通过率从33%提升至50%。
写在最后:Agent记忆系统的未来趋势
在默认配置下,该系统使用本地SQLite进行存储,安装完成后即可直接使用。如果希望替换为自定义的大模型来执行提炼与人格摘要生成,仅需要填写三项信息:模型的访问凭证、服务地址与模型名称。
从接入方式来看,系统支持三种部署路径:作为Agent平台插件进行安装、通过统一网关进行调用,或者直接在自研项目中引用。安装完成后,有一个关键配置需要提前考虑:是否开启语义召回功能。如果你的Agent仅需要记住格式规范、工具偏好等表述固定的内容,则无需开启该功能;若Agent需要理解自然语言表达的个性化偏好,则需要开启语义召回。
在过去,构建一套完整的Agent记忆系统需要从零开发所有底层功能,包括向量化、相似度检索、结果重排序等应用层任务,而现在这类能力已经被封装为可直接安装的选项。Agent所需的记忆能力正在从应用层下沉到数据库层——数据库已经为人类存储了数十年的数据,如今它也开始成为AI存储持久记忆的基础设施。


