Agent 中的记忆系统:短期记忆、长期知识库与情境缓存最佳实践
Agent 中的记忆系统短期记忆、长期知识库与情境缓存最佳实践摘要/引言开门见山当我们说AI Agent要“有记忆”时我们在说什么你有没有过这样的经历和OpenAI的ChatGPT连续聊了20轮Python爬虫优化突然它忘了你之前提到的那个带验证码的B站弹幕接口、那个用来处理反爬虫的ua池配置文件路径、甚至忘了你是要爬取**《三体》动画全季评论词云而非弹幕词频排序**再比如你部署了一个金融咨询Agent在公司内部昨天财务总监问了它Q3季度现金流波动的阈值预警公式今天副总裁又问同样的问题它却从头开始从央行公开市场政策的术语解释推导浪费了整整5分钟副总裁的宝贵时间更糟的是当财务总监和副总裁一起问这个阈值预警公式在他们各自部门生产采购部销售回款部的调整建议时它连两个部门昨天和今天单独咨询的业务细节比如生产采购部Q3新增了东南亚的钛材供应商、销售回款部调整了长三角大客户的30%预付款比例到60%都完全记不起来。这不是大语言模型LLM本身的“智商”问题——毕竟GPT-4o mini在数学推理、代码生成上已经能打985高校计算机系大三学生的水平——这是Agent架构中“缺失的核心组件”一个设计合理、分层清晰、检索高效、更新及时的记忆系统Memory System。问题陈述为什么当前大部分AI Agent都“健忘”且“低效”如果把Agent比作一个“虚拟的职场助理”那么LLM就是它的“大脑前额叶”——负责逻辑推理、语言理解、决策生成但人脑的前额叶工作内存Working MemoryWM容量是有限的Miller的“神奇数字7±2”虽然现代神经科学修正为“4±1”语义组块但对于大段代码、多轮历史对话、大量结构化业务数据来说仍然杯水车薪。为了弥补这个缺陷人脑进化出了海马体短期记忆→长期记忆的转化器、大脑皮层长期存储区语义记忆、情景记忆、程序记忆、甚至是肌肉记忆对应Agent的“工具记忆/执行历史”。但在当前的Agent开发实践中大部分开发者要么是“简单粗暴派”直接把所有能找到的历史对话、业务文档都塞进LLM的上下文窗口Context Window里指望LLM自己“筛选”有用信息——结果要么是上下文窗口溢出比如Claude 3 Opus的200K token虽然能装下很多但单个Agent的运行成本会飙升到每分钟几十甚至上百美元完全不适合大规模商业化部署要么是LLM被无关信息淹没比如把整个金融行业2024年的半年报都塞进去财务总监问的只是本公司钛材供应商的账期问题LLM却给你分析了全球钛白粉价格走势要么是“懒省事派”干脆只用LLM的原生对话历史通常只有最近的5-10轮导致Agent完全没有长期业务知识、没有多用户协作的共享记忆、甚至连单个用户多轮任务的上下文都连不起来还有一部分开发者是“入门尝试派”知道要加向量数据库Vector DB做长期记忆但要么不知道怎么分层存储比如把情景记忆、语义记忆、程序记忆混在同一个向量库的同一个collection里要么不知道怎么高效检索比如只用余弦相似度检索完全忽略时间衰减、相关性衰减、用户权限、任务优先级这些关键因素要么不知道怎么更新维护比如新的业务文档上线了旧的文档没有软删除/标记过期导致Agent反复引用过时信息。核心价值掌握Agent记忆系统的分层架构与最佳实践你能得到什么如果你能按照本文介绍的**“三层记忆金字塔模型Three-Layer Memory Pyramid Model”**——短期记忆STM、情境缓存Situation Cache属于STM的优化扩展、长期知识库LTM又分为语义记忆、情景记忆、程序记忆、工具记忆四个子模块——来设计和实现你的AI Agent你将能够大幅降低运行成本不再需要把所有信息都塞进昂贵的大上下文窗口LLM里而是用向量数据库轻量级关键词检索Hybrid Search筛选出最相关的1K-5K token信息单个Agent的推理成本可以降低90%以上显著提升Agent的“智力连续性”和“任务连贯性”单个用户多轮对话的历史不会因为超过5轮就丢失跨用户、跨会话的共享业务知识可以随时调用Agent可以像真正的职场助理一样“理解上下文、记住承诺、追踪进度”有效避免“过时信息引用”和“无关信息干扰”通过时间衰减算法、过期标记机制、相关性重排序算法确保Agent只引用最新、最相关、最符合用户权限的信息支持复杂的多Agent协作场景比如一个“产品研发Agent团队”——产品经理Agent负责提需求、架构师Agent负责设计方案、前端工程师Agent负责写UI代码、后端工程师Agent负责写API代码——它们可以通过共享的“团队记忆库Team Memory”来同步需求文档、架构设计图、代码评审意见、测试报告等信息无需人工干预就能完成从需求到上线的全流程协作。文章概述本文将要带你走过的“Agent记忆系统开发之旅”本文将按照**“理论基础→架构设计→核心实现→最佳实践→未来展望”**的逻辑顺序循序渐进地讲解Agent记忆系统的所有核心内容第一部分Agent记忆系统的理论基础首先我们会回顾认知科学中的记忆模型Atkinson-Shiffrin的三阶段记忆模型、Baddeley的工作记忆模型、Tulving的长时记忆分类为Agent记忆系统的设计提供“仿生学灵感”然后我们会定义Agent记忆系统的核心概念短期记忆、情境缓存、长期知识库、语义记忆、情景记忆、程序记忆、工具记忆、检索、重排序、更新、维护接着我们会用概念对比表、ER实体关系图、交互关系图来梳理这些概念之间的关系最后我们会介绍Agent记忆系统中用到的核心数学模型余弦相似度、点积相似度、欧氏距离、时间衰减函数、相关性重排序的BM25算法和RRF融合算法。第二部分Agent记忆系统的架构设计首先我们会提出本文的核心架构——三层记忆金字塔模型的Agent实现版然后我们会分别讲解每个记忆层的功能设计、输入输出设计、存储介质选型接着我们会用Mermaid架构图来展示整个记忆系统的整体架构和数据流向最后我们会介绍Agent记忆系统的接口设计检索接口、更新接口、删除接口、同步接口。第三部分Agent记忆系统的核心实现PythonLangChainChromaDB首先我们会列出实现Agent记忆系统所需的环境和工具Python 3.10、LangChain 0.1.x、ChromaDB 0.4.x、OpenAI API Key/Claude API Key/本地开源LLM然后我们会用Mermaid流程图来展示每个记忆层的核心实现流程接着我们会提供每个记忆层的完整Python源代码带有详细的注释最后我们会用一个实际的场景案例个人金融助理Agent来演示整个记忆系统的使用方法。第四部分Agent记忆系统的最佳实践首先我们会分享短期记忆的最佳实践历史对话的压缩方式、上下文窗口的动态调整、记忆的“遗忘机制”然后我们会分享情境缓存的最佳实践缓存的触发条件、缓存的更新策略、缓存的过期机制接着我们会分享长期知识库的最佳实践文档的预处理方式、向量模型的选型、检索策略的设计、更新维护的流程再然后我们会分享多Agent协作场景下的记忆系统最佳实践团队记忆库的设计、权限控制的机制、记忆同步的策略最后我们会分享Agent记忆系统的性能优化最佳实践向量数据库的索引优化、检索结果的缓存优化、轻量级关键词检索的实现。第五部分Agent记忆系统的行业发展与未来展望首先我们会用Markdown表格来梳理Agent记忆系统的问题演变发展历史从早期的“无记忆Agent”到现在的“分层记忆Agent”再到未来的“自主进化记忆Agent”然后我们会讨论Agent记忆系统的当前研究热点自适应检索、元记忆、神经符号记忆、终身学习记忆最后我们会展望Agent记忆系统的未来发展趋势与脑机接口的结合、与区块链的结合、通用人工智能AGI的核心组件。第六部分本章小结其实是全文小结我们会简要回顾本文的主要内容我们会再次强调掌握Agent记忆系统分层架构与最佳实践的重要性我们会提出一个开放性问题以引发讨论我们会邀请读者在评论区分享他们的想法或问题我们会列出参考文献/延伸阅读我们会附上作者简介。一、 Agent记忆系统的理论基础1.1 认知科学中的记忆模型仿生学灵感的来源在设计Agent记忆系统之前我们有必要先了解一下人脑的记忆机制——毕竟人脑是目前已知的最强大、最高效的“通用智能记忆系统”。认知科学家们经过几十年的研究提出了多个经典的记忆模型这些模型为Agent记忆系统的设计提供了直接的“仿生学灵感”。1.1.1 Atkinson-Shiffrin的三阶段记忆模型1968Atkinson和Shiffrin在1968年提出了第一个被广泛接受的记忆模型——三阶段记忆模型Three-Stage Memory Model也被称为“模态模型Modal Model”。这个模型将人脑的记忆分为三个连续的阶段感觉记忆Sensory Memory也叫“瞬时记忆”是记忆系统的第一个入口。感觉记忆的容量非常大几乎可以存储所有的感官输入信息但存储时间非常短视觉感觉记忆约为0.25-1秒听觉感觉记忆约为2-4秒。感觉记忆的作用是“暂时保留感官输入信息以便大脑有时间筛选出有用的信息进行进一步处理”。短期记忆Short-Term MemorySTM也叫“工作记忆的前身”是记忆系统的第二个阶段。短期记忆的容量非常有限Miller的“神奇数字7±2”语义组块比如你可以同时记住7个左右的随机数字、7个左右的单词、7个左右的电话号码但存储时间比感觉记忆长一些约为15-30秒如果不进行复述Rehearsal的话。短期记忆的作用是“暂时存储和处理正在进行的任务所需的信息”。长期记忆Long-Term MemoryLTM是记忆系统的第三个阶段也是最后一个阶段。长期记忆的容量几乎是无限的理论上可以存储人一生中所有的经历、知识、技能存储时间也非常长从几分钟到几十年甚至一辈子。长期记忆的作用是“永久存储已经处理过的、对未来有用的信息”。Atkinson-Shiffrin的三阶段记忆模型还提出了记忆的转化机制感觉记忆中的信息只有通过**注意Attention**才能转化为短期记忆短期记忆中的信息只有通过**复述Maintenance Rehearsal机械复述或精细复述Elaborative Rehearsal将新信息与已有的长期记忆联系起来**才能转化为长期记忆长期记忆中的信息可以通过**提取Retrieval**回到短期记忆中进行处理。虽然现代神经科学已经对Atkinson-Shiffrin的三阶段记忆模型进行了一些修正比如提出了“工作记忆模型”来替代“短期记忆的前身”的说法但这个模型的核心思想——分层存储、注意力筛选、复述转化、提取使用——仍然是Agent记忆系统设计的基础。1.1.2 Baddeley的工作记忆模型19742000修订版Atkinson-Shiffrin的三阶段记忆模型将短期记忆视为一个“单一的、被动的存储单元”但Baddeley和Hitch在1974年通过实验发现短期记忆实际上是一个**“复杂的、主动的加工系统”——它不仅可以存储信息还可以同时处理多个任务的信息。于是他们提出了工作记忆模型Working Memory Model**并在2000年进行了修订。2000年修订版的Baddeley工作记忆模型包括四个子组件语音回路Phonological Loop负责处理和存储语音/听觉信息包括两个子部分语音存储Phonological Store也叫“内耳”可以存储语音信息约为1.5-2秒发音复述装置Articulatory Rehearsal Process也叫“内嘴”可以通过无声的复述来刷新语音存储中的信息或者将视觉信息转化为语音信息存储到语音存储中。视觉空间模板Visuospatial Sketchpad负责处理和存储视觉/空间信息包括两个子部分视觉缓存Visual Cache负责存储视觉形状、颜色等信息内部抄写器Inner Scribe负责处理空间位置、运动轨迹等信息。情景缓冲器Episodic Buffer2000年修订版新增的子组件负责整合语音回路、视觉空间模板和长期记忆中的信息形成一个“连贯的情景表征”。情景缓冲器的容量约为4个语义组块存储时间也比较短。中央执行系统Central Executive System是工作记忆模型的“核心指挥官”负责注意力分配、任务切换、子组件协调等高级认知功能。中央执行系统本身不存储信息它只是一个“控制中心”。Baddeley的工作记忆模型为Agent记忆系统的**短期记忆优化即本文提出的“情境缓存”**提供了直接的灵感我们可以将Agent的短期记忆分为“对话历史缓存”对应语音回路、“视觉/图表信息缓存”对应视觉空间模板、“当前任务情景缓冲器”对应情景缓冲器和“中央控制模块”对应中央执行系统从而让Agent的短期记忆不仅可以存储信息还可以同时处理多个任务的信息、整合来自不同来源的信息。1.1.3 Tulving的长时记忆分类19721985修订版Atkinson-Shiffrin的三阶段记忆模型将长期记忆视为一个“单一的存储单元”但Tulving在1972年通过实验发现长期记忆实际上可以分为两个独立的子系统——语义记忆Semantic Memory和情景记忆Episodic Memory并在1985年进行了修订新增了**程序记忆Procedural Memory**的分类不过程序记忆通常被认为是“内隐记忆Implicit Memory”的一部分而语义记忆和情景记忆通常被认为是“外显记忆Explicit Memory”的一部分。2000年之后认知科学家们又将Tulving的长时记忆分类扩展为四个子系统外显记忆内隐记忆的结合外显记忆Explicit Memory也叫“陈述性记忆Declarative Memory”是指可以有意识地回忆起来的记忆包括两个子部分语义记忆Semantic Memory是指关于“世界的一般知识”的记忆比如“北京是中国的首都”、“235”、“Python是一种解释型编程语言”。语义记忆不依赖于特定的时间和地点它是“客观的、通用的”。情景记忆Episodic Memory是指关于“个人经历的特定事件”的记忆比如“我昨天下午3点在星巴克和张三喝了咖啡讨论了Agent记忆系统的设计方案”、“我第一次用Python写爬虫是在2020年的冬天爬取了豆瓣电影Top250的信息”。情景记忆依赖于特定的时间和地点它是“主观的、个人的”。内隐记忆Implicit Memory也叫“非陈述性记忆Non-Declarative Memory”是指不能有意识地回忆起来但可以通过行为表现出来的记忆包括两个子部分程序记忆Procedural Memory是指关于“如何做事情”的记忆比如“如何骑自行车”、“如何用Python写一个for循环”、“如何处理反爬虫的验证码”。程序记忆通常是通过“反复练习”获得的一旦获得就很难忘记。启动效应Priming Effect是指“之前接触过的信息会对之后的信息处理产生影响”的现象比如“如果你之前看到过‘医生’这个词那么之后你看到‘护士’这个词的反应速度会比看到‘面包’这个词的反应速度快”。Tulving的长时记忆分类为Agent记忆系统的长期知识库设计提供了直接的灵感我们可以将Agent的长期知识库分为“语义记忆库”、“情景记忆库”、“程序记忆库”和“工具记忆库对应启动效应和程序记忆的结合”四个子模块从而让Agent的长期知识库不仅可以存储客观的通用知识还可以存储主观的个人经历、可执行的程序技能和可复用的工具调用历史。1.2 Agent记忆系统的核心概念定义清楚才能设计合理在了解了认知科学中的记忆模型之后我们需要定义清楚Agent记忆系统的核心概念——只有定义清楚了这些概念我们才能设计出合理的Agent记忆系统。1.2.1 短期记忆Short-Term MemorySTM核心概念Agent的短期记忆是指暂时存储和处理当前正在进行的会话/任务所需的信息的记忆层。问题背景LLM的原生上下文窗口虽然可以存储一些信息但一方面大上下文窗口LLM的运行成本非常高另一方面LLM被无关信息淹没的风险也非常大。因此我们需要一个独立于LLM原生上下文窗口的、容量可控的、成本低廉的短期记忆层。问题描述如何设计一个短期记忆层让它可以存储当前会话/任务所需的信息同时又不会占用太多的LLM上下文窗口问题解决将短期记忆层分为“原始对话历史存储区”和“压缩对话历史存储区”其中“压缩对话历史存储区”的内容会被定期送入LLM的原生上下文窗口中进行处理。边界与外延边界短期记忆层的存储容量通常被限制在“10-50轮对话”或“5K-20K token”之间具体数值取决于LLM的原生上下文窗口大小和任务的复杂程度短期记忆层的存储时间通常被限制在“当前会话结束”或“当前任务完成”之后的“1-24小时”之间短期记忆层的信息通常不会直接存储到长期知识库中除非通过“主动复述”或“任务完成后的总结归档”机制。外延短期记忆层的优化扩展是“情境缓存Situation Cache”我们会在1.2.2节详细介绍。1.2.2 情境缓存Situation Cache核心概念情境缓存是Agent短期记忆的优化扩展是指暂时存储和处理当前正在进行的会话/任务的“核心情景表征”的记忆层——这里的“核心情景表征”是指整合了“对话历史压缩内容”、“当前任务的目标/状态/进度”、“已调用的工具的输入输出”、“用户的基本信息/偏好/权限”、“当前时间/地点/环境”等信息的一个“连贯的、结构化的、易于检索的”数据结构。问题背景Baddeley的工作记忆模型告诉我们人脑的短期记忆不仅可以存储信息还可以同时处理多个任务的信息、整合来自不同来源的信息——但传统的Agent短期记忆层只是简单的对话历史列表显然做不到这一点。因此我们需要一个类似Baddeley情景缓冲器的情境缓存层。问题描述如何设计一个情境缓存层让它可以整合来自不同来源的信息形成一个连贯的核心情景表征同时又可以快速更新和检索问题解决将情境缓存层设计为一个**“结构化的JSON对象”或“知识图谱Knowledge Graph的子图”**其中包含了当前会话/任务的所有核心情景信息同时使用“事件驱动Event-Driven”的机制来更新情境缓存层——每当发生一个“重要事件”比如用户输入了新的消息、Agent调用了工具、Agent生成了新的回复、任务的状态发生了变化就更新情境缓存层中的相应内容。边界与外延边界情境缓存层的存储容量通常被限制在“1K-5K token”之间情境缓存层的存储时间通常被限制在“当前会话结束”或“当前任务完成”之后的“1-24小时”之间情境缓存层的信息通常会在“任务完成后的总结归档”机制中被提取出来作为“情景记忆”的一部分存储到长期知识库中。外延情境缓存层可以进一步扩展为“多任务情境缓存层”支持Agent同时处理多个任务的信息情境缓存层也可以进一步扩展为“多用户情境缓存层”支持多用户协作场景下的核心情景表征共享。1.2.3 长期知识库Long-Term MemoryLTM核心概念Agent的长期知识库是指永久或长期存储已经处理过的、对未来有用的信息的记忆层。问题背景人脑的长期记忆容量几乎是无限的可以存储人一生中所有的经历、知识、技能——但传统的Agent要么没有长期知识库要么只是用一个简单的向量数据库存储所有的信息没有分层、没有分类、没有高效的检索和更新机制。因此我们需要一个类似人脑长期记忆的、分层分类的、容量几乎无限的、检索高效的、更新及时的长期知识库。问题描述如何设计一个长期知识库让它可以分层分类存储不同类型的信息同时又可以高效检索、及时更新、避免过时信息引用和无关信息干扰问题解决将长期知识库分为“语义记忆库”、“情景记忆库”、“程序记忆库”和“工具记忆库”四个子模块使用“混合检索Hybrid Search”策略向量相似度检索轻量级关键词检索来检索信息使用“时间衰减算法”、“过期标记机制”、“相关性重排序算法”来筛选和排序检索结果使用“事件驱动”的机制来更新长期知识库——每当有新的信息需要存储比如任务完成后的总结归档、新的业务文档上线、用户主动添加的知识就更新长期知识库中的相应内容。边界与外延边界长期知识库的存储容量几乎是无限的取决于存储介质的容量长期知识库的存储时间可以是“永久”的也可以是“根据业务需求设置的过期时间”长期知识库的信息通常需要通过“检索”机制才能回到短期记忆层中进行处理。外延长期知识库可以进一步扩展为“团队记忆库Team Memory”支持多Agent协作场景下的信息共享长期知识库也可以进一步扩展为“公共知识图谱Public Knowledge Graph”支持多个不同的Agent共享通用的知识长期知识库还可以进一步扩展为“终身学习记忆库Lifelong Learning Memory”支持Agent自主学习和更新知识。1.2.4 语义记忆库Semantic Memory Base核心概念语义记忆库是长期知识库的第一个子模块是指存储客观的、通用的、不依赖于特定时间和地点的知识的记忆库。问题背景Agent需要具备一些“世界的一般知识”才能正常工作——比如一个金融咨询Agent需要知道“GDP是什么”、“CPI是什么”、“利率和汇率的关系是什么”——但这些知识如果都通过LLM的预训练数据来获取一方面LLM的预训练数据可能不是最新的比如GPT-4o的预训练数据截止到2024年5月它不知道2024年6月之后的央行利率调整信息另一方面Agent可能需要一些“特定领域的专业知识”比如本公司的财务制度、本公司的产品信息这些知识通常不会出现在LLM的预训练数据中。因此我们需要一个独立于LLM预训练数据的、可更新的、可定制的语义记忆库。问题描述如何设计一个语义记忆库让它可以存储客观的、通用的、特定领域的专业知识同时又可以高效检索、及时更新问题解决将语义记忆库中的知识分为“通用知识General Knowledge”和“特定领域知识Domain-Specific Knowledge”两个子部分使用“向量数据库”来存储语义记忆库中的知识——将每一条知识可以是一个句子、一个段落、一个文档的片段转化为一个“向量嵌入Vector Embedding”然后存储到向量数据库中使用“混合检索”策略来检索语义记忆库中的知识使用“版本控制Version Control”机制来管理语义记忆库中的知识——每当有新的知识版本上线就标记旧的知识版本为“过期”但不删除以便追溯。边界与外延边界语义记忆库中的知识是“客观的、通用的、不依赖于特定时间和地点的”语义记忆库中的知识通常是“静态的”或者“更新频率较低的”比如本公司的财务制度可能每年更新一次而央行的利率调整信息可能每月更新一次语义记忆库中的知识通常是“结构化的”或者“半结构化的”比如可以用JSON、XML、Markdown等格式存储。外延语义记忆库可以进一步扩展为“知识图谱Knowledge Graph”支持更复杂的知识推理比如“张三是李四的经理李四是王五的同事那么张三和王五是什么关系”语义记忆库也可以进一步与“公共知识图谱比如Wikidata、DBpedia”集成获取更多的通用知识。1.2.5 情景记忆库Episodic Memory Base核心概念情景记忆库是长期知识库的第二个子模块是指存储主观的、个人的、依赖于特定时间和地点的“事件/经历”的记忆库。问题背景Agent需要记住“与用户的每一次交互”、“每一次完成的任务”、“每一次犯的错误”才能更好地为用户服务——比如一个个人金融助理Agent需要记住“用户昨天下午3点问了Q3季度现金流波动的阈值预警公式”、“用户上个月5号买了10万元的沪深300指数基金”、“用户不喜欢风险太高的投资产品”——但这些信息如果都通过短期记忆层来存储显然会很快丢失。因此我们需要一个独立于短期记忆层的、可检索的、可更新的情景记忆库。问题描述如何设计一个情景记忆库让它可以存储主观的、个人的、依赖于特定时间和地点的事件/经历同时又可以高效检索、及时更新、避免过时信息引用问题解决将情景记忆库中的每一个“事件/经历”存储为一个“结构化的JSON对象”其中包含了“事件ID”、“用户ID”、“会话ID”、“任务ID”、“事件类型”、“事件时间”、“事件地点如果有的话”、“事件内容可以是文本、图片、音频、视频等”、“事件的重要性评分”、“事件的标签”等字段使用“向量数据库”来存储事件内容的向量嵌入同时使用“关系型数据库比如MySQL、PostgreSQL”来存储事件的结构化元数据使用“混合检索”策略来检索情景记忆库中的信息——先用关系型数据库筛选出符合“用户ID”、“时间范围”、“事件类型”、“标签”等条件的事件然后用向量数据库筛选出符合“内容相似度”条件的事件最后用“相关性重排序算法”和“时间衰减算法”来排序检索结果使用“过期标记机制”来管理情景记忆库中的信息——比如可以设置“用户个人的消费记录”永久保存而“用户与Agent的普通闲聊记录”保存1年之后自动标记为“过期”并软删除。边界与外延边界情景记忆库中的信息是“主观的、个人的、依赖于特定时间和地点的”情景记忆库中的信息通常是“动态的”或者“更新频率较高的”比如用户与Agent的每一次交互都会产生一个新的事件情景记忆库中的信息通常需要“用户权限控制”——比如一个公司内部的金融咨询Agent财务总监只能查看自己和自己部门员工的情景记忆而不能查看副总裁的情景记忆。外延情景记忆库可以进一步扩展为“多用户情景记忆库”支持多用户协作场景下的事件/经历共享情景记忆库也可以进一步扩展为“情感记忆库Emotional Memory Base”存储用户在每一次交互中的情感状态比如“开心”、“生气”、“焦虑”、“满意”从而让Agent可以更好地“共情”用户情景记忆库还可以进一步与“日历应用”、“邮件应用”、“笔记应用”等第三方应用集成获取更多的用户个人经历信息。1.2.6 程序记忆库Procedural Memory Base核心概念程序记忆库是长期知识库的第三个子模块是指存储“如何做事情”的“可执行的程序/步骤/规则/模板”的记忆库。问题背景Agent需要具备一些“可执行的程序/步骤/规则/模板”才能更好地完成任务——比如一个个人金融助理Agent需要知道“如何查询用户的银行账户余额”、“如何计算用户的投资收益率”、“如何给用户生成一份月度财务报告”——但这些程序/步骤/规则/模板如果都通过LLM的推理来生成一方面LLM的推理可能会出错比如计算投资收益率的公式可能会写错另一方面LLM的推理成本也比较高、推理时间也比较长。因此我们需要一个独立于LLM推理的、可验证的、可复用的、成本低廉的程序记忆库。问题描述如何设计一个程序记忆库让它可以存储可执行的程序/步骤/规则/模板同时又可以高效检索、及时更新、可验证、可复用问题解决将程序记忆库中的内容分为“步骤型程序Step-by-Step Procedure”、“规则型程序Rule-Based Procedure”、“模板型程序Template-Based Procedure”和“代码型程序Code-Based Procedure”四个子部分使用“关系型数据库”来存储程序的结构化元数据比如“程序ID”、“程序名称”、“程序类型”、“适用场景”、“输入参数”、“输出参数”、“验证状态”、“创建时间”、“更新时间”、“创建者”、“更新者”等同时使用“文件系统”或“对象存储比如AWS S3、阿里云OSS”来存储程序的具体内容比如步骤型程序可以用Markdown格式存储规则型程序可以用JSON或YAML格式存储模板型程序可以用Jinja2或Mustache格式存储代码型程序可以用Python或JavaScript格式存储使用“轻量级关键词检索”或“语义相似度检索”来检索程序记忆库中的内容——比如可以用“适用场景”、“程序名称”、“输入参数”、“输出参数”等关键词进行检索也可以用“用户的当前任务描述”转化为向量嵌入后进行语义相似度检索使用“版本控制”机制来管理程序记忆库中的内容——每当有新的程序版本上线就需要经过“验证”比如可以用单元测试、集成测试、人工审核等方式进行验证才能被Agent使用使用“权限控制”机制来管理程序记忆库中的内容——比如只有“管理员”才能创建和更新程序而“普通Agent”只能检索和使用已验证的程序。边界与外延边界程序记忆库中的内容是“可执行的、可验证的、可复用的”程序记忆库中的内容通常是“静态的”或者“更新频率较低的”比如“如何给用户生成一份月度财务报告”的模板可能每月更新一次而“如何计算用户的投资收益率”的公式可能永远不会更新程序记忆库中的内容通常需要“验证”才能被Agent使用——避免Agent执行错误的程序。外延程序记忆库可以进一步扩展为“Agent技能库Agent Skill Library”支持Agent自主学习和获取新的技能程序记忆库也可以进一步与“低代码/无代码平台”集成让非技术人员也可以创建和更新程序程序记忆库还可以进一步与“GitHub”、“GitLab”等代码托管平台集成获取更多的开源代码型程序。1.2.7 工具记忆库Tool Memory Base核心概念工具记忆库是长期知识库的第四个子模块是指存储“已调用的工具的输入输出”、“工具的使用频率”、“工具的使用效果”、“工具的错误处理经验”的记忆库——工具记忆库对应认知科学中的“启动效应”和“程序记忆的结合”。问题背景Agent需要调用各种“工具”才能完成复杂的任务——比如一个个人金融助理Agent需要调用“银行账户查询工具”、“股票行情查询工具”、“投资收益率计算工具”、“月度财务报告生成工具”等——但如果Agent每次调用工具都“从零开始”不知道“这个工具之前有没有被调用过”、“这个工具的输入参数应该怎么设置”、“这个工具的输出结果应该怎么处理”、“这个工具之前犯过什么错误、应该怎么避免”那么Agent的效率会非常低、错误率也会非常高。因此我们需要一个独立于程序记忆库的、可检索的、可更新的工具记忆库。问题描述如何设计一个工具记忆库让它可以存储已调用的工具的输入输出、使用频率、使用效果、错误处理经验同时又可以高效检索、及时更新、帮助Agent提高效率和降低错误率问题解决将工具记忆库中的每一个“工具调用记录”存储为一个“结构化的JSON对象”其中包含了“工具调用记录ID”、“用户ID”、“会话ID”、“任务ID”、“工具ID”、“工具名称”、“工具输入参数”、“工具输出结果”、“工具调用时间”、“工具调用是否成功”、“工具调用的错误信息如果有的话”、“工具调用的错误处理经验如果有的话”、“用户对工具调用结果的满意度评分如果有的话”等字段使用“关系型数据库”来存储工具调用记录的结构化元数据同时使用“向量数据库”来存储“工具输入参数”、“工具输出结果”、“错误信息”、“错误处理经验”的向量嵌入使用“混合检索”策略来检索工具记忆库中的内容——比如当Agent需要调用某个工具时先用关系型数据库筛选出“最近调用过这个工具的、成功的、用户满意度评分较高的”工具调用记录然后用向量数据库筛选出“工具输入参数与当前任务的需求最相似的”工具调用记录最后将这些工具调用记录作为“提示Prompt”送入LLM中帮助LLM更好地设置工具的输入参数、处理工具的输出结果、避免之前犯过的错误使用“时间衰减算法”和“使用频率加权算法”来更新工具的“推荐优先级”——比如“最近调用过的、使用频率较高的、用户满意度评分较高的”工具推荐优先级会更高使用“过期标记机制”来管理工具记忆库中的内容——比如可以设置“工具调用记录”保存1年之后自动标记为“过期”并软删除。边界与外延边界工具记忆库中的内容是“与工具调用相关的”工具记忆库中的内容通常是“动态的”或者“更新频率较高的”比如Agent每次调用工具都会产生一个新的工具调用记录工具记忆库中的内容通常需要“用户权限控制”——比如一个公司内部的金融咨询Agent财务总监只能查看自己和自己部门员工的工具调用记录而不能查看副总裁的工具调用记录。外延工具记忆库可以进一步扩展为“多Agent工具记忆库”支持多Agent协作场景下的工具调用经验共享工具记忆库也可以进一步扩展为“工具故障诊断库”帮助Agent自主诊断和修复工具的故障工具记忆库还可以进一步与“API管理平台比如Postman、Apigee”集成获取更多的工具使用文档和错误处理经验。1.2.8 检索Retrieval核心概念检索是指从记忆系统短期记忆、情境缓存、长期知识库中筛选出与当前任务/用户输入最相关的信息的过程。问题背景记忆系统中存储了大量的信息——比如一个个人金融助理Agent的长期知识库中可能存储了“1000条通用金融知识”、“10000条用户个人经历”、“100条可执行的程序”、“100000条工具调用记录”——如果Agent每次都需要“浏览”所有的信息才能找到有用的信息那么Agent的效率会非常低、甚至会完全无法工作。因此我们需要一个高效的、准确的检索过程。问题描述如何设计一个高效的、准确的检索过程让它可以从记忆系统中筛选出与当前任务/用户输入最相关的信息问题解决使用“分层检索Hierarchical Retrieval”策略——先从情境缓存中检索信息因为情境缓存中的信息是“最相关的、最新的”如果情境缓存中没有足够的信息再从短期记忆中检索信息如果短期记忆中也没有足够的信息最后从长期知识库中检索信息在长期知识库中使用“分类检索Classified Retrieval”策略——先根据当前任务的类型确定需要检索的长期知识库子模块比如如果当前任务是“查询用户的投资收益率”那么需要检索的子模块是“程序记忆库”、“工具记忆库”、“情景记忆库”然后再在每个子模块中使用“混合检索Hybrid Search”策略向量相似度检索轻量级关键词检索来检索信息最后使用“相关性重排序算法”和“时间衰减算法”来排序所有检索到的信息筛选出Top-K比如Top-5或Top-10最相关的信息送入LLM中。边界与外延边界检索过程的目标是“筛选出与当前任务/用户输入最相关的Top-K信息”而不是“找出所有相关的信息”检索过程的效率和准确性取决于“记忆系统的分层分类设计”、“检索策略的设计”、“向量模型的选型”、“索引优化的程度”等因素。外延检索过程可以进一步扩展为“自适应检索Adaptive Retrieval”——根据当前任务的复杂程度、用户的反馈、检索结果的质量等因素自动调整检索策略比如调整Top-K的数值、调整向量相似度检索和轻量级关键词检索的权重、调整时间衰减函数的参数检索过程也可以进一步扩展为“元记忆检索Metamemory Retrieval”——Agent先“思考”一下“自己有没有相关的信息”、“相关的信息存储在哪个记忆层/子模块中”、“应该用什么检索策略来检索信息”然后再进行实际的检索。1.2.9 重排序Reranking核心概念重排序是指对检索到的信息进行“二次筛选和排序”的过程——因为初始的检索结果比如向量相似度检索的结果可能不是“最符合当前任务需求的”比如初始检索结果中的某条信息虽然“内容相似度很高”但“时间已经过期了”、或者“用户没有权限查看”、或者“与当前任务的优先级不匹配”。问题背景初始的检索结果比如向量相似度检索的Top-10结果可能包含了一些“过时的”、“无关的”、“用户没有权限查看的”信息——比如一个个人金融助理Agent的初始检索结果中可能包含了一条“2020年的央行利率调整信息”但当前任务需要的是“2024年的央行利率调整信息”——如果直接将这些初始检索结果送入LLM中那么LLM可能会被无关信息淹没、或者引用过时信息。因此我们需要一个高效的、准确的重排序过程。问题描述如何设计一个高效的、准确的重排序过程让它可以对初始检索结果进行二次筛选和排序筛选出最符合当前任务需求的Top-K信息问题解决重排序过程通常包括三个步骤过滤Filtering先对初始检索结果进行“过滤”删除那些“过时的”、“用户没有权限查看的”、“与当前任务的类型不匹配的”信息评分Scoring然后对过滤后的检索结果进行“评分”计算每条信息的“综合相关性评分”——综合相关性评分通常由“内容相似度评分”、“时间衰减评分”、“用户权限评分”、“任务优先级评分”、“用户满意度评分如果有的话”等多个维度的评分加权求和得到排序Sorting最后对过滤后的检索结果按照“综合相关性评分”从高到低进行排序筛选出Top-K比如Top-3或Top-5最相关的信息送入LLM中。边界与外延边界重排序过程的目标是“对初始检索结果进行二次筛选和排序筛选出最符合当前任务需求的Top-K信息”重排序过程的效率和准确性取决于“过滤条件的设计”、“评分维度的选择”、“加权系数的设置”等因素。外延重排序过程可以进一步扩展为“基于LLM的重排序LLM-Based Reranking”——使用一个“轻量级的LLM”比如GPT-4o mini、Claude 3 Haiku、Llama 3 8B来对过滤后的检索结果进行“评分”和“排序”因为轻量级的LLM可以更好地“理解当前任务的需求”和“信息的上下文”重排序过程也可以进一步扩展为“基于强化学习的重排序Reinforcement Learning-Based Reranking”——根据用户的反馈比如“用户对Agent的回复是否满意”来自动调整加权系数的设置。1.2.10 更新Update核心概念更新是指将新的信息添加到记忆系统中或者修改记忆系统中已有的信息的过程。问题背景记忆系统中的信息不是“一成不变的”——比如“央行的利率调整信息”会每月更新一次“本公司的财务制度”会每年更新一次“用户的个人经历”会每天更新一次——如果记忆系统中的信息不及时更新