如何让基于LlamaCpp与LangChain的LLM聊天机器人保留重启前对话记忆
实现跨会话对话记忆持久化与优化方案(LlamaCpp + LangChain)
一、基础持久化方案:本地文件存储对话历史
LangChain默认的ChatMessageHistory是内存级存储,替换为FileChatMessageHistory即可实现本地文件持久化,无需额外依赖,适配低配置设备:
from langchain.memory import ConversationBufferMemory from langchain.memory.chat_message_histories import FileChatMessageHistory from langchain.llms import LlamaCpp from langchain.chains import ConversationChain # 指定本地存储对话的JSON文件路径 history = FileChatMessageHistory("chat_history.json") # 绑定持久化历史到对话内存 memory = ConversationBufferMemory( chat_memory=history, return_messages=True, memory_key="chat_history" ) # 初始化LlamaCpp模型,适配8GB内存与i5处理器 llm = LlamaCpp( model_path="./your_model.gguf", n_ctx=2048, # 内存有限时建议设为2048-3072,避免占用过高 n_threads=4, # 匹配i5处理器核心数,平衡性能与资源消耗 verbose=False ) # 构建对话链 conversation_chain = ConversationChain( llm=llm, memory=memory, verbose=False ) # 对话示例 response = conversation_chain.predict(input="你好,我叫张三") print(response) # 重启程序后,再次运行会自动读取之前的对话历史
二、记忆优化:适配低内存的历史管理
8GB内存下,过长的对话历史会挤占模型运行空间,可通过以下两种方式优化:
1. 固定窗口截断:保留最近N轮对话
用ConversationBufferWindowMemory只保留指定轮数的对话,自动丢弃更早的历史:
from langchain.memory import ConversationBufferWindowMemory history = FileChatMessageHistory("chat_history_window.json") memory = ConversationBufferWindowMemory( chat_memory=history, k=5, # 仅保留最近5轮对话 return_messages=True, memory_key="chat_history" )
2. 对话摘要压缩:用模型生成历史摘要
通过ConversationSummaryMemory将长对话压缩为摘要,大幅减少上下文占用,仅在必要时消耗少量CPU资源:
from langchain.memory import ConversationSummaryMemory history = FileChatMessageHistory("chat_history_summary.json") memory = ConversationSummaryMemory.from_llm( llm=llm, chat_memory=history, return_messages=True, memory_key="chat_history" )
三、进阶方案:SQLite结构化存储(可选)
如果需要区分多用户对话,可使用SQLChatMessageHistory依赖SQLite存储,资源占用极低:
pip install sqlalchemy
from langchain.memory.chat_message_histories import SQLChatMessageHistory # 连接本地SQLite数据库,用session_id区分不同用户 history = SQLChatMessageHistory( session_id="user_1", connection_string="sqlite:///chat_history.db" ) memory = ConversationBufferMemory( chat_memory=history, return_messages=True )
四、关键注意事项
- 调整
n_ctx参数:确保模型+上下文总内存占用不超过6GB,避免内存溢出; - 定期清理历史:长时间运行后可手动删除旧存储文件,或在代码中添加自动清理逻辑;
- 无需手动加载:
FileChatMessageHistory和SQLChatMessageHistory初始化时会自动读取本地存储的历史记录。
内容的提问来源于stack exchange,提问作者QUARKS
相关产品推荐
相关产品推荐

