【LangChain学习之旅】—(11) 记忆:通过Memory记住用户上次的对话细节

本文介绍了LangChain库中用于实现对话记忆的机制,包括ConversationChain、ConversationBufferMemory、ConversationBufferWindowMemory和ConversationSummaryMemory。通过这些机制,大模型可以在对话中记住上下文,从而在后续的交互中提供更连贯的回答。ConversationBufferWindowMemory仅保留最近的互动,而ConversationSummaryMemory则通过对话总结来减少Token使用。ConversationSummaryBufferMemory综合了两者,兼顾历史对话和最近互动。不同的记忆机制适用于不同长度和需求的对话场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在默认情况下,无论是 LLM 还是代理都是无状态的,每次模型的调用都是独立于其他交互的。也就是说,我们每次通过 API 开始和大语言模型展开一次新的对话,它都不知道你其实昨天或者前天曾经和它聊过天了。你肯定会说,不可能啊,每次和 ChatGPT 聊天的时候,ChatGPT 明明白白地记得我之前交待过的事情。
在这里插入图片描述

的确如此,ChatGPT 之所以能够记得你之前说过的话,正是因为它使用了记忆(Memory)机制,记录了之前的对话上下文,并且把这个上下文作为提示的一部分,在最新的调用中传递给了模型。在聊天机器人的构建中,记忆机制非常重要。

使用 ConversationChain

不过,在开始介绍 LangChain 中记忆机制的具体实现之前,先重新看一下我们上一节课曾经见过的 ConversationChain。

这个 Chain 最主要的特点是,它提供了包含 AI 前缀和人类前缀的对话摘要格式,这个对话格式和记忆机制结合得非常紧密。让我们看一个简单的示例,并打印出 ConversationChain 中的内置

### LangChain 中 `verbose` 属性引发 `AttributeError` 的原因及解决方案 #### 原因分析 当尝试访问或设置模块级别的属性时,如果该模块未定义此属性,则会抛出 `AttributeError`。在这种情况下,`langchain` 模块本身并未提供名为 `verbose` 的全局属性[^1]。因此,在运行类似以下代码时: ```python import langchain langchain.verbose = True ``` 由于 `langchain` 模块不支持直接赋值给不存在的属性 `verbose`,程序将触发异常。 --- #### 解决方案 为了规避上述问题并实现预期功能,可采取以下方法之一: 1. **更新 LangChain 版本** 如果当前使用的版本较旧,可能缺少某些特性或文档中的说明已过期。建议升级到最新稳定版以匹配官方教程和指南的内容: ```bash pip install --upgrade langchain ``` 2. **调整配置方式** 部分 LangChain 功能通过实例化对象而非修改模块级变量来控制行为。例如,对于链式调用(chains)、提示模板(prompts)或其他组件,可以通过初始化参数传递选项。以下是替代写法示例: ```python from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from langchain.llms import OpenAI llm = OpenAI(temperature=0.7, verbose=True) # 设置模型实例为详细模式 prompt_template = PromptTemplate(input_variables=["question"], template="Q: {question}\nA:") chain = LLMChain(llm=llm, prompt=prompt_template, verbose=True) # 启用链条日志记录 result = chain.run(question="What is the capital of France?") print(result) ``` 上述代码片段展示了如何针对具体对象启用调试信息输出,而无需依赖全局状态管理[^4]。 3. **禁用冗余操作** 若仅需抑制潜在干扰性的消息打印,可通过显式关闭相关标志完成目标: ```python import langchain langchain.debug = False # 关闭调试模式 langchain.llm_cache = None # 清除缓存机制 ``` 此外,部分场景下推荐完全移除对争议字段的操作逻辑,转而采用更稳健的设计策略。 --- #### 示例代码修正 基于前述讨论,下面给出一段经过优化后的脚本供参考: ```python from langchain.memory import ConversationSummaryBufferMemory from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage, AIMessage # 初始化聊天模型与记忆单元 chat_model = ChatOpenAI( temperature=0, model_name="gpt-3.5-turbo", max_tokens=256, verbose=False # 显式声明是否开启详尽反馈 ) memory = ConversationSummaryBufferMemory(chat_memory=None, memory_key="history", ai_prefix="Assistant") messages = [ HumanMessage(content="你好!"), ] response = chat_model.predict_messages(messages).content print(response) ``` 此处利用了 `ChatOpenAI` 类内置的支持结构化输入/输出的能力,并结合高效的对话摘要存储技术提升性能表现[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值