深入理解大语言模型(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的消耗

相关推荐
冬奇Lab8 小时前
Workflow 系列(06):安全——跨步骤注入传播与四层防御
人工智能·工作流引擎
冬奇Lab8 小时前
每日一个开源项目(第149篇):RAG-Anything - 把图片、表格、公式当成一等公民的多模态 RAG 框架
人工智能·开源
米小虾9 小时前
AI Agent 安全实战指南:当智能体开始"不听话",开发者该如何应对?
人工智能·安全·agent
IT_陈寒10 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
用户83562907805112 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805112 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
阿里云大数据AI技术12 小时前
构建高转化海外电商搜索:阿里云OpenSearch行业算法版的全链路智能优化策略实战
人工智能·搜索引擎
Awu122712 小时前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude
字节跳动视频云技术团队12 小时前
让 Agent 成为音视频工作台:AI MediaKit CLI + Skill 发布
人工智能·音视频开发