Memory | 豆包MarsCode AI刷题

64 阅读3分钟

关于记忆05_ConversationSummaryBufferMemory.py中ConversationSummaryBufferMemory不能正确执行输出

  1. ConversationChain 类在 langchain 0.2.7 版本中已被弃用,将在 1.0 版本中移除。建议使用 RunnableWithMessageHistory 类替代。
  2. 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都是用于对话系统的内存管理类。

共同点

  1. 对话管理:都用于管理对话的历史记录。
  2. 总结功能:都可以对对话内容进行总结,以便后续使用。
  3. 提高效率:通过总结对话内容,减少对话系统需要处理的历史记录量,提高系统效率。

不同点

  1. 实现方式:
    • ConversationSummaryMemory:通常会在每次对话结束后,对整个对话进行总结,并存储总结结果/。
    • ConversationSummaryBufferMemory:会在对话过程中不断更新总结,并将新的对话内容添加到缓冲区中,定期对缓冲区内容进行总结。
  2. 内存使用:
    • ConversationSummaryMemory:可能会占用较多内存,因为需要存储完整的对话历史记录。
    • ConversationSummaryBufferMemory:通过缓冲区机制,可以有效控制内存使用量,适合长时间对话。
  3. 适用场景:
    • 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数量。