主要参考了langchain的记忆维持方法。

记忆的维持方法

LLM是无状态的,也就是说你每次与其对话都是单独的,而非有上下文的。因此为了让LLM有记忆,需要在提问的时候在提示词中加入历史信息。

原始的聊天记录

最简单的办法就是把先前的所有聊天记录都塞进去,这样ai就能知道先前我们聊了什么。

query: 我喜欢敲代码,你有什么爱好?
ai: 作为一个人工智能,我没有爱好。

接下来直接询问「我的爱好是什么?」,ai就能从这个聊天记录中读出「敲代码」这个信息。(实际上还是阅读材料吧……)。是不是很像一个不知情的人帮你写英文回信,为了知道回信正确而翻找先前的通信往来?

优点缺点
存储所有内容为LLM提供了最大数量的信息更多令牌 (Tokens) 意味着响应时间更长和更高的成本
存储所有内容简单直观较长的对话无法记住,因为我们达到了LLM的令牌 (Tokens) 限制(text-davinci-003gpt-3.5-turbo的令牌 (Tokens) 限制为4096

基于摘要的聊天记录

很简单,每次用户发信息过来,都让大模型进行摘要概括,然后再存入聊天记录。

优点缺点
缩短_长_对话的令牌 (Tokens) 数量对于较小的对话,可能会导致更多的令牌 (Tokens) 使用
能够实现更长的对话对话历史的记忆完全依赖于中间摘要LLM的概括能力
实现相对简单,直观易懂摘要LLM也需要使用令牌 (Tokens) ,这会增加成本(但不限制对话长度)

对话摘要是处理长对话的良好方法。然而,它仍然受到令牌 (Tokens) 限制的基本限制。

对话缓冲窗口记忆

就是第一种办法的限制版。限制只记录k个消息。(k是自行设定的值)

对话摘要缓冲窗口记忆

那么使用融合魔法进行融合召唤呢?——答案就是这个!融合了前面几种办法:对于最近k条记录进行原原本本的保存(方法一),对于k条以前的采用摘要的办法记录(方法二)。