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

相关推荐
盼小辉丶9 小时前
Transformer实战——微调多语言Transformer模型
深度学习·语言模型·transformer
Tadas-Gao9 小时前
深度学习与机器学习的知识路径:从必要基石到独立范式
人工智能·深度学习·机器学习·架构·大模型·llm
TTGGGFF9 小时前
从“千问送奶茶”看AI Agent落地:火爆、崩塌与进化方向
人工智能
wazmlp0018873699 小时前
第五次python作业
服务器·开发语言·python
OPEN-Source9 小时前
大模型实战:把自定义 Agent 封装成一个 HTTP 服务
人工智能·agent·deepseek
尘缘浮梦9 小时前
websockets简单例子1
开发语言·python
不懒不懒9 小时前
【从零开始:PyTorch实现MNIST手写数字识别全流程解析】
人工智能·pytorch·python
zhangshuang-peta9 小时前
从REST到MCP:为何及如何为AI代理升级API
人工智能·ai agent·mcp·peta
helloworld也报错?9 小时前
基于CrewAI创建一个简单的智能体
人工智能·python·vllm