深入理解大语言模型(8) 使用 LangChain 开发应用程序之上下文记忆

使用记忆功能让大模型在整个上下文中记住历史对话

python 复制代码
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
# 这里我们将参数temperature设置为0.0,从而减少生成答案的随机性。
# 如果你想要每次得到不一样的有新意的答案,可以尝试增大该参数。
llm = ChatOpenAI(temperature=0.0)
memory = ConversationBufferMemory()
# 新建一个 ConversationChain Class 实例
# verbose参数设置为True时,程序会输出更详细的信息,以提供更多的调试或运行时信息。
# 相反,当将verbose参数设置为False时,程序会以更简洁的方式运行,只输出关键的信息。
conversation = ConversationChain(llm=llm, memory = memory, verbose=True )

#1 第一轮对话
conversation.predict(input="你好, 我叫皮皮鲁")

#2 第二轮对话
conversation.predict(input="1+1等于多少?")


#3 第三轮对话
conversation.predict(input="我叫什么名字?")

#查看储存缓存
print(memory.buffer)

第一轮输出:

'你好,皮皮鲁!很高兴认识你。我是一个AI助手,可以回答你的问题和提供帮助。有什么我可以帮你的吗?'

第二轮输出:

'1+1等于2

第三轮输出:

'你叫皮皮鲁。'

查看储存缓存输出:

储存缓存(buffer),即储存了当前为止所有的对话信息,也可以通过 load_memory_variables({}) 打印缓存中的历史消息。这里的 {} 是一个空字典

Human: 你好, 我叫皮皮鲁

AI: 你好,皮皮鲁!很高兴认识你。我是一个AI助手,可以回答你的问题和提供帮助。有什么我可以帮你的

吗?

Human: 1+1等于多少?

AI: 1+1等于2。

Human: 我叫什么名字?

AI: 你叫皮皮鲁

直接添加内容到储存缓存

我们可以使用 save_context 来直接添加内容到 buffer 中

python 复制代码
memory = ConversationBufferMemory()
memory.save_context({"input": "你好,我叫皮皮鲁"}, {"output": "你好啊,我叫鲁西西"})
memory.load_memory_variables({})

{'history': 'Human: 你好,我叫皮皮鲁\nAI: 你好啊,我叫鲁西西'}

当我们在使用大型语言模型进行聊天对话时,大型语言模型本身实际上是无状态的。语言模型本身并不

记得到目前为止的历史对话。每次调用API结点都是独立的。


对话缓存窗口储存

随着对话变得越来越长,所需的内存量也变得非常长。将大量的tokens发送到LLM的成本,也会变得更

加昂贵,这也就是为什么API的调用费用,通常是基于它需要处理的tokens数量而收费的。

针对以上问题,LangChain也提供了几种方便的储存方式来保存历史对话。其中,对话缓存窗口储存只

保留一个窗口大小的对话。它只使用最近的n次交互。这可以用于保持最近交互的滑动窗口,以便缓冲区

不会过大。

几种对话存储类型

对话字符缓存储存

使用对话字符缓存记忆,内存将限制保存的token数量。如果字符数量超出指定数目,它会切掉这个对话

的早期部分以保留与最近的交流相对应的字符数量,但不超过字符限制。添加对话到Token缓存储存,限制token数量,进行测试

python 复制代码
from langchain.llms import OpenAI
from langchain.memory import ConversationTokenBufferMemory
memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=30)
memory.save_context({"input": "朝辞白帝彩云间,"}, {"output": "千里江陵一日还。"})
memory.save_context({"input": "两岸猿声啼不住,"}, {"output": "轻舟已过万重山。"})
memory.load_memory_variables({})

这边注意下参数**max_token_limit** 这边使用token限制,如果超出的token数 对话将会限制

对话摘要缓存储存

python 复制代码
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationSummaryBufferMemory
# 创建一个长字符串
schedule = "在八点你和你的产品团队有一个会议。 \
你需要做一个PPT。 \
上午9点到12点你需要忙于LangChain。\
Langchain是一个有用的工具,因此你的项目进展的非常快。\
中午,在意大利餐厅与一位开车来的顾客共进午餐 \
走了一个多小时的路程与你见面,只为了解最新的 AI。 \
确保你带了笔记本电脑可以展示最新的 LLM 样例."
llm = ChatOpenAI(temperature=0.0)
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)
memory.save_context({"input": "你好,我叫皮皮鲁"}, {"output": "你好啊,我叫鲁西西"})
memory.save_context({"input": "很高兴和你成为朋友!"}, {"output": "是的,让我们一起去冒
险吧!"})
memory.save_context({"input": "今天的日程安排是什么?"}, {"output": f"{schedule}"})
print(memory.load_memory_variables({})['history'])

这边使用ConversationSummaryBufferMemory,意味着大模型会总结主体内容 而不是把所有聊天内容一字一句全部记录,这种方式可以极大程度较少token的消耗

相关推荐
武子康几秒前
用户说“算了”,设备指令真的取消了吗?
人工智能·后端·agent
旋生万物2 分钟前
全息结构入门:Embedding、向量库、知识图谱的统一视角
人工智能·大模型·aigc·软件工程·知识图谱·embedding·后端开发
砚底藏山河4 分钟前
量化新手误区:因子计算与行情数据的工程化解耦
java·数据库·python·金融
昨夜见军贴06165 分钟前
监测文档校验体系搭建思路,IACheck AI 报告文档审核 Agent 助力竣工环保验收工作
大数据·人工智能
和裕6 分钟前
定制纸箱刀卡、平卡、隔档分别是什么?结构与适用场景区别全解析
大数据·运维·网络·人工智能·算法
晨间晓10 分钟前
一张图片主要是什么颜色?用 OpenCV 做图片主色提取工具
人工智能·opencv·计算机视觉
xsd2024111811 分钟前
把整套 AI 工作台装进 U 盘:开箱即用的本地短视频生产方案
人工智能
kaixin_啊啊11 分钟前
【零基础学AI】第 10 章课后练习与答案
人工智能
智能相对论13 分钟前
STEPX Neo:AI终端的“初代iPhone时刻”
人工智能·ios·iphone
xier_ran17 分钟前
【infra之路】AI 编译器学习笔记(七):Linalg 与 Tiling——把迭代空间切成块
人工智能·笔记·学习