对话的重要一环是能够引用之前提及的信息,这些信息需要进行存储,因此将这种存储过去交互信息的能力称为记忆。这种工具可以单独使用,也可以无缝的集成到一条链中,记忆的存储长度是程序执行到结束,执行一次的所有记忆。
记忆系统需要支持两种基本操作:读取和写入。
1.在接收到初始用户输入之后但在执行核心逻辑之前,链将从其内存系统中读取并增强用户输入。
2.在执行核心逻辑之后但在返回答案之前,链会将当前运行的输入和输出写入内存,以便在将来的运行中引用它们。
在langchain中,直接使用llm.invoke进行大模型对话,llm的记忆范围只有层序执行到运行结束,再次对话就是新的开始,没有以前的记忆内容,当提问’我刚刚说了什么’时,他就回答不出前一次的交互内容.而使用记忆组件就可以让llm有记忆能力,能够将进行上下文联想.
需要四个部件组合起来使用,大模型,提示词模板,链,记忆组件
- 实例化一个LLM
- 定义记忆组件
- 创建提示词模板
- 使用链将他们链接起来
四种记忆组件
ConversationBufferMemory会话缓冲区
如实的记录列表中记录的对话历史消息,并且是记录所有的历史消息,随着历史记录的增加,运行会越来越慢,直到大模型无法处理.适用于交互次数少,输入输出字符量不大的情况下
ConversationBufferWindowMemory会话缓冲窗口
持续记录对话历史,但只使用最近的k个交互。确保缓存大小不会过大,运行速度比较稳定
ConversationSummaryMemory会话摘要
随着时间的推移总结对话内容,并且将摘要存储在记忆中,需要的时候将摘要注入提示词或链中,缓存不会过大,运行稳定,但是运行速度比ConversationBufferWindowMemory慢很多,因为他在写入记忆的时候,做了一个摘要的操作.这使得她可以记住很长的交互记忆,不过随着交互的增加,摘要的内容不断迭代更换,使得某些内容会遗失.
VectorStoreRetrieverMemory向量存储
将记忆存储在向量存储中,并在每次调用时查询前K个最"显著"的文档。 与大多数其他记忆类不同的是,它不明确跟踪交互的顺序。 在这种情况下,"文档"是先前对话片段。这对于提及AI在对话中早些时候被告知的相关信息可能是有用的。这段话是官方文档的描述,猜测应该是将记忆做成了一个文档,使用文档阅读器来进行读取