元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
LangChain简介
什么是LangChain
核心概念解析
典型应用场景
▶
环境搭建
Python环境配置
安装LangChain
开发工具准备
▶
快速入门
第一个示例程序
示例分步解析
代码结构说明
▶
核心组件
Models组件
Prompts模板
Chains工作流
▶
模型集成
OpenAI集成
HuggingFace接入
▶
Chain实战
简单Chain构建
Sequential Chain
▶
记忆管理
对话记忆原理
记忆存储实现
▶
应用案例
智能问答系统
文档摘要生成
▶
调试技巧
常见错误排查
日志记录分析
▶
后续学习
学习路线图
官方资源推荐
发布时间:
2025-03-29 19:08
↑
☰
# LangChain记忆存储实现 本文将详细介绍LangChain中的记忆存储实现方案,帮助你理解如何持久化和管理对话记忆。 ## 存储类型 ### 1. 内存存储 最简单的存储方式,数据保存在内存中: ```python from langchain.memory import ConversationBufferMemory # 创建内存存储 memory = ConversationBufferMemory() # 添加消息 memory.chat_memory.add_user_message("你好") memory.chat_memory.add_ai_message("你好!有什么我可以帮你的吗?") # 获取历史 history = memory.load_memory_variables({}) print(history) ``` ### 2. 文件存储 将对话历史保存到文件中: ```python from langchain.memory import FileChatMessageHistory # 创建文件存储 history = FileChatMessageHistory("chat_history.json") # 添加消息 history.add_user_message("你好") history.add_ai_message("你好!有什么我可以帮你的吗?") # 获取所有消息 messages = history.messages ``` ### 3. Redis存储 使用Redis存储对话历史: ```python from langchain.memory import RedisChatMessageHistory # 创建Redis存储 history = RedisChatMessageHistory( session_id="user-123", url="redis://localhost:6379/0" ) # 添加消息 history.add_user_message("你好") history.add_ai_message("你好!有什么我可以帮你的吗?") # 清除历史 history.clear() ``` ### 4. 数据库存储 使用SQL数据库存储: ```python from langchain.memory import SQLChatMessageHistory from sqlalchemy import create_engine # 创建数据库连接 engine = create_engine("sqlite:///chat_history.db") # 创建数据库存储 history = SQLChatMessageHistory( session_id="user-123", engine=engine ) # 添加消息 history.add_user_message("你好") history.add_ai_message("你好!有什么我可以帮你的吗?") ``` ## 高级特性 ### 1. 自定义存储 ```python from langchain.memory.chat_message_histories import BaseChatMessageHistory from langchain.schema import BaseMessage class CustomChatMessageHistory(BaseChatMessageHistory): def __init__(self): self.messages = [] def add_message(self, message: BaseMessage) -> None: self.messages.append(message) def clear(self) -> None: self.messages = [] ``` ### 2. 消息过滤 ```python from langchain.memory import ConversationBufferMemory from langchain.schema import HumanMessage, AIMessage def filter_messages(messages, filter_func): return [msg for msg in messages if filter_func(msg)] # 使用示例 memory = ConversationBufferMemory() # 添加消息 memory.chat_memory.add_message(HumanMessage(content="你好")) memory.chat_memory.add_message(AIMessage(content="你好!")) # 过滤消息 user_messages = filter_messages( memory.chat_memory.messages, lambda x: isinstance(x, HumanMessage) ) ``` ### 3. 消息转换 ```python from langchain.memory import ConversationBufferMemory from typing import List, Dict def messages_to_dict(messages: List[BaseMessage]) -> List[Dict]: return [ { "role": "user" if isinstance(msg, HumanMessage) else "assistant", "content": msg.content } for msg in messages ] # 使用示例 memory = ConversationBufferMemory() messages_dict = messages_to_dict(memory.chat_memory.messages) ``` ## 最佳实践 ### 1. 存储选择 根据应用场景选择合适的存储方式: 1. **开发测试**:内存存储 2. **单机应用**:文件存储 3. **分布式系统**:Redis/数据库存储 4. **自定义需求**:实现自定义存储 ### 2. 存储管理 ```python class MemoryManager: def __init__(self, storage_type="memory", **kwargs): if storage_type == "memory": self.history = ConversationBufferMemory() elif storage_type == "file": self.history = FileChatMessageHistory(**kwargs) elif storage_type == "redis": self.history = RedisChatMessageHistory(**kwargs) elif storage_type == "sql": self.history = SQLChatMessageHistory(**kwargs) else: raise ValueError(f"不支持的存储类型:{storage_type}") def add_message(self, role: str, content: str): if role == "user": self.history.add_user_message(content) else: self.history.add_ai_message(content) def get_messages(self): return self.history.messages def clear(self): self.history.clear() ``` ### 3. 错误处理 ```python from typing import Optional, List def safe_memory_operation(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: print(f"存储操作错误:{e}") return None return wrapper class SafeMemoryManager: @safe_memory_operation def add_message(self, message: BaseMessage) -> None: self.history.add_message(message) @safe_memory_operation def get_messages(self) -> Optional[List[BaseMessage]]: return self.history.messages ``` ## 应用示例 ### 1. 多用户聊天系统 ```python from langchain.memory import RedisChatMessageHistory class ChatSystem: def __init__(self, redis_url): self.redis_url = redis_url def get_user_history(self, user_id: str): return RedisChatMessageHistory( session_id=f"chat:{user_id}", url=self.redis_url ) def add_message(self, user_id: str, role: str, content: str): history = self.get_user_history(user_id) if role == "user": history.add_user_message(content) else: history.add_ai_message(content) def get_chat_history(self, user_id: str): history = self.get_user_history(user_id) return history.messages ``` ### 2. 消息备份系统 ```python from langchain.memory import FileChatMessageHistory, RedisChatMessageHistory import json class BackupSystem: def __init__(self, redis_url, backup_dir): self.redis = RedisChatMessageHistory( session_id="main", url=redis_url ) self.file = FileChatMessageHistory( f"{backup_dir}/backup.json" ) def backup(self): # 从Redis获取消息 messages = self.redis.messages # 备份到文件 for message in messages: if isinstance(message, HumanMessage): self.file.add_user_message(message.content) else: self.file.add_ai_message(message.content) def restore(self): # 从文件恢复 messages = self.file.messages # 恢复到Redis self.redis.clear() for message in messages: if isinstance(message, HumanMessage): self.redis.add_user_message(message.content) else: self.redis.add_ai_message(message.content) ``` ## 总结 LangChain提供了丰富的记忆存储实现: - 多种存储类型 - 灵活的自定义选项 - 完善的错误处理 - 便捷的管理接口 掌握记忆存储的使用,将帮助你构建更可靠和可扩展的AI应用。