关于记忆05_ConversationSummaryBufferMemory.py中ConversationSummaryBufferMemory不能正确执行输出
ConversationChain类在langchain0.2.7 版本中已被弃用,将在 1.0 版本中移除。建议使用RunnableWithMessageHistory类替代。ChatOpenAI类中的get_num_tokens_from_messages方法在cl100k_base模型中未实现。
自定义ChatOpenAI类,忽略get_num_tokens_from_messages 方法并覆盖该方法使其不执行任何操作。
class ChatOpenAI1(ChatOpenAI):
def get_num_tokens_from_messages(self, messages):
# 忽略该方法
return 0
ConversationSummaryBufferMemory
- 用途:ConversationSummaryBufferMemory是一个用于对话链的内存类,专门用于存储和管理对话的摘要和历史记录。
- 功能:它用于在对话过程中维护一个摘要缓冲区,以便在对话中可以访问和使用这些摘要信息。它可以帮助在对话中保持上下文和记忆。
- 位置:通常位于 langchain.chains.conversation.memory模块中。
RunnableWithMessageHistory
- 用途:RunnableWithMessageHistory是一个可运行的类,通常用于处理带有消息历史记录的任务。
- 功能:它主要用于记录和处理消息历史,以便在运行过程中可以访问和操作这些历史记录。
- 位置:通常位于 langchain_core.runnables.history模块中。
区别
- 功能不同RunnableWithMessageHistory更通用,用于处理任何带有消息历史的任务,而 ConversationSummaryBufferMemory专门用于对话链中的内存管理。
- 用途不同:RunnableWithMessageHistory主要用于记录和处理消息历史,而 ConversationSummaryBufferMemory主要用于在对话中维护和使用摘要信息。
但是改用RunnableWithMessageHistory还是会报错,Marscode给的解决方案,建议还是自定义ChatOpenAI类忽略get_num_tokens_from_messages方法
ConversationSummaryMemory 和ConversationSummaryBufferMemory都是用于对话系统的内存管理类。
共同点
- 对话管理:都用于管理对话的历史记录。
- 总结功能:都可以对对话内容进行总结,以便后续使用。
- 提高效率:通过总结对话内容,减少对话系统需要处理的历史记录量,提高系统效率。
不同点
- 实现方式:
- ConversationSummaryMemory:通常会在每次对话结束后,对整个对话进行总结,并存储总结结果/。
- ConversationSummaryBufferMemory:会在对话过程中不断更新总结,并将新的对话内容添加到缓冲区中,定期对缓冲区内容进行总结。
- 内存使用:
- ConversationSummaryMemory:可能会占用较多内存,因为需要存储完整的对话历史记录。
- ConversationSummaryBufferMemory:通过缓冲区机制,可以有效控制内存使用量,适合长时间对话。
- 适用场景:
- ConversationSummaryMemory:适用于对话较短,需要完整记录的场景。
- ConversationSummaryBufferMemory:适用于对话较长,需要动态更新总结的场景。
ConversationChain
两个参数:
- {history} 是存储会话记忆的地方,也就是人类和人工智能之间对话历史的信息。
- {input} 是新输入的地方,你可以把它看成是和ChatGPT对话时,文本框中的输入。
使用ConversationBufferMemory
在LangChain中,通过ConversationBufferMemory(缓冲记忆)可以实现最简单的记忆机制。 聊天历史信息,都被传入了ConversationChain的提示模板中的 {history} 参数,这样简单直接地存储所有内容为LLM提供了最大量的信息,但是新输入中也包含了更多的Token(所有的聊天历史记录),这意味着响应时间变慢和更高的成本。
使用ConversationBufferWindowMemory
缓冲窗口记忆,就是只保存最新最近的几次人类和AI的互动。因此,在之前的“缓冲记忆”基础上增加了一个窗口值 k。意味只保留过去一定数量的互动,然后"忘记“过去的互动
通过k值规定保留多少轮互动
conversation = ConversationChain(llm=llm, memory=ConversationBufferWindowMemory(k=1))
尽管不适合记住太遥远的互动,但是非常适合限制token数量。