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提供了多种记忆机制,包括
ConversationBufferMemory、ConversationBufferWindowMemory、ConversationSummaryMemory和ConversationSummaryBufferMemory,它们各自有不同的优点和适用场景。 - Token消耗管理:随着对话轮次增加,Token的消耗逐渐增加。使用合适的记忆机制(如对话总结或窗口记忆)可以有效管理Token,提升效率并降低成本。
记忆机制在实际应用中至关重要,可以帮助聊天机器人理解并记住上下文,从而提供更流畅、连贯的对话体验。