Agent的跨会话记忆有什么用?和skill有什么不同?一般是如何实现的?结合最近的开源项目说一下

回复 群友 2434 1、跨会话记忆(Long-term Memory)有什么用 每次新开窗口,模型的上下文都是空的。跨会话记忆的核心作用是消除“失忆成本”,把散落在历史对话里的关键信息持久化: 一是用户与环境画像,比如你的技术栈偏好、代码规范、过敏原,不用每次重说。 二是历史经验与纠错(Episodic Memory),比如上次修某个 bug 踩过的坑、管理员给 pa 纠正过的规则,下次遇到同类场景直接避坑。 三是跨周期任务状态,像长线项目推进到哪一步、待办卡在哪,新会话能直接续上。 2、和 Skill 有什么本质不同 用认知心理学类比最清楚:记忆是陈述性知识(What / Who,知道什么事实和经历),Skill 是程序性知识(How,知道怎么干活的 SOP 和工具包)。 两者的核心差异在四个维度: 第一,内容形态不同:记忆存的是针对特定用户或项目的状态、事实碎片和历史轨迹(如“这个 repo 用 pnpm 且禁掉 eslint 某规则”);Skill 存的是可复用的工作流指令、脚本和模板(如“怎么按规范跑单测和提 PR”)。 第二,生成与演进方式不同:记忆是在日常对话中动态提取、合并、衰减的,千人千面;Skill 通常是人为编写或刻意沉淀的标准化能力包,可以跨用户分发共享。 第三,触发机制不同:记忆靠语义检索、图检索或开机默认加载注入上下文;Skill 靠意图路由按需挂载。 第四,维护与生命周期不同:记忆的核心难点是“防脏数据”,要解决什么该记(比如“今天想吃辣”是临时起意,“对花生过敏”才是长期事实)、新旧状态冲突怎么覆盖、过时信息怎么遗忘;而 Skill 的生命周期重在“防膨胀”,Skill 不是越多越好,装多了会导致路由冲突和上下文污染,必须定期评估重复与维护成本,随基座模型能力升级不断复测,把模型原生已经能做好的 Skill 淘汰掉。 3、一般怎么实现(结合近期主流开源项目) 目前开源界做跨会话记忆主要分化出三条技术路线,各有取舍: 路线一:本地 Markdown 文件流(代表项目:OpenCode、Claude Code、Hermes、Aider) 直接在本地维护 MEMORY.md、CLAUDE.md 或 user.md,给 ca 或 pa 配好读写文件工具,开机自动读核心配置,对话中显式改写文件。 洞察:看着最土,但在 ca 场景里最好用。因为纯文本完全透明、人类可读可手改,还能直接跟 Git 走版本控制,不会出现向量库搜出一堆莫名其妙黑盒碎片的幻觉问题。缺点是文件大了以后检索粒度粗,不适合多租户长周期的海量对话。 路线二:LLM 提取管线 + 向量/图混合存储(代表项目:Mem0、Zep / Graphiti) 每次对话结束,后台跑一个轻量提取模型,把对话拆成原子事实,再去跟库里的旧记忆比对,执行 ADD(新增)、UPDATE(冲突覆盖)或 DELETE(淘汰)。 其中 Mem0 主打轻量混合存储(Vector + KV + Graph),接入成本低;Zep 开源的 Graphiti 引擎则专门做“时序知识图谱(Temporal Knowledge Graph)”,给每条关系边打上生效和失效时间戳。 洞察:这类方案重点解决“状态随时间变化”的问题(比如用户从 A 公司跳槽到 B 公司,普通 RAG 会把两家公司同时召回导致错乱,带时序的图谱能只保留最新状态并保留历史脉络)。代价是每次写入都要调大模型做提取和冲突消解,Token 成本和延迟都不低。 路线三:操作系统式虚拟内存自管理(代表项目:Letta,原名 MemGPT) 把上下文当成有限的计算机内存(RAM),外部数据库当磁盘。它不靠外置流水线被动提取,而是直接给 Agent 一组内存操作工具(如 core_memory_replace、archival_memory_search),让模型自己在推理过程中决定把哪段重要信息写进常驻内存块、把哪段旧上下文换出到磁盘。 洞察:上限高、自主性强,适合常驻后台的 pa,但对基座模型的工具调用稳定性和指令遵循能力要求极高,小模型很容易忘了存或者把内存块改乱。