You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:34:59