
文章目录【71.PythonAI】Agent记忆系统短期记忆、长期记忆与外部知识库的三层架构导入语1 ~ 三层记忆架构总览1.1 三层分工对照2 ~ 短期记忆对话历史的管理2.1 核心矛盾窗口有限对话无限2.2 实现窗口摘要混合3 ~ 长期记忆用户画像的持久化3.1 从对话中提炼关于用户的事实3.2 画像的使用时机4 ~ 外部知识库经验库的沉淀4.1 与RAG的区别4.2 写入时机的把关5 ~ 三层记忆的读写时机总表思考 总结结尾【71.PythonAI】Agent记忆系统短期记忆、长期记忆与外部知识库的三层架构文章简介本文系统讲解Agent记忆系统的三层架构设计短期记忆对话历史的Token预算管理、长期记忆用户画像与偏好的跨会话积累和外部知识库向量数据库中沉淀的经验库。文章拆解每层的存储介质、读写时机和淘汰策略——短期记忆用滑动窗口摘要压缩、长期记忆用结构化Profile持久化、经验库用向量检索按需召回并给出一个三层记忆整合的Python实现骨架。配以Mermaid架构图展示记忆读写时机与数据流向适合正在开发多轮对话Agent、被聊着聊着就忘了问题困扰的开发者。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语你跟AI助手聊了半小时它还记得你第一句说的我对海鲜过敏吗下周再打开它它还能叫出你的名字吗如果两个问题的答案都是不能那你的Agent就没有真正的记忆系统——它只是一个金鱼脑所有的上下文都活在当前的对话窗口里窗口满了就丢会话结束就清零。真正可用的Agent需要三层记忆对话内记住说过什么、跨会话记住你是谁、永久记住它积累的经验。这篇文章就把这三层怎么设计、怎么配合讲清楚。1 ~ 三层记忆架构总览用户输入记忆读取层短期记忆对话历史窗口长期记忆用户画像 Profile外部知识库向量经验库LLM 推理Agent 响应记忆写入层追加对话历史更新用户画像沉淀有价值的经验1.1 三层分工对照层级存什么存活周期存储介质类比短期记忆当前对话的上下文单次会话内存/Redis人类的工作记忆长期记忆用户偏好、习惯、画像永久数据库结构化你对老朋友的了解外部知识库任务经验、领域知识永久向量数据库笔记本和资料库2 ~ 短期记忆对话历史的管理2.1 核心矛盾窗口有限对话无限LLM的上下文窗口是硬约束比如128K tokens。对话一长必须做取舍策略做法缺点滑动窗口只保留最近N轮早期关键信息被丢弃摘要压缩老对话交给LLM总结成摘要摘要本身消耗Token和调用次数窗口摘要最近N轮原文 更早的摘要实现稍复杂但效果最好推荐2.2 实现窗口摘要混合classShortTermMemory:def__init__(self,window_size10,llmNone):self.window_sizewindow_size self.llmllm self.recent[]# 最近N轮原文self.summary# 更早历史的压缩摘要defadd_turn(self,user_msg,ai_msg):self.recent.append({user:user_msg,assistant:ai_msg})iflen(self.recent)self.window_size:# 挤出的最早一轮合并进摘要overflowself.recent.pop(0)self.summaryself.llm.invoke(f把这段对话合并进现有摘要保持关键信息\nf现有摘要{self.summary}\n新增对话{overflow}).contentdefget_context(self):returnf历史摘要{self.summary}\n最近对话{self.recent}3 ~ 长期记忆用户画像的持久化3.1 从对话中提炼关于用户的事实每轮对话结束后让LLM提取值得长期记住的信息EXTRACT_PROMPT从以下对话中提取关于用户的持久化事实偏好/身份/习惯 以JSON列表返回没有则返回[]。 已有画像{existing_profile} 新对话{conversation} 只返回新增的、不重复的事实如 [用户对海鲜过敏, 用户是Python后端开发, 用户偏好简洁的回答]classLongTermMemory:def__init__(self,db_pathprofiles.db):self.dbsqlite3.connect(db_path)defupdate_profile(self,user_id,new_facts):增量合并新事实到用户画像profileself.load_profile(user_id)forfactinnew_facts:iffactnotinprofile[facts]:profile[facts].append(fact)self.save_profile(user_id,profile)3.2 画像的使用时机画像不是每轮都全部注入——而是在生成回复前作为System Prompt的一部分system_promptf你是用户的私人助手。 已知用户信息{profile[facts]}请在回答时考虑这些背景但不要主动复述。4 ~ 外部知识库经验库的沉淀4.1 与RAG的区别普通RAG的知识是别人写的文档经验库的知识是**“Agent自己干过的事”**classExperienceMemory:def__init__(self,vector_store):self.storevector_storedefsave_experience(self,task,solution,success):把一次成功任务的解法沉淀进经验库ifsuccess:self.store.add_texts([f任务{task}\n解法{solution}])defrecall(self,new_task,top_k3):遇到相似任务时召回历史经验returnself.store.similarity_search(new_task,ktop_k)# 使用expExperienceMemory(chroma_store)# 执行新任务前先查经验similarexp.recall(批量处理1000条客服对话并分类)ifsimilar:promptf参考历史经验{similar}\n\n新任务...4.2 写入时机的把关经验库最大的坑是垃圾进垃圾出——失败的尝试、错误的结论如果被沉淀会污染后续召回。两条原则只有用户确认满意的结果才入库用户给了正反馈才save入库前让LLM做一次泛化把具体的1000条客服对话抽象为大批量文本分类任务5 ~ 三层记忆的读写时机总表时机短期记忆长期记忆经验库收到新输入时读取全文读取画像相似任务召回生成回复时注入上下文注入System Prompt注入参考经验每轮对话后追加压缩提炼新事实不写入任务完成被认可时——沉淀成功经验思考 总结记忆不是单一概念而是三种不同生命周期的系统短期管这次对话、长期管这个用户、经验库管这个Agent的成长。短期记忆的最优解是窗口摘要单纯滑动窗口会丢关键信息纯摘要又会丢失细节混合策略是工程上的最佳平衡。长期记忆的关键是增量提炼而非全文存储把对话原文全存下来既浪费又难用提炼成事实列表才有价值。经验库要严格把关写入质量宁缺毋滥——一条错误的经验会污染之后无数次相似任务的召回。没有记忆系统的Agent只是聊天机器人有三层记忆的Agent才开始像一个越用越懂你的助手。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏把核心知识点存好在需要时随时查、随时用评论分享你的经验或疑问评论区一起交流避坑一键四连不要忘记给博主一键四连哦️寄语技术之路难免有困惑但同行的人会让前进更有方向结语人类靠记忆建立信任Agent也一样。把三层记忆搭好你的Agent就从每次见面都重新认识进化成了老朋友。不要忘记给博主一键四连哦