Langchain ConversationSummaryBufferMemory未生效:LLM请求仍携带完整聊天历史
问题分析与解决方案
你的核心问题是ConversationSummaryBufferMemory未按预期生成聊天摘要,导致LLM仍收到完整历史。以下是具体排查和修复步骤:
1. 确认Prompt模板正确引用内存变量
确保你的Chain Prompt模板中使用的是{history}(对应你设置的memory_key="history"),而非直接传入原始的chat_mem。如果Prompt里硬编码了完整历史,内存的摘要逻辑不会生效。示例正确Prompt:
from langchain.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个专业助手,根据历史聊天摘要和当前问题回答"), ("history", "{history}"), ("user", "{query}") ])
2. 调整内存初始化与摘要触发逻辑
你当前的prune()调用时机不对:ConversationSummaryBufferMemory默认仅当新增内容触发max_token_limit时才生成摘要,初始化时直接调用prune()可能因为原始历史未超过阈值而不生效。可以手动触发摘要生成,或调整参数强制生成:
def __set_chain_memory(self, user_id, conversation_id): chat_mem = self.chat_memory.get(user_id, conversation_id) llm = ChatOpenAI(temperature=0, model_name=GPT3_MODEL) self.chain_memory = ConversationSummaryBufferMemory( llm=llm, chat_memory=chat_mem, memory_key="history", input_key="query", return_messages=False, # 改为False直接返回字符串摘要,适配多数Prompt max_token_limit=1000, ) # 手动触发摘要生成:强制将历史转换为摘要(即使未达token阈值) self.chain_memory.load_memory_variables({}) # 调用prune确保内存仅保留摘要和最新消息 self.chain_memory.prune()
3. 验证Chain初始化是否正确绑定内存
确保你的StreamingChain初始化时传入的是memory=self.chain_memory,而非原始的chat_mem。示例正确Chain初始化:
from langchain.chains import LLMChain # 适配你的实际StreamingChain类型 self.streaming_chain = LLMChain( llm=your_target_llm, # 这里可以是Claude/GEMINI等你对接的模型 prompt=prompt, memory=self.chain_memory, verbose=True, streaming=True )
4. 手动验证内存输出
在传入Chain前,添加调试代码确认内存返回的是摘要而非完整历史:
memory_vars = self.chain_memory.load_memory_variables({"query": "测试查询"}) print(memory_vars["history"]) # 输出应为摘要字符串,而非完整聊天记录
关键注意点
ConversationSummaryBufferMemory的摘要生成依赖你传入的llm参数(这里是ChatOpenAI),和对话使用的LLM(Claude/GEMINI)无关,无需担心多模型兼容问题。- 如果设置
return_messages=True,内存返回的是BaseMessage对象列表,需确保Prompt模板能正确解析这种格式,否则建议改为return_messages=False直接返回字符串摘要。
内容的提问来源于stack exchange,提问作者Sawinu Peiris
相关产品推荐
相关产品推荐

