尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

06-Agent的记忆系统

发布时间:2026/9/27 21:42:02

资讯中心
01
ARTICLE

06-Agent的记忆系统

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 的思考过程到底是怎么回事。 关注我不迷路如果觉得有帮助点个赞 收藏 ⭐ 支持一下是我持续更新的动力
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。