首页/新闻资讯/正文详情

06-Agent的记忆系统

发布时间:2026/9/27 21:42:01 来源:云帆数科 栏目:资讯中心
06-Agent的记忆系统
Agent 的记忆系统让它记住你说过的话系列AI Agent 从入门到实战 | 第 6 篇前面几篇我们给 Agent 接上了大脑和工具但它还有一个致命缺陷——没有记性。每次对话都从零开始上次聊过什么全忘了。这一篇我们给 Agent 加上记忆系统让它能记住你的偏好、历史对话、甚至跨对话积累知识。一、没有记忆的 Agent 有多难受第 1 次对话 我叫张三我是做前端开发的 你好张三有什么可以帮你的 第 2 次对话 帮我推荐一些学习资料 你好你想学什么方向完全不记得你是前端开发 ……我上次不是说了吗 抱歉我无法记住之前的对话内容。这种体验非常糟糕。记忆是 Agent 从工具进化到助手的关键。二、记忆的三种类型Agent 的记忆系统 │ ├── 短期记忆Short-term Memory │ ├── 是什么当前对话的上下文 │ ├── 存在哪大模型的上下文窗口 │ ├── 能存多久对话结束就丢 │ └── 类比你正在读的这篇文章的内容 │ ├── 对话历史Chat History │ ├── 是什么过去所有对话的记录 │ ├── 存在哪数据库或文件 │ ├── 能存多久永久直到你删掉 │ └── 类比你的微信聊天记录 │ └── 长期记忆Long-term Memory ├── 是什么从对话中提炼出的知识和偏好 ├── 存在哪向量数据库 ├── 能存多久永久 └── 类比你对一个朋友的性格了解三、实现方式一对话历史最常用最简单的记忆方式——把之前的对话记录存下来每次对话时一起发给 LLM。LangChain 的内置记忆方案fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.messagesimportHumanMessage,AIMessage llmChatOpenAI(modelgpt-3.5-turbo,temperature0)# 提示词模板预留了 chat_history 位置promptChatPromptTemplate.from_messages([(system,你是一个智能助手请根据对话历史回答用户问题。),MessagesPlaceholder(variable_namechat_history),# ← 记忆在这里注入(human,{input}),])chainprompt|llm# 模拟对话历史chat_history[]# 第 1 轮对话response1chain.invoke({input:我叫张三我是做前端开发的,chat_history:chat_history})print(response1.content)# 你好张三很高兴认识你这位前端开发者。# 把这轮对话加入历史chat_history.append(HumanMessage(content我叫张三我是做前端开发的))chat_history.append(AIMessage(contentresponse1.content))# 第 2 轮对话带上了历史response2chain.invoke({input:帮我推荐一些学习资料,chat_history:chat_history})print(response2.content)# 张三作为前端开发者我推荐你看看这些资料……# 它记住了你是前端开发关键点第 1 轮 输入我叫张三我是做前端开发的 chat_history[]空的 第 2 轮 输入帮我推荐一些学习资料 chat_history[ Human: 我叫张三我是做前端开发的, AI: 你好张三... ] ↑ 之前的对话被带上了LLM 就记得了四、实现方式二窗口记忆防止上下文爆掉对话历史有个问题聊久了历史会越来越长最终超出 LLM 的上下文窗口限制。解决方案只保留最近 N 轮对话。fromlangchain.memoryimportConversationBufferWindowMemory# 只保留最近 5 轮对话memoryConversationBufferWindowMemory(k5,# 保留最近 5 轮return_messagesTrue,# 返回消息格式memory_keychat_history# 对应提示词中的变量名)# 使用方式fromlangchain.chainsimportConversationChain chainConversationChain(llmllm,memorymemory,verboseTrue)# 对话chain.invoke({input:我叫张三})# 第 1 轮chain.invoke({input:我是前端开发})# 第 2 轮chain.invoke({input:推荐学习资料})# 第 3 轮记得前两轮窗口记忆的效果对话轮次1 2 3 4 5 6 7 8 9 10 k5 记忆 ✓ ✓ ✓ ✓ ✓ ✓ ↑ 第 1-5 轮已被遗忘五、实现方式三摘要记忆压缩历史当对话很长时另一种策略是把历史对话压缩成摘要而不是直接丢掉。fromlangchain.memoryimportConversationSummaryMemory memoryConversationSummaryMemory(llmllm,# 用 LLM 来生成摘要return_messagesTrue,memory_keychat_history)# 使用方式和上面一样chainConversationChain(llmllm,memorymemory,verboseTrue)摘要记忆的工作方式原始历史10 轮对话很长 Human: 我叫张三 AI: 你好张三 Human: 我是做前端的 AI: 前端很好 Human: 我喜欢 React AI: React 是个好框架 ... 压缩后的摘要很短 用户张三是一名前端开发者喜欢使用 React 框架 正在寻找前端学习资料对 TypeScript 感兴趣。好处信息不丢但占用的 token 大大减少。六、实现方式四长期记忆跨对话记忆上面三种方式都局限在单次对话内。如果你想让 Agent跨对话记住信息就需要长期记忆。核心思路把重要信息存到向量数据库里下次对话时检索出来。fromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_core.toolsimporttoolfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutorfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholder# 长期记忆系统 classLongTermMemory:基于向量数据库的长期记忆def__init__(self,persist_dir./memory_db):self.embeddingsOpenAIEmbeddings()self.vector_storeChroma(persist_directorypersist_dir,embedding_functionself.embeddings)defremember(self,content:str,metadata:dictNone):记住一条信息self.vector_store.add_texts(texts[content],metadatas[metadataor{}])returnf已记住:{content}defrecall(self,query:str,k:int3)-str:回忆与查询最相关的信息resultsself.vector_store.similarity_search(query,kk)ifnotresults:return没有找到相关记忆。memories[]fori,docinenumerate(results,1):memories.append(f{i}.{doc.page_content})return相关记忆:\n\n.join(memories)# 初始化长期记忆ltmLongTermMemory()# 定义记忆工具 tooldefremember_info(content:str)-str:记住用户告诉你的重要信息比如姓名、偏好、工作等。 当用户主动告知个人信息时使用这个工具。returnltm.remember(content,{type:user_info})tooldefrecall_info(query:str)-str:回忆之前对话中提到的相关信息。 当需要查找用户之前说过的话时使用。returnltm.recall(query)# 创建带长期记忆的 Agent tools[remember_info,recall_info]llmChatOpenAI(modelgpt-3.5-turbo,temperature0)promptChatPromptTemplate.from_messages([(system,你是一个有长期记忆的智能助手。 你可以使用两个记忆工具 - remember_info: 当用户告诉你重要信息时主动记住它 - recall_info: 当需要查找之前的信息时主动回忆 规则 1. 用户告诉你个人信息时名字、偏好、工作等一定要用 remember_info 记住 2. 回答问题前先用 recall_info 查找是否有相关记忆 3. 要表现得像一个有记忆力的助手而不是每次都像初次见面),MessagesPlaceholder(variable_namechat_history,optionalTrue),(human,{input}),MessagesPlaceholder(variable_nameagent_scratchpad),])agentcreate_tool_calling_agent(llm,tools,prompt)agent_executorAgentExecutor(agentagent,toolstools,verboseTrue)# 测试 print( 第 1 次对话 )agent_executor.invoke({input:我叫李四我是做后端开发的我喜欢用 Go 语言})print(\n 第 2 次对话新对话理论上不记得 )agent_executor.invoke({input:我叫什么名字喜欢什么语言})运行效果 第 1 次对话 我叫李四我是做后端开发的我喜欢用 Go 语言 Agent 思考用户告诉我个人信息我应该记住 调用 remember_info(用户名叫李四做后端开发喜欢 Go 语言) ✅ 已记住: 用户名叫李四做后端开发喜欢 Go 语言 你好李四很高兴认识你这位 Go 语言爱好者我已经记住了。 第 2 次对话 我叫什么名字喜欢什么语言 Agent 思考用户问之前的信息我应该回忆一下 调用 recall_info(用户名字和喜欢的编程语言) 相关记忆: 用户名叫李四做后端开发喜欢 Go 语言 你叫李四喜欢用 Go 语言跨对话也记住了七、四种记忆方式对比方式存储位置保留范围适合场景对话历史内存单次对话短对话、简单场景窗口记忆内存最近 N 轮对话较长但只需近期信息摘要记忆内存压缩后保留对话很长、想保留关键信息长期记忆向量数据库跨对话永久需要记住用户偏好和历史怎么选你的 Agent 需要跨对话记忆吗 ├── 不需要 → 对话历史 / 窗口记忆 └── 需要 → 长期记忆向量数据库实际项目中往往是多种方式组合使用当前对话 → 短期记忆窗口记忆保留最近 5 轮 跨对话 → 长期记忆向量数据库存储用户偏好 两者结合 → Agent 既有短期上下文又有长期知识八、完整示例带完整记忆的 Agent把短期和长期记忆结合在一起fromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutorfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.messagesimportHumanMessage,AIMessage# 短期记忆对话历史手动维护chat_history[]# 长期记忆向量数据库前面定义的 LongTermMemory 类# ltm LongTermMemory()llmChatOpenAI(modelgpt-3.5-turbo,temperature0)promptChatPromptTemplate.from_messages([(system,你是一个有记忆的智能助手。),MessagesPlaceholder(variable_namechat_history),(human,{input}),MessagesPlaceholder(variable_nameagent_scratchpad),])agentcreate_tool_calling_agent(llm,tools,prompt)executorAgentExecutor(agentagent,toolstools,verboseTrue)# 对话循环whileTrue:user_inputinput( 你)ifuser_input.lower()quit:break# 注入短期记忆对话历史 长期记忆检索相关记忆relevant_memoriesltm.recall(user_input)resultexecutor.invoke({input:f相关记忆{relevant_memories}\n\n用户问题{user_input},chat_history:chat_history})print(f 助手{result[output]})# 更新短期记忆chat_history.append(HumanMessage(contentuser_input))chat_history.append(AIMessage(contentresult[output]))# 控制历史长度iflen(chat_history)20:chat_historychat_history[-20:]九、总结记忆类型实现方式关键类/方法对话历史手动维护列表chat_history []窗口记忆ConversationBufferWindowMemoryk5保留最近 5 轮摘要记忆ConversationSummaryMemory用 LLM 压缩历史长期记忆向量数据库 工具Chromatool记忆让 Agent 从工具变成了助手。一个有记忆的 Agent才能真正成为用户的长期伙伴。下一篇预告第 7 篇ReAct 模式详解Agent 是怎么思考的前面我们一直在用 Agent但它到底是怎么决定先做什么、再做什么的下一篇我们深入 ReAct 模式看看 Agent 的思考过程到底是怎么回事。 关注我不迷路如果觉得有帮助点个赞 收藏 ⭐ 支持一下是我持续更新的动力

相关推荐

Mosquitto 的 MQTT v5 之路:2016 年末开发更新、1.4.11 发布与公共测试服务运维解读
Mosquitto 的 MQTT v5 之路:2016 年末开发更新、1.4.11 发布与公共测试服务运维解读

物联网消息队列后端 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mosquit/mosquitto 点击查看 免费下载 2016 年 12 月,Eclipse Mosquitto 项目作者在数月停顿后回归开发&… · 2026/9/27 21:41:54

图解 React 源码:副作用 Hook(useEffect / useLayoutEffect)从创建到销毁的全过程
图解 React 源码:副作用 Hook(useEffect / useLayoutEffect)从创建到销毁的全过程

教程前端 【免费下载链接】react-illustration-series 图解react源码, 用大量配图的方式, 致力于将react原理表述清楚. 项目地址: https://gitcode.com/gh_mirrors/re/react-illustration-series 点击查看 免费下载 本篇基于「react-illustration-series&#xff0… · 2026/9/27 21:41:54

搞懂什么是网络营销产生的观念基础,建站报价才不踩坑
搞懂什么是网络营销产生的观念基础,建站报价才不踩坑

搞懂什么是网络营销产生的观念基础,建站报价才不踩坑 改个需求建站公司拖一周?这种憋屈事儿,我干这行十年见得太多了。很多老板拿着手里的合同,看着屏幕上卡住的页面,心里直犯嘀咕:这钱花得值吗?其实,问题的根源往往不在代码,而在于你没搞懂… · 2026/9/27 21:41:47

【计算机毕业设计】基于Springboot的农机电招平台+LW
【计算机毕业设计】基于Springboot的农机电招平台+LW

博主介绍:✌全网粉丝3W,csdn特邀作者、CSDN新星计划导师、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、… · 2026/9/27 23:21:52

Python数据类型详解.docx
Python数据类型详解.docx

老男孩IT教育只培养技术精英, 数据类型详解是编程语言的基础知识的重要组成部分。这也是一项必须掌握的技能, 但是很多人只会进行简单的理解, 却没有系统地梳理相关的知识点。下面对全部数据进行详细汇总, 说明每一种数据类型的具体特征和用途, 其中可以自定义类型, 并且支持无… · 2026/9/27 23:21:52

第 17 篇|欢语论坛:55873 多元文明对话的公共空间界面是什么
第 17 篇|欢语论坛:55873 多元文明对话的公共空间界面是什么

系列:55873 全域文明生态体系・十三个一级界面篇本篇编号:P017核心架构师团队:文明架构师:龙萨先生AI 架构师:宝藏法师文化金融架构师:白玉先生本篇配色:故宫红 #9E2B25 琉璃金 #D4A843 青碧 … · 2026/9/27 23:21:46

Nginx + HTTPS 部署问题分析与解决
Nginx + HTTPS 部署问题分析与解决

> 记录时间:2026-09-06 > 涉及环境:阿里云 ECS(Ubuntu)/ nginx 1.24.0 / Spring Boot(:8080)/ Vite 前端---## 1. 问题现象本次一共经历了两个阶段的问题,表象不同但根子都在"服务器… · 2026/9/27 23:21:40

会议纪要哪个软件总结精准?我用30场实测告诉你真相
会议纪要哪个软件总结精准?我用30场实测告诉你真相

不知道你有没有经历过这样的崩溃时刻:一场3小时的跨部门会议开完,脑子里塞满了各种信息,但打开空白文档准备写会议纪要时,却发现——待办事项记不全、决策点想不起来、谁说了什么完全对不上号。更绝望的是,你明明用手机… · 2026/9/27 23:21:33

VoLTE质差优化实战:从上行丢包定位到RF与参数调整的完整拆解
VoLTE质差优化实战:从上行丢包定位到RF与参数调整的完整拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:21:27

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码