一、记忆存储
使用大模型进行对话时,语言模型自身不会记住对话的历史信息,每个请求交互,每次调用API都是独立的。记忆存储被用作LLM的输入或者额外的上下文,这样子LLM生成输出时就可以基于之前所说过的对话来生成。
1. ConversationBufferMemory
Langchain提供了一个ConversationBufferMemory方法来临时存储对话记忆
from langchain_community.chat_models import ChatTongyi
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
import os
api_key = os.environ.get('DASHSCOPE_API_KEY')
llm = ChatTongyi(model="qwen-plus",temperature=0.0,api_key=api_key)
memory = ConversationBufferMemory()#使用变量存储记忆
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=False #用于控制输出的详细程度,True为详细输出,False为简略输出
)
一开始使用通义千问2.5-1.5B失败
修改verbose=True,再次运行可以查看到提示词中包含之前的对话记忆是没有问题的。也可以通过下面两种方式查看。
print(memory.buffer)
memory.load_memory_variables({})
更换模型为qwen-plus成功了(疑惑点,是模型之间的区别吗)注:后续开发直接使用qwen-max
2. ConversationBufferWindowMemory
使用大模型进行对话时,语言模型自身不会记住对话的历史信息,每个请求交互,每次调用API都是独立的。记忆存储被用作LLM的输入或者额外的上下文,这样子LLM生成输出时就可以基于之前所说过的对话来生成。随着对话变长,记忆存储量增加,向LLM发送大量token的成本也会增加。所以,Langchain提供了若干个相关的工具。
ConversationBufferWindowMemory仅保留最后若干轮对话信息
下面是一个实例
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=1)#这个变量表示我只想记住最后一轮对话
memory.save_context({"input":"我有点难过"},{"output":"为什么呢?"})
memory.save_context({"input":"我没有得到第一名"},{"output":"没关系,已经很棒了"})
memory.load_memory_variables({})
可以看到记忆存储中,只存储了最后一轮的对话信息。实际中一般k这个位置的变量不会设置为1
3. ConversationTokenBufferMemory
除了限制存储的对话次数,还可以限制保存在记忆存储中的token数量。
from langchain.memory import ConversationTokenBufferMemory
memory = ConversationTokenBufferMemory(llm=llm,max_token_limit=30)
memory.save_context({"input":"AI is what?"},{"output":"Amazing!"})
memory.save_context({"input":"Backpropagation is what?"},{"output":"Beatiful!"})
memory.save_context({"input":"Chatbots are what?"},{"output":"Charming!"})
memory.load_memory_variables({})
4. ConversationSummaryBufferMemory
除了限制存储对话次数和token以外,可以让LLM为所有历史消息生成摘要,在记忆中存储历史消息的摘要
from langchain.memory import ConversationSummaryBufferMemory
schedule = "本周的日程安排包括多个重要会议和项目工作。\
周一,我们将召开团队周会,讨论项目进展和目标。\
周二的重点是参与在线课程以提升数据分析技能,随后与客户进行需求沟通。\
周三和周四将安排技术文档撰写和参加项目管理技巧的工作坊,\
最后在周五总结本周的工作并制定下周的计划。"
memory = ConversationSummaryBufferMemory(llm = llm,max_token_limit=400)
memory.save_context({"input":"我有点难过"},{"output":"为什么呢?"})
memory.save_context({"input":"我没有得到第一名"},{"output":"没关系,已经很棒了"})
memory.save_context({"input":"我们这周有什么日程安排吗?"},{"output":f"{schedule}"})