第4课:为什么记忆能力如此重要 - 学习笔记
📚 课程核心主题
本节课深入讲解记忆能力的重要性,以及如何实现短期记忆和长期记忆,通过实际代码演示理解原理。
🎯 第一部分:为什么记忆如此重要?
核心原因
-
大模型本身不具备记忆能力
- 大语言模型(LM)是无状态的(stateless)
- 每次对话都是独立的,不记得之前的内容
-
使用Memory带来的好处:
- ✅ 使AI能够从过去的用户对话交互中学习
- ✅ 从用户的反馈中进行学习
- ✅ 越用越聪明(这是关键!)
- ✅ 保留信息并维护上下文
- ✅ 做出更加连贯、个性化的响应
实际例子:商务旅行规划AI
如果没有记忆会发生什么:
❌ 问题1: 不会记住你的个人偏好
- 每次都要重新输入偏好信息
- 无法提供个性化服务
❌ 问题2: 会因为缺乏理解而犯错
- 不知道用户之前的习惯
- 可能重复犯错
❌ 问题3: 无法回忆起之前提供的信息
- 之前告诉过AI的信息,下次就忘了
- 需要重复说明
类比理解:
- 就像传统Web开发中的HTTP协议
- HTTP本身是无状态的
- 我们需要用Session(会话)来识别用户身份
- AI模型也是一样的,为了让它更聪明,需要接入记忆能力
💾 第二部分:短期记忆 vs 长期记忆(详细对比)
短期记忆(Short-term Memory)
工作原理
- 类似于计算机的RAM(内存)
- 保存正在进行任务和对话的相关细节
- 这种工作记忆在对话的现实中存在
简单说明
- 短期记忆是为了在当前这一轮对话中
- 在本次会话的对话中
- 记住上下文中的历史对话信息
- 让AI知道之前说了什么
- 根据历史对话信息,进行更好的交流
特点
- ✅ 线程级别(Thread-level)
- ✅ 当前这一次会话线程
- ✅ 关闭会话后,信息就丢失了
实际例子(课程演示)
场景:用户告诉AI自己的名字
-
第一轮对话:
- 用户问:"我叫什么?"
- AI回答:"我无法知道你的真实姓名"
- 结果:AI不知道用户的名字
-
第二轮对话:
- 用户说:"我是KEVIN"
- AI回答:"你好,KEVIN,很高兴认识你"
- 结果:AI知道了用户的名字
-
第三轮对话(同一线程):
- 用户问:"我叫什么?"
- AI回答:"你刚才告诉我你的名字是KEVIN"
- 结果:✅ AI记住了!(因为还在同一线程)
-
切换到新线程:
- 开启新的线程(thread id变为2)
- 用户问:"我叫什么?"
- AI回答:"我无法知道你的真实姓名"
- 结果:❌ AI又不知道了(因为是新线程)
关键理解:
- 短期记忆只在**当前线程(session)**中有效
- 切换线程后,记忆就丢失了
长期记忆(Long-term Memory)
工作原理
- 类似于计算机的硬盘(Disk)
- 存储大量的信息以供日后访问
- 能够从长期的AI交互反馈中学习
- 能够适应用户的偏好
特点
- ✅ 跨线程保留
- ✅ 即使今天关闭了会话
- ✅ 过段时间再来和AI对话
- ✅ 它也能够知道之前的一些信息
对比总结
| 特性 | 短期记忆 | 长期记忆 |
|---|---|---|
| 类比 | RAM(内存) | 硬盘(Disk) |
| 作用范围 | 当前线程(会话) | 跨线程 |
| 生命周期 | 会话关闭后丢失 | 持久保存 |
| 用途 | 当前对话的上下文 | 用户偏好、历史信息 |
🔧 第三部分:短期记忆的实现(技术实现)
实现原理
第一步:开启短期记忆能力
在LangGraph中:
- 通过**Checkpoint(检查点)**来实现
- Checkpoint是线程级别的,用来存储短期记忆
第二步:选择存储方式
可选方案:
| 存储方式 | 说明 |
|---|---|
| PostgreSQL | 关系型数据库(推荐用于生产环境) |
| Redis | 内存数据库(快速,但数据可能丢失) |
| MongoDB | 文档数据库 |
重要提醒:
- ❌ 不能只用内存存储(开发环境可以,生产环境不行)
- 原因:断电、重启后数据就没了
- ✅ 必须做持久化(Persistent)
第三步:代码实现(LangGraph)
关键代码结构:
python
# 1. 获取数据库连接
from langgraph.checkpoint.postgres import PostgresSaver
connection = "postgresql://..."
# 2. 创建Checkpoint
checkpointer = PostgresSaver.from_conn_string(connection)
# 3. 绑定到Agent
agent = create_agent(checkpointer=checkpointer)
自动创建表:
- 不需要手动创建表
- LangGraph会自动创建4张表(用于存储checkpoint数据)
- 当构建checkpoint连接实例时,会自动创建
安装依赖
bash
# 使用PostgreSQL
pip install langgraph-checkpoint-postgres
# 使用Redis
pip install langgraph-checkpoint-redis
# 使用MongoDB
pip install langgraph-checkpoint-mongodb
切换存储方式很简单:
- 只需要改变checkpoint的类型
- 从PostgresSaver改为RedisSaver即可
📊 实际演示:消息加载机制
演示场景回顾
三轮对话的消息记录:
-
第一轮:
- Human: "我叫什么?"
- AI: "我无法知道你的真实姓名"
-
第二轮:
- Human: "我是KEVIN"
- AI: "你好,KEVIN"
-
第三轮(同一线程):
- Human: "我叫什么?"
- 此时系统加载了前4条消息(前两轮的对话)
- AI: "你刚才告诉我你的名字是KEVIN"
关键点:
- 第三轮对话时,系统自动加载了之前的4条消息
- 所以AI能够记住用户的名字
- 总共6条消息:前4条(历史)+ 当前2条(新对话)
线程切换演示
切换到新线程(thread id = 2):
- 用户问:"我叫什么?"
- 此时只有2条消息(没有加载历史)
- AI回答:"我无法知道你的真实姓名"
- ✅ 验证了短期记忆是线程级别的
🛠️ 工具调用(Tool Calling)补充
工具调用示例
场景:预定酒店
-
用户输入: "预定一个汉庭酒店"
-
Agent处理:
- 做意图识别(用户想订酒店)
- 判断是否需要调用工具(需要)
- 调用订酒店的工具函数
-
工具定义:
python@tool def book_hotel(hotel_name: str): # 预定酒店的逻辑 return f"成功预定了{hotel_name}" -
绑定到Agent:
- 在创建Agent时,将工具绑定
- Agent会自动识别何时需要调用工具
ReAct架构
- LangGraph实现了ReAct风格的Agent架构
- ReAct = Reasoning + Acting(推理 + 行动)
- Agent会自动判断:是否需要调用工具?调用哪个工具?
💡 关键概念总结
| 概念 | 简单理解 |
|---|---|
| 无状态(Stateless) | 每次对话都是独立的,不记得之前的内容 |
| 短期记忆 | RAM,当前会话有效,关闭后丢失 |
| 长期记忆 | 硬盘,跨会话保留,持久化存储 |
| 线程级别(Thread-level) | 只在当前会话线程中有效 |
| 跨线程(Cross-thread) | 可以在不同会话之间保留 |
| Checkpoint | 检查点,LangGraph中实现短期记忆的机制 |
| 持久化(Persistent) | 数据保存到磁盘,不会因为重启而丢失 |
| ReAct架构 | 推理+行动的Agent架构 |
⚠️ 重要提示
生产环境注意事项
-
存储方式选择:
- ❌ 不要用内存存储(会丢失数据)
- ✅ 必须用数据库(PostgreSQL/Redis/MongoDB)
-
LangGraph vs 其他框架:
- 课程强调:真正的企业级AI系统开发必须用LangGraph/LangChain
- 不能用简单的框架(如Definode等)
- 需要定制化开发,学习曲线较陡,但是必须的
-
数据库容器化:
- 建议用Docker运行数据库(PostgreSQL、Redis、MySQL)
- 方便管理,出问题直接删除重建
❓ 思考题
-
为什么大模型需要记忆能力?
- 答:大模型本身是无状态的,记忆能力让它能从历史交互中学习,越用越聪明
-
短期记忆和长期记忆的核心区别?
- 答:短期记忆是线程级别的,关闭后丢失;长期记忆是跨线程的,持久保存
-
为什么生产环境不能用内存存储?
- 答:断电、重启后数据会丢失,必须做持久化
-
Checkpoint的作用是什么?
- 答:在LangGraph中实现短期记忆的机制,记录当前线程的对话历史
📌 本节课重点回顾
✅ 记忆能力的重要性: 让AI从历史交互中学习,越用越聪明
✅ 短期记忆: RAM,线程级别,关闭后丢失
✅ 长期记忆: 硬盘,跨线程,持久保存
✅ 实现方式: 使用LangGraph的Checkpoint机制,必须做持久化
✅ 工具调用: ReAct架构,Agent自动判断何时调用工具
笔记整理时间:2024年
建议:理解记忆机制是构建智能AI系统的核心,需要通过实际代码加深理解