伴学笔记 LLM对话记忆机制心得| Langchain实战课笔记

104 阅读3分钟

1. LLM和代理的无状态性

在默认情况下,无论是大语言模型(LLM)还是代理,它们的状态是无存储的。每次通过API调用大语言模型时,它与之前的对话是独立的,不会记得之前的交互。这意味着每次与模型交互时,模型不会知道你曾与它有过什么样的对话。

2. 记忆机制的引入

为了使模型能够记住之前的对话,ChatGPT使用了“记忆”机制。记忆机制允许模型存储和利用之前的对话上下文作为提示,从而在后续交互中保持对话连贯性。

3. ConversationChain与记忆

在LangChain中,ConversationChain是实现对话的基本框架,它允许我们通过设置对话模板来维持对话历史。例如:

from langchain.chains import ConversationChain

# 创建LLM实例
llm = OpenAI(model_name="gpt-3.5-turbo-instruct")

# 创建ConversationChain实例
conv_chain = ConversationChain(llm=llm)

# 打印对话模板
print(conv_chain.prompt.template)
  • history 参数存储了对话的历史记录。
  • input 是用户的新输入。

这些参数帮助模型记住对话历史,并在新一轮对话中参考这些历史信息。

4. ConversationBufferMemory

ConversationBufferMemory 是 LangChain 提供的一个简单的记忆实现,它通过将对话历史缓冲到内存中来保存会话状态。每次新的对话会将历史记录和当前输入一同传递给模型。

示例代码:

from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationBufferMemory

# 初始化对话链
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())

# 第1轮对话
conversation("我姐姐明天要过生日,我需要一束生日花束。")

# 第2轮对话
conversation("她喜欢粉色玫瑰,颜色是粉色的。")

5. ConversationBufferWindowMemory

当对话历史过长时,ConversationBufferWindowMemory 会仅保存最近几轮对话的信息,避免历史过长导致的Token消耗过大。通过设置窗口大小(k),可以限制历史记录的数量。

示例代码:

from langchain.chains.conversation.memory import ConversationBufferWindowMemory

# 创建对话链
conversation = ConversationChain(llm=llm, memory=ConversationBufferWindowMemory(k=1))

6. ConversationSummaryMemory

ConversationSummaryMemory 通过总结历史对话来降低Token消耗。每次新的互动发生时,它会对之前的对话进行汇总,并将总结后的内容传递给模型。

优点:

  • 适合长对话,能有效降低Token消耗。
  • 通过LLM生成对话总结,节省了更多的计算资源。

示例代码:

from langchain.chains.conversation.memory import ConversationSummaryMemory

# 创建对话链
conversation = ConversationChain(llm=llm, memory=ConversationSummaryMemory(llm=llm))

#### 总结

四种记忆机制的比较

记忆机制特点适用场景
ConversationBufferMemory保存完整的对话历史简单对话场景,避免复杂的记忆管理
ConversationBufferWindowMemory仅保存最近的对话历史(如 k=1用于减少Token消耗,适合简短对话或窗口期较短的场景
ConversationSummaryMemory对话历史进行总结,减少Token消耗长对话场景,尤其是需要总结历史对话时
ConversationSummaryBufferMemory结合总结与缓存策略,保留最近对话内容并总结早期对话适用于长对话且需要同时保留重要的历史和总结的场景
  • 无状态性:LLM和代理默认是无状态的,但通过记忆机制可以保留对话上下文。
  • 记忆机制:LangChain提供了多种记忆机制,包括ConversationBufferMemoryConversationBufferWindowMemoryConversationSummaryMemoryConversationSummaryBufferMemory,它们各自有不同的优点和适用场景。
  • Token消耗管理:随着对话轮次增加,Token的消耗逐渐增加。使用合适的记忆机制(如对话总结或窗口记忆)可以有效管理Token,提升效率并降低成本。

记忆机制在实际应用中至关重要,可以帮助聊天机器人理解并记住上下文,从而提供更流畅、连贯的对话体验。