AI Agent 30天速成|Day8 笔记
·
AI Agent 30天速成|Day8 笔记
引言:记忆机制——AI Agent 的灵魂前两天我们学习了如何让 Agent 调用工具(Tool Use)和规划复杂任务(Planning)。但大家有没有想过一个问题:如果 Agent 没有记忆,会怎样? 就像你和朋友聊天,结果他每次都要问“我们刚才聊到哪了”,是不是很抓狂?没错,记忆机制是 AI Agent 从“工具人”进化到“智能助手”的关键一步。今天我们就来深入拆解 Agent 的记忆系统,并用代码实现一个带记忆功能的智能助手。—## 为什么记忆如此重要?先看一个经典场景:你让 Agent 帮你在购物网站搜索“红色连衣裙”,它立马给出了结果。但你接着问:“有中长款的吗?”如果它没有记忆,它得重新理解“中长款”指的是“红色连衣裙的中长款”,然后重新搜索——这效率简直灾难。记忆的意义在于:- 上下文连续性:保持对话的连贯性,就像人类聊天一样自然- 持久化知识:能让 Agent 记住用户偏好、历史操作,减少重复输入- 效率提升:避免重复计算和冗余调用,尤其是对于大型语言模型(LLM)来说,节省 Token 就是省钱—## 记忆的类型:短期 vs 长期在 Agent 架构中,记忆主要分为两大类:### 1. 短期记忆(Short-term Memory)短期记忆又叫上下文窗口记忆,指的是本次对话中 Agent 能记住的历史信息。它的特点是:- 通常以对话历史的形式存在(比如 system, user, assistant 的消息列表)- 长度受限于 LLM 的上下文窗口(比如 GPT-4 的 128K tokens)- 每次新对话就会清空### 2. 长期记忆(Long-term Memory)长期记忆是让 Agent 跨越会话保留信息的机制。它类似于人类的长时记忆,可以存储:- 用户偏好(如“我叫小明,喜欢科技类书籍”)- 历史任务结果(如“上次你帮我分析了股票,我选了腾讯”)- 知识图谱(结构化信息)长期记忆通常需要借助外部存储,比如向量数据库(ChromaDB、Pinecone)或普通数据库(SQLite)。—## 实战:搭建带记忆的 Agent### 示例 1:基于对话历史的短期记忆我们先从最简单的开始:用 Python 实现一个带短期记忆的 Agent。它会在每次对话时把历史消息传给 LLM,让模型理解上下文。python# 使用 OpenAI API 实现带短期记忆的 Agentimport openaiclass ShortTermMemoryAgent: def __init__(self, api_key, model="gpt-3.5-turbo"): self.client = openai.OpenAI(api_key=api_key) self.model = model self.messages = [] # 用来存储对话历史(短期记忆) def add_system_prompt(self, prompt): """设置系统提示词""" self.messages.append({"role": "system", "content": prompt}) def chat(self, user_input): """用户输入,Agent 回复""" # 1. 将用户输入加入记忆 self.messages.append({"role": "user", "content": user_input}) # 2. 调用 LLM 生成回复(自动带上历史消息) response = self.client.chat.completions.create( model=self.model, messages=self.messages ) # 3. 提取助手回复 assistant_reply = response.choices[0].message.content # 4. 将助手回复也加入记忆 self.messages.append({"role": "assistant", "content": assistant_reply}) return assistant_reply def get_history(self): """查看当前记忆内容(调试用)""" return self.messages# 使用示例agent = ShortTermMemoryAgent(api_key="你的API_KEY")agent.add_system_prompt("你是一个友好的购物助手")# 第一轮对话print(agent.chat("我想买一件红色连衣裙")) # 输出:好的!请问您对款式、材质或者预算有什么要求吗?# 第二轮对话(Agent 记得刚才的话题)print(agent.chat("中长款的,预算500以内")) # 输出:好的,我来为您推荐几款红色中长款连衣裙,价格在500元以内...关键点:这里的 self.messages 就是短期记忆的载体。每次调用 chat() 时,都会把历史消息作为上下文传给 LLM,所以模型能理解“中长款”是对“红色连衣裙”的追问。—### 示例 2:基于向量数据库的长期记忆长期记忆的实现要复杂一些,但核心思路很简单:把用户信息提取出来,存到数据库里,下次对话时再检索出来。我们使用 ChromaDB 作为向量数据库,配合 OpenAI 的 Embedding 模型来存储和检索用户记忆。pythonimport chromadbfrom chromadb.utils import embedding_functionsimport openaiclass LongTermMemoryAgent: def __init__(self, api_key, collection_name="user_memories"): self.client = openai.OpenAI(api_key=api_key) # 初始化 ChromaDB(持久化存储) self.chroma_client = chromadb.PersistentClient(path="./memory_db") # 使用 OpenAI 的 Embedding 模型 self.embedding_func = embedding_functions.OpenAIEmbeddingFunction( api_key=api_key, model_name="text-embedding-3-small" ) # 创建或获取集合 self.collection = self.chroma_client.get_or_create_collection( name=collection_name, embedding_function=self.embedding_func ) # 短期记忆(用于当前对话) self.short_term = [] def remember(self, user_id, content): """存储一条长期记忆""" # 每条记忆包含:用户ID、内容、以及自动生成的向量 self.collection.add( documents=[content], metadatas=[{"user_id": user_id}], ids=[f"mem_{user_id}_{hash(content)}"] ) print(f"[记忆存储] 已记住:{content}") def recall(self, user_id, query, top_k=3): """根据当前对话内容,检索相关长期记忆""" results = self.collection.query( query_texts=[query], n_results=top_k, where={"user_id": user_id} # 只检索该用户的记忆 ) return results['documents'][0] if results['documents'] else [] def chat(self, user_id, user_input): """带长期记忆的对话""" # 1. 检索相关长期记忆 memories = self.recall(user_id, user_input) # 2. 构建系统提示,注入记忆 memory_context = "" if memories: memory_context = "根据你的历史信息,我知道:\n" + "\n".join(memories) system_prompt = f"""你是一个智能助手。以下是用户的长期记忆:{memory_context}请基于这些信息,回答用户的问题。如果记忆中有用户偏好,请主动利用。""" # 3. 短期记忆 + 系统提示 messages = [{"role": "system", "content": system_prompt}] messages.extend(self.short_term[-5:]) # 最近5轮对话 messages.append({"role": "user", "content": user_input}) # 4. 调用 LLM response = self.client.chat.completions.create( model="gpt-3.5-turbo", messages=messages ) assistant_reply = response.choices[0].message.content # 5. 更新短期记忆 self.short_term.append({"role": "user", "content": user_input}) self.short_term.append({"role": "assistant", "content": assistant_reply}) return assistant_reply# 使用示例agent = LongTermMemoryAgent(api_key="你的API_KEY")# 第一次对话:主动存储记忆agent.remember("user_001", "用户叫小明,喜欢科技类书籍")agent.remember("user_001", "用户之前提到过喜欢刘慈欣的科幻小说")# 第二次对话(模拟新会话)print(agent.chat("user_001", "推荐几本好看的书吧"))# 输出:小明,根据你之前对科技类书籍和科幻小说的兴趣,我推荐您阅读...代码亮点:- remember() 函数把用户信息转化为向量存入 ChromaDB- recall() 函数根据当前输入查询最相关的记忆- 在每次对话时,Agent 会自动检索并注入长期记忆,让回复更加个性化—## 记忆机制的进阶技巧### 1. 记忆的遗忘与更新长期记忆不是一成不变的。我们需要实现:- 遗忘机制:过时的记忆(比如去年的地址)应该被清除或标记- 更新机制:用户说“我现在不喜欢科幻小说了”,Agent 应该更新已有记忆### 2. 记忆的压缩如果长期记忆太多,每次检索的成本会变高。可以定期对记忆进行摘要压缩,比如把 10 条相关记忆合并成 1 条概括性记忆。### 3. 多模态记忆未来的 Agent 不只是处理文本,还可以记住图片、音频等。比如用户发了一张食谱图片,Agent 应该能记住“用户喜欢意大利面”。—## 总结今天我们学习了 AI Agent 的记忆机制,这是从“一次性工具”到“持续助手”的关键跨越。核心要点回顾:1. 短期记忆:通过对话历史实现,简单但受限于上下文窗口2. 长期记忆:借助向量数据库(如 ChromaDB)实现跨会话持久化3. 记忆检索:使用语义搜索(Embedding + 余弦相似度)找到相关记忆4. 实际应用:带记忆的 Agent 能记住用户偏好、历史操作,提供更个性化的服务建议下一步行动:- 尝试将今天学的记忆机制与 Day 7 的规划能力结合,做一个能记住用户习惯的日程规划 Agent- 思考如何实现记忆的自动更新:比如用户说“我现在不喜欢XX了”,Agent 应该能主动修改记忆下期预告:Day 9 我们将进入更高级的话题——Agent 的反思机制,让 Agent 能从错误中学习,不断自我优化。敬请期待!—欢迎在评论区分享你的学习心得或遇到的坑,我们一起进步!
更多推荐



所有评论(0)