AI Agent 30天速成|Day5 笔记
AI Agent 30天速成|Day5 笔记
大家好,欢迎来到「AI Agent 30天速成」的第五天。经过前四天的学习,我们已经掌握了Agent的基本概念、工作流程和多Agent协作。今天,我们将深入探讨一个非常实用的主题——如何让Agent具备“记忆”能力。是的,你没有听错,Agent也可以像人一样记住过去的事情,并在后续的对话中引用这些信息。这听起来是不是很酷?## 为什么Agent需要记忆?想象一下,你正在使用一个智能客服Agent。如果你之前说过“我住在北京”,但Agent在下一轮对话中又问你“你住在哪里?”,你会不会觉得它很“智障”?这就是因为没有记忆。在现实世界中,Agent需要处理多轮对话、跟踪用户偏好、甚至管理任务状态。没有记忆,Agent就像一个失忆症患者,每次对话都得从零开始。记忆机制的核心在于:将历史信息存储起来,并在需要时检索出来。这类似于人类的长短期记忆。在Agent的世界里,我们通常有两种记忆:- 短期记忆:当前会话中的上下文(比如一次对话中的前几句)。- 长期记忆:跨会话的信息(比如用户偏好、历史记录)。今天,我们主要关注如何用代码实现一个简单的记忆系统,让Agent能够“回忆”起过去的事情。## 基础实现:用字典模拟短期记忆我们先从一个简单的例子开始。假设我们有一个Agent,它需要记住用户的名字和喜好。我们可以用一个Python字典来存储这些信息,每次对话时更新并引用。### 代码示例1:基于字典的短期记忆python# 导入必要的库from datetime import datetimeclass SimpleMemoryAgent: def __init__(self): # 初始化记忆字典 self.memory = { "user_name": None, "last_topic": None, "interaction_count": 0, "history": [] # 存储对话历史 } def update_memory(self, key, value): """更新记忆中的某个字段""" self.memory[key] = value # 记录操作时间 self.memory["history"].append({ "action": f"更新了{key}", "value": value, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") }) def respond(self, user_input): """根据记忆生成回复""" # 增加交互次数 self.memory["interaction_count"] += 1 # 解析用户输入(这里简单处理) if "我叫" in user_input: name = user_input.split("我叫")[-1].strip() self.update_memory("user_name", name) self.update_memory("last_topic", "介绍名字") return f"好的,{name},我记住了你的名字!这是我们的第{self.memory['interaction_count']}次对话。" elif "我喜欢" in user_input: hobby = user_input.split("我喜欢")[-1].strip() self.update_memory("last_topic", "介绍喜好") return f"哦,你喜欢{hobby},我记下了!" elif self.memory["user_name"]: # 如果记得用户名字,直接引用 return f"你好,{self.memory['user_name']}!最近怎么样?" else: return "你好!请问你叫什么名字?" def show_memory(self): """展示当前记忆内容""" print("=== 当前记忆 ===") for key, value in self.memory.items(): if key != "history": print(f"{key}: {value}") print("=== 历史记录 ===") for record in self.memory["history"]: print(f" [{record['timestamp']}] {record['action']}: {record['value']}")# 测试代码agent = SimpleMemoryAgent()print(agent.respond("我叫小明")) # 第一次对话print(agent.respond("我喜欢编程")) # 第二次对话print(agent.respond("你好")) # 第三次对话,引用名字agent.show_memory() # 展示记忆内容运行结果分析:1. 第一次输入“我叫小明”,Agent记住了名字。2. 第二次输入“我喜欢编程”,Agent记住了喜好。3. 第三次输入“你好”,Agent直接引用名字回复“你好,小明!最近怎么样?”。4. 最后展示的记忆中,包含了名字、喜好和历史记录。这个例子展示了最简单的短期记忆。但问题来了:如果Agent重启,所有记忆都会丢失。而且,这种基于字典的存储不适合大规模数据。接下来,我们引入更强大的长期记忆方案。## 进阶实现:基于文本文件的长期记忆为了让记忆持久化,我们可以把记忆保存到文件中。这样即使程序重启,Agent也能读取之前的记录。这里我们使用JSON格式存储,因为它易于读写和解析。### 代码示例2:基于文件的长期记忆pythonimport jsonimport osfrom datetime import datetimeclass FileMemoryAgent: def __init__(self, memory_file="agent_memory.json"): self.memory_file = memory_file # 如果文件存在,加载记忆;否则初始化 if os.path.exists(memory_file): with open(memory_file, 'r', encoding='utf-8') as f: self.memory = json.load(f) else: self.memory = { "user_name": None, "preferences": {}, "interaction_count": 0, "history": [] } print(f"记忆已加载,当前交互次数:{self.memory['interaction_count']}") def save_memory(self): """将记忆保存到文件""" with open(self.memory_file, 'w', encoding='utf-8') as f: json.dump(self.memory, f, ensure_ascii=False, indent=2) print("记忆已保存到文件") def update_memory(self, key, value): """更新记忆并保存""" self.memory[key] = value self.memory["history"].append({ "action": f"更新了{key}", "value": value, "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") }) self.save_memory() def respond(self, user_input): """带有长期记忆的回复""" self.memory["interaction_count"] += 1 if "我叫" in user_input: name = user_input.split("我叫")[-1].strip() self.update_memory("user_name", name) return f"欢迎回来,{name}!这是我们第{self.memory['interaction_count']}次对话。" elif "我喜欢" in user_input: hobby = user_input.split("我喜欢")[-1].strip() # 存储到偏好字典中 self.memory["preferences"]["hobby"] = hobby self.update_memory("preferences", self.memory["preferences"]) return f"好的,我记住了你喜欢{hobby}!" elif self.memory.get("user_name"): # 如果有名字,还可以引用偏好 if "hobby" in self.memory.get("preferences", {}): hobby = self.memory["preferences"]["hobby"] return f"{self.memory['user_name']},你上次说喜欢{hobby},今天想聊什么?" else: return f"你好,{self.memory['user_name']}!有什么我可以帮你的?" else: return "你好!请问你叫什么名字?"# 测试长期记忆agent1 = FileMemoryAgent()print(agent1.respond("我叫小红"))print(agent1.respond("我喜欢画画"))# 模拟程序重启(重新创建Agent)print("\n--- 模拟重启 ---")agent2 = FileMemoryAgent()print(agent2.respond("你好")) # 应该还记得小红和画画print(agent2.respond("我叫小红")) # 更新名字(如果用户改了)运行结果分析:1. 第一次运行,Agent保存了“小红”和“画画”到文件。2. 重启后,第二次运行,Agent从文件加载记忆,自动回复“小红,你上次说喜欢画画,今天想聊什么?”。3. 如果用户再次输入“我叫小红”,Agent会更新记忆并保存。这种基于文件的记忆,是很多简单Agent项目的通用做法。但如果你需要处理海量数据或更复杂的检索,可以升级到数据库(比如SQLite)或向量数据库(比如ChromaDB)。不过今天,我们重点在于理解“记忆”的核心思想。## 记忆机制的进阶思考在实际的AI Agent开发中,记忆不仅仅是一个存储问题。它还包括:1. 遗忘机制:长期记忆需要管理,比如删除过时信息。你可以设置一个时间阈值,超过一定时间未访问的信息被自动清理。2. 优先级排序:重要信息(如用户名字)应该比次要信息(如用户昨天吃了什么)更容易被检索。3. 向量化记忆:对于非结构化的文本,你需要用嵌入模型(如OpenAI的text-embedding-ada-002)将文本转换为向量,然后使用向量数据库进行相似性搜索。这样Agent就能“回忆”起语义相似的内容。这些高级技术,将在后续课程中详细展开。今天,你只需要记住:记忆是Agent智能的关键。## 总结今天我们学习了如何为AI Agent添加记忆能力。我们从一个简单的字典模拟短期记忆开始,然后升级到基于文件的长期记忆。通过代码示例,你看到了记忆如何让Agent记住用户名字、喜好,并在重启后依然有效。这不仅提升了用户体验,也让Agent看起来更“人性化”。记住,记忆不是一次性的任务,而是一个持续优化和扩展的过程。在接下来的课程中,我们将继续探索更高级的记忆技术,比如基于数据库的持久化、记忆向量化以及记忆的自动管理。如果你有任何问题,欢迎在评论区留言!Day5 关键收获:- 记忆分短期和长期,分别对应会话内和跨会话。- 字典适合快速原型,文件/数据库适合生产环境。- 记忆的核心是存储、检索和更新。明天,我们将探讨如何让Agent拥有“自我意识”——通过反思和计划来优化行为。敬请期待!
更多推荐

所有评论(0)