记忆系统:打造智能对话的记忆能力
记忆系统基础 🧠
1. 什么是记忆系统?
记忆系统就像是AI的"大脑":
- 存储对话历史
- 维护上下文信息
- 追踪对话状态
- 管理长期记忆
2. 为什么需要记忆系统?
- 实现连贯对话
- 理解上下文
- 个性化交互
- 长期学习
基础记忆类型 📝
1. 对话缓冲记忆
最简单的记忆形式,存储完整对话历史:
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
# 创建记忆
memory = ConversationBufferMemory()
# 创建对话链
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=memory,
verbose=True
)
# 进行对话
print(conversation.predict(input="你好!"))
print(conversation.predict(input="我叫小明"))
print(conversation.predict(input="还记得我的名字吗?"))
# 查看记忆内容
print("\n记忆内容:")
print(memory.buffer)
2. 对话缓冲窗口记忆
只保留最近的N轮对话:
from langchain.memory import ConversationBufferWindowMemory
# 创建窗口记忆(保留最近2轮对话)
window_memory = ConversationBufferWindowMemory(k=2)
# 创建对话链
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=window_memory,
verbose=True
)
# 进行多轮对话
responses = [
conversation.predict(input="你好!"),
conversation.predict(input="今天天气真好!"),
conversation.predict(input="我们来聊聊人工智能吧"),
conversation.predict(input="你还记得我们聊了什么?")
]
# 只会记住最近的2轮对话
print("\n记忆内容:")
print(window_memory.buffer)
3. 对话摘要记忆
通过摘要保存长对话的重要信息:
from langchain.memory import ConversationSummaryMemory
# 创建摘要记忆
summary_memory = ConversationSummaryMemory(llm=ChatOpenAI())
# 创建对话链
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=summary_memory,
verbose=True
)
# 进行长对话
conversation.predict(input="你好!我想了解一下人工智能。")
conversation.predict(input="特别是机器学习这个领域。")
conversation.predict(input="深度学习和传统机器学习有什么区别?")
# 查看摘要
print("\n对话摘要:")
print(summary_memory.buffer)
高级记忆类型 🚀
1. 实体记忆
记住对话中提到的特定实体信息:
from langchain.memory import ConversationEntityMemory
# 创建实体记忆
entity_memory = ConversationEntityMemory(llm=ChatOpenAI())
# 创建对话链
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=entity_memory,
verbose=True
)
# 进行对话
conversation.predict(input="我叫小明,今年25岁")
conversation.predict(input="我喜欢打篮球和编程")
# 查看实体信息
print("\n实体记忆:")
for entity, info in entity_memory.entity_store.items():
print(f"{entity}: {info}")
2. 向量存储记忆
使用向量数据库存储和检索记忆:
from langchain.memory import VectorStoreRetrieverMemory
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(
["历史对话1", "历史对话2", "历史对话3"],
embeddings
)
# 创建向量存储记忆
vector_memory = VectorStoreRetrieverMemory(
retriever=vectorstore.as_retriever()
)
# 存储新记忆
vector_memory.save_context(
{"input": "你好"},
{"output": "你好!很高兴见到你"}
)
# 检索相关记忆
print(vector_memory.load_memory_variables({"prompt": "打招呼"}))
3. 分层记忆
组合多种记忆类型:
from langchain.memory import CombinedMemory
# 创建多个记忆组件
buffer_memory = ConversationBufferMemory(memory_key="chat_history")
summary_memory = ConversationSummaryMemory(llm=ChatOpenAI(), memory_key="summary")
entity_memory = ConversationEntityMemory(llm=ChatOpenAI(), memory_key="entities")
# 组合记忆
combined_memory = CombinedMemory(memories=[
buffer_memory,
summary_memory,
entity_memory
])
# 创建对话链
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=combined_memory,
verbose=True
)
# 使用组合记忆进行对话
conversation.predict(input="你好,我是小明")
conversation.predict(input="我是一名程序员,主要使用Python")
# 查看不同类型的记忆
print("\n对话历史:")
print(buffer_memory.buffer)
print("\n对话摘要:")
print(summary_memory.buffer)
print("\n实体信息:")
print(entity_memory.entity_store)
记忆管理和优化 ⚙️
1. 记忆清理
class MemoryManager:
def __init__(self, memory):
self.memory = memory
self.backup = None
def clear_memory(self):
"""清空记忆"""
self.backup = self.memory.buffer
self.memory.clear()
def restore_memory(self):
"""恢复记忆"""
if self.backup:
self.memory.buffer = self.backup
self.backup = None
def save_memory(self, file_path):
"""保存记忆到文件"""
with open(file_path, 'w') as f:
f.write(self.memory.buffer)
def load_memory(self, file_path):
"""从文件加载记忆"""
with open(file_path, 'r') as f:
self.memory.buffer = f.read()
# 使用示例
memory = ConversationBufferMemory()
manager = MemoryManager(memory)
# 使用记忆
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=memory
)
# 进行对话
conversation.predict(input="你好")
# 保存记忆
manager.save_memory("memory_backup.txt")
# 清空记忆
manager.clear_memory()
# 恢复记忆
manager.restore_memory()
2. 记忆压缩
class MemoryCompressor:
def __init__(self, llm):
self.llm = llm
def compress_memory(self, memory, max_tokens=1000):
"""压缩记忆内容"""
if len(memory.buffer) <= max_tokens:
return memory.buffer
# 使用LLM生成摘要
summary_prompt = f"""
请对以下对话历史进行摘要,保留重要信息:
{memory.buffer}
摘要要求:
1. 保留关键信息
2. 保持对话连贯性
3. 长度不超过{max_tokens}个字符
"""
summary = self.llm.predict(summary_prompt)
return summary
# 使用示例
compressor = MemoryCompressor(ChatOpenAI())
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=memory
)
# 进行多轮对话
for _ in range(10):
conversation.predict(input="让我们聊聊人工智能...")
# 压缩记忆
compressed = compressor.compress_memory(memory)
print("压缩后的记忆:")
print(compressed)
3. 记忆索引
from typing import Dict, List
import numpy as np
class MemoryIndex:
def __init__(self, embeddings):
self.embeddings = embeddings
self.memories: List[str] = []
self.vectors: List[np.ndarray] = []
def add_memory(self, text: str):
"""添加新记忆"""
vector = self.embeddings.embed_query(text)
self.memories.append(text)
self.vectors.append(vector)
def search_memory(self, query: str, k: int = 3) -> List[str]:
"""搜索相关记忆"""
query_vector = self.embeddings.embed_query(query)
# 计算相似度
similarities = [
np.dot(query_vector, vec) /
(np.linalg.norm(query_vector) * np.linalg.norm(vec))
for vec in self.vectors
]
# 获取最相关的记忆
top_k = sorted(
range(len(similarities)),
key=lambda i: similarities[i],
reverse=True
)[:k]
return [self.memories[i] for i in top_k]
# 使用示例
index = MemoryIndex(OpenAIEmbeddings())
# 添加记忆
index.add_memory("我们讨论了机器学习的基础概念")
index.add_memory("深度学习是机器学习的一个子领域")
index.add_memory("Python是最流行的编程语言之一")
# 搜索相关记忆
results = index.search_memory("机器学习")
print("相关记忆:")
for memory in results:
print(f"- {memory}")
实际应用案例 💡
1. 智能客服系统
class CustomerServiceBot:
def __init__(self):
self.memory = ConversationEntityMemory(
llm=ChatOpenAI(),
entity_cache={}
)
self.conversation = ConversationChain(
llm=ChatOpenAI(),
memory=self.memory
)
async def handle_message(self, user_id: str, message: str) -> str:
"""处理用户消息"""
# 加载用户上下文
context = self.memory.entity_cache.get(user_id, {})
try:
# 处理消息
response = await self.conversation.apredict(
input=message
)
# 更新用户上下文
self.memory.entity_cache[user_id] = context
return response
except Exception as e:
return f"抱歉,我遇到了一些问题:{str(e)}"
def get_user_profile(self, user_id: str) -> dict:
"""获取用户画像"""
return self.memory.entity_cache.get(user_id, {})
# 使用示例
bot = CustomerServiceBot()
# 模拟对话
async def simulate_conversation():
responses = []
responses.append(await bot.handle_message(
"user1",
"你好,我是小明,想咨询一个产品问题"
))
responses.append(await bot.handle_message(
"user1",
"我最近买的手机有点问题"
))
# 查看用户画像
profile = bot.get_user_profile("user1")
print("\n用户画像:")
print(profile)
2. 学习助手
class LearningAssistant:
def __init__(self):
self.summary_memory = ConversationSummaryMemory(
llm=ChatOpenAI()
)
self.entity_memory = ConversationEntityMemory(
llm=ChatOpenAI()
)
self.memory = CombinedMemory(memories=[
self.summary_memory,
self.entity_memory
])
self.conversation = ConversationChain(
llm=ChatOpenAI(),
memory=self.memory
)
def study_session(self, topic: str, content: str) -> str:
"""学习会话"""
prompt = f"""
主题:{topic}
内容:{content}
请帮我理解这个内容,并回答以下问题:
1. 主要概念是什么?
2. 有什么重要的例子?
3. 如何应用这些知识?
"""
return self.conversation.predict(input=prompt)
def review_topic(self, topic: str) -> str:
"""复习主题"""
prompt = f"""
请帮我复习关于{topic}的内容:
1. 之前学习了什么?
2. 重要的知识点有哪些?
3. 需要注意什么?
"""
return self.conversation.predict(input=prompt)
def get_learning_summary(self) -> str:
"""获取学习总结"""
return self.summary_memory.buffer
# 使用示例
assistant = LearningAssistant()
# 学习Python
print(assistant.study_session(
"Python基础",
"Python是一种面向对象的编程语言,具有简洁、易读的特点..."
))
# 复习
print(assistant.review_topic("Python基础"))
# 查看学习总结
print(assistant.get_learning_summary())
最佳实践 ✨
1. 记忆选择
- 短对话:使用 ConversationBufferMemory
- 长对话:使用 ConversationSummaryMemory
- 需要检索:使用 VectorStoreRetrieverMemory
- 多维信息:使用 CombinedMemory
2. 性能优化
- 定期清理无用记忆
- 使用摘要压缩长对话
- 建立高效的索引
- 异步处理大量记忆
3. 安全考虑
- 加密敏感信息
- 定期备份重要记忆
- 设置访问权限
- 遵守隐私政策
小结 📝
本章我们学习了:
- 记忆系统的基础概念
- 不同类型的记忆实现
- 记忆管理和优化方法
- 实际应用案例
关键点:
- 选择合适的记忆类型
- 管理记忆生命周期
- 优化记忆性能
- 注意数据安全
下一步:
- 实践不同记忆类型
- 开发记忆管理工具
- 优化记忆效率
- 构建实际应用