AI大模型探索之路-应用篇4:Langchain框架Memory模块—增强模型记忆与知识保留

news2024/11/26 13:34:07

目录

前言

一、概述

二、Conversation Buffer

三、Conversation Buffer Window

四、Conversation Summary

 五、Conversation Summary Buffer 

总结


 前言

大模型技术在理解和生成自然语言方面表现出了惊人的能力。因此,为了实现长期的记忆保持和知识累积,有效地管理历史对话数据变得至关重要。Langchain框架中的Memory模块便是为此设计的核心组件,它不仅增强了模型的记忆能力,还确保了知识的持续保留。接下来,我们将深入探讨该模块的架构和功能特性。


一、概述

在AI大模型应用开发中,Langchain框架的Memory模块扮演着至关重要的角色。作为模型记忆增强与知识保留的关键,它通过一系列高效的机制来管理和存储历史对话内容,为未来的查询和分析提供了便利。

总体流程架构涉及以下几个关键步骤:

  1. READ-查询对话:在接收到初始用户输入后,但在执行核心逻辑之前,Langchain将从其内存系统中检索并整合用户输入的信息。
  2. WRITE-存储对话:在执行核心逻辑之后,但在返回答案之前,Langchain会将当前运行的输入和输出写入内存,以便在未来的运行中引用它们。

Memory模块支持多种记录类型,包括但不限于:

Conversation Buffer:将之前所有的对话历史记录存储在内存中。

Conversation Buffer Window:仅存储最近k组的对话历史记录。

Conversation Summary:对之前的历史对话进行摘要总结后存储。

Conversation Summary Buffer:基于token长度决定何时进行摘要总结并存储。

Conversation Token Buffer:根据token长度决定存储多少对话历史记录。

Backed by a Vector Store:基于向量的数据记录,实现持久化存储。

二、Conversation Buffer

基于内存缓存冲区进行所有对话记忆管理。

 1.直接从内存缓存区中存取

from langchain.memory import ConversationBufferMemory
#初始化记忆管理模式
memory = ConversationBufferMemory()
memory.save_context({"input": "hi"}, {"output": "whats up"})

#%%
memory.load_memory_variables({})

#输出:{'history': 'Human: hi\nAI: whats up'}

2.以消息列表的形式输出return_messages=True 

memory = ConversationBufferMemory(return_messages=True)

memory.save_context({"input": "hi"}, {"output": "whats up"})

memory.load_memory_variables({})

#输出:{'history': [HumanMessage(content='hi'), AIMessage(content='whats up')]}

3.在Chain链中运用 

from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain


llm = ChatOpenAI(model_name="gpt-3.5-turbo-0125",temperature=0)

conversation = ConversationChain(
    llm=llm,# 传入语言模型
    verbose=True,# verbose参数为True,表示在控制台输出详细信息
    memory=ConversationBufferMemory()# 初始化了对话的记忆管理方式,基于内存缓存区记忆
)

conversation.predict(input="Hi there!")

打印输出:
Current conversation:
Human: Hi there!
AI:

> Finished chain.
'Hello! How can I assist you today?'

 聊天对话

I'm doing well! Just having a conversation with an AI.

conversation.predict(input="I'm doing well! Just having a conversation with an AI.")

打印输出:
Current conversation:
Human: Hi there!
AI: Hello! How are you today?
Human: I'm doing well! Just having a conversation with an AI.
AI:

> Finished chain.
"That's great to hear! I'm here to chat with you and provide any information or assistance you may need. What would you like to talk about?"

 聊天对话

Tell me about yourself.

conversation.predict(input="Tell me about yourself.")

打印输出:
Current conversation:
Human: Hi there!
AI: Hello! How can I assist you today?
Human: I'm doing well! Just having a conversation with an AI.
AI: That's great to hear! I'm here to chat with you and provide any information or assistance you may need. What would you like to talk about?
Human: Tell me about yourself.
AI:

> Finished chain.
'I am an artificial intelligence designed to interact with humans and provide information and assistance. I have access to a vast amount of data and can answer a wide range of questions. My goal is to help you with whatever you need, so feel free to ask me anything!'

三、Conversation Buffer Window

基于内存缓存区进行记忆管理,但是记忆K条对话记录

 1.直接从内存缓存区中存取

from langchain.memory import ConversationBufferWindowMemory

## 定义一个内存,只能存储最新的一个数据
memory = ConversationBufferWindowMemory( k=1)
memory.save_context({"input": "hi"}, {"output": "whats up"})
memory.save_context({"input": "not much you"}, {"output": "not much"})
#%%
## 加载内存里的数据
memory.load_memory_variables({})

#输出:{'history': 'Human: not much you\nAI: not much'}

2.以消息列表的形式输出return_messages=True 

## 用消息对象的方式
memory = ConversationBufferWindowMemory( k=1, return_messages=True)
memory.save_context({"input": "hi"}, {"output": "whats up"})
memory.save_context({"input": "not much you"}, {"output": "not much"})
## 打印当前内存里的信息
memory.load_memory_variables({})

#输出:{'history': [HumanMessage(content='not much you'),
  AIMessage(content='not much')]}

3.在Chain链中运用 

from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain

## 里面使用了一个内存,只能存储最新的1条数据
conversation_with_summary = ConversationChain(
    llm=ChatOpenAI(model_name="gpt-3.5-turbo-0125",temperature=0),
    memory=ConversationBufferWindowMemory(k=1),
    verbose=True
)

第一次调用,结果中没有对话的记忆

## 第一次调用,结果中没有对话的记忆
result = conversation_with_summary.predict(input="Hi, what's up?")
print(result)

打印输出:
Current conversation:
Human: Hi, what's up?
AI:

> Finished chain.
Hello! I'm just here, ready to chat and answer any questions you may have. How can I assist you today?

第二次调用,结果中有第一次对话的记忆

## 第二次调用,结果中有第一次对话的记忆
result = conversation_with_summary.predict(input="Is it going well?")
print(result)

打印输出:
Current conversation:
Human: Hi, what's up?
AI: Hello! I'm just here, ready to chat and answer any questions you may have. How can I assist you today?
Human: Is it going well?
AI:

> Finished chain.
Yes, everything is going well on my end. I'm fully operational and ready to help with any inquiries you may have. How can I assist you today?

第三次调用,结果中只有第二次对话的记忆

## 第三次调用,结果中只有第二次对话的记忆

result = conversation_with_summary.predict(input="What's the solution?")
print(result)

打印输出:
Current conversation:
Human: Is it going well?
AI: Yes, everything is going well on my end. I'm fully operational and ready to help with any inquiries you may have. How can I assist you today?
Human: What's the solution?
AI:

> Finished chain.
The solution to what specific problem are you referring to? Please provide me with more details so I can better assist you.

四、Conversation Summary

对之前的历史对话,进行摘要总结后存储在内存中

1.直接简单的存取 

from langchain.memory import ConversationSummaryMemory, ChatMessageHistory
from langchain_openai import OpenAI

memory = ConversationSummaryMemory(llm=OpenAI(temperature=0))
memory.save_context({"input": "hi"}, {"output": "whats up"})

memory.load_memory_variables({})


# 采用消息列表的格式进行返回
memory = ConversationSummaryMemory(llm=OpenAI(temperature=0), return_messages=True)
memory.save_context({"input": "hi"}, {"output": "whats up"})

memory.load_memory_variables({})

2.使用现有的消息进行总结摘要

history = ChatMessageHistory()
history.add_user_message("hi")
history.add_ai_message("hi there!")

memory = ConversationSummaryMemory.from_messages(
    llm=OpenAI(temperature=0),
    chat_memory=history,
    return_messages=True
)

#查看缓存
memory.buffer

#放入本地消息,再总结
memory = ConversationSummaryMemory(
    llm=OpenAI(temperature=0),
    buffer="The human asks what the AI thinks of artificial intelligence. The AI thinks artificial intelligence is a force for good because it will help humans reach their full potential.",
    chat_memory=history,
    return_messages=True
)

3.在Chain中使用

from langchain_openai import OpenAI
from langchain.chains import ConversationChain

llm = OpenAI(temperature=0)
conversation_with_summary = ConversationChain(
    llm=llm,
    memory=ConversationSummaryMemory(llm=OpenAI()),
    verbose=True
)
#第一次调用
conversation_with_summary.predict(input="Hi, what's up?")

#第二次调用
conversation_with_summary.predict(input="Tell me more about it!")

 五、Conversation Summary Buffer 

对之前的历史对话,进行摘要总结后存储在内存中;并且通过token长度来决定何时进行总结

1.直接简单的存取

from langchain.memory import ConversationSummaryBufferMemory
from langchain_openai import OpenAI

llm = OpenAI()

#存储的内容超过token阀值了才进行总结
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=10)
memory.save_context({"input": "hi"}, {"output": "whats up"})
memory.save_context({"input": "not much you"}, {"output": "not much"})

memory.load_memory_variables({})


#%%
# 采用消息列表的格式进行输出
memory = ConversationSummaryBufferMemory(
    llm=llm, max_token_limit=10, return_messages=True
)
memory.save_context({"input": "hi"}, {"output": "whats up"})
memory.save_context({"input": "not much you"}, {"output": "not much"})

 2.在Chain中使用

from langchain.chains import ConversationChain

conversation_with_summary = ConversationChain(
    llm=llm,
    memory=ConversationSummaryBufferMemory(llm=OpenAI(), max_token_limit=10),
    verbose=True,
)
#第一次调用
conversation_with_summary.predict(input="Hi, what's up?")


#第二次调用
conversation_with_summary.predict(input="Just working on writing some documentation!")

 六、 Conversation Token Buffer

 将之前所有的对话历史记录,存储在内存中; 并且通过token长度来决定缓存多少内容

1.直接简单存取

from langchain.memory import ConversationTokenBufferMemory
from langchain_openai import OpenAI

llm = OpenAI()

# 通过max_token_limit决定缓存多少内容
memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=10)
memory.save_context({"input": "hi"}, {"output": "whats up"})
memory.save_context({"input": "not much you"}, {"output": "not much"})

memory.load_memory_variables({})

# 以消息列表的格式返回
memory = ConversationTokenBufferMemory(
    llm=llm, max_token_limit=10, return_messages=True
)
memory.save_context({"input": "hi"}, {"output": "whats up"})
memory.save_context({"input": "not much you"}, {"output": "not much"})

 2.在Chain中使用

from langchain.chains import ConversationChain

conversation_with_summary = ConversationChain(
    llm=llm,
    #配置token限制
    memory=ConversationTokenBufferMemory(llm=OpenAI(), max_token_limit=10),
    verbose=True,
)
#第一次调用
conversation_with_summary.predict(input="Hi, what's up?")

#第二次调用
conversation_with_summary.predict(input="Just working on writing some documentation!")

#第三次调用
conversation_with_summary.predict(input="For LangChain! Have you heard of it?")


总结

Langchain框架的Memory模块通过其多样化的记录类型和智能化的存储机制,为AI大模型提供了强大的历史对话管理和知识保留能力。这些功能不仅优化了模型的记忆效率,还为未来的查询和分析奠定了坚实的基础,进一步推动了AI大模型在实际应用中的广泛落地。

探索未知,分享所知;点击关注,码路同行,寻道人生!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java EE】获取Cookie和Session

文章目录 🎍Cookie简介🍀理解Session🌳Cookie 和 Session 的区别🌲获取Cookie🌸传统获取Cookie🌸简洁获取Cookie 🌴获取Session🌸Session存储🌸Session读取🌻…

内网IP与外网IP关联关系连接过程

前言 我们每天都会访问各种各样的网站,比如淘宝,百度等等。不免会思考,我们的设备是如何连接上这些网址的呢?要想搞清楚这个问题,首先就得先搞清楚内网ip和外网ip的联系。 网络结构 如图,假设我们的计算机…

IP协议中的四大支柱:DHCP、NAT、ICMP和IGMP的功能剖析

DHCP动态获取 IP 地址 我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配 IP 信息繁琐的过程。 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的…

短剧在线搜索PHP网站源码

源码简介 短剧在线搜索PHP网站源码,自带本地数据库500数据,共有6000短剧视频,与短剧猫一样。 搭建环境 PHP 7.3 Mysql 5.6 安装教程 1.上传源码到网站目录中 2.修改【admin.php】中, $username ‘后台登录账号’; $passwor…

Android 14.0 SystemUI修改状态栏电池图标样式为横屏显示

1.概述 在14.0的系统rom产品定制化开发中,对于原生系统中SystemUId 状态栏的电池图标是竖着显示的,一般手机的电池图标都是横屏显示的 可以觉得样式挺不错的,所以由于产品开发要求电池图标横着显示和手机的样式一样,所以就得重新更换SystemUI状态栏的电池样式了 如图: 2.S…

通信分类3G,4G,5G,通信专用名词

Generation: 2G: GSM全名为:Global System for Mobile Communications,中文为全球移动通信系统,俗称"全球通",是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术 3G:WCDMA 4G&#xff1a…

PaddleVideo:onnx模型导出

本文节介绍 PP-TSM 模型如何转化为 ONNX 模型,并基于 ONNX 引擎预测。 1:环境准备 安装 Paddle2ONNX python -m pip install paddle2onnx 安装 ONNXRuntime # 建议安装 1.9.0 版本,可根据环境更换版本号 python -m pip install onnxrunti…

flask 访问404

当你的项目有自己的蓝图,有添加自己的前缀,也注册了蓝图。 在访问的路由那里也使用了自己的蓝图,如下图 然后你访问的地址也没问题,但是不管怎么样访问就是返回404,这个时候不要怀疑你上面的哪里配置错误,…

彩虹聚合DNS管理系统源码

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户,每个用户可分配不同的域名解析权限;支持API接口,支持获取域名…

标注平台工作流:如何提高训练数据质量与管理效率

世界发展日益依托数据的驱动,企业发现,管理不断增长的数据集却愈发困难。数据标注是诸多行业的一个关键过程,其中包括机器学习、计算机视觉和自然语言处理。对于大型语言模型(LLM)来说尤是如此,大型语言模型…

Spring之AOP的详细讲解

目录 一.SpringAOP是什么? 1.1理论知识点 1.2简单的AOP例子 二.SpringAOP的核心概念 2.1切点(Pointcut) 2.2通知(Advice) 2.3切⾯(Aspect) 2.4通知类型 2.5切⾯优先级 Order 2.6切点表达式 2.6.1 execution表达式 2.6.2annotati…

【绘图案例-开启图片类型的上下文withOptions Objective-C语言】

一、上午呢,我们讲了一下图片类型的上下文 1.开启图片类型的上下文:UIGraphicsBeginImageContext, 然后,我们在上边儿,画了一些东西, 然后呢,把它取出来了,通过UIGraphicsGetImageFromCurrentImageContext() 通过这个图片类型的上下文,取出来了一个image对象, …

邦火策划真的靠谱吗?餐饮品牌策划实例解析

邦火策划在餐饮品牌策划领域的表现是否靠谱,可以通过具体的实例来进行解析。以下是一些相关的实例分析,以探讨邦火策划在餐饮品牌策划方面的真实效果和专业性。 首先,从品牌塑造与传播的角度来看,邦火策划注重通过精准的市场定位…

element-plus报错TypeError: data.includes is not a function

发生在vue3中,页面报错。 查找原因,表格中的data初始值定义不是数组 改一下 再试就好了

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理 目录 本文导读 一、MyBatis中运用的设计模式详解 1. 工厂模式(Factory Pattern) 2. 单例模式(Singleton Pattern) 3. 建造者模式(Bu…

GEE图表案例——不同区域各地类面积直方图分布图表(矢量面积叠加直方图图)

简介 在GEE中对不同区域面积统计的直方图绘制具体流程如下: 数据准备: 首先,需要准备用于面积统计的地理数据,可以是矢量数据,如行政边界、土地使用类型等。也可以是栅格数据,如分类结果、土地覆盖数据等。 区域划分: 根据需要统计的区域,将数据进行区域划分。可以使用…

电商技术揭秘七:搜索引擎中的SEO关键词策略与内容优化技术

文章目录 引言一、关键词策略1.1 关键词研究与选择1. 确定目标受众2. 使用关键词研究工具3. 分析搜索量和竞争程度4. 考虑长尾关键词5. 关键词的商业意图6. 创建关键词列表7. 持续监控和调整 1.2 关键词布局与密度1. 关键词自然分布2. 标题标签的使用3. 首次段落的重要性4. 关键…

00后应届毕业生面试要一万,面试官:不好意思,我们给不起

前几天,小编收到了即将毕业的表弟发来的私信,说他刚刚面试一家单位被刷了。表弟专业学的不错,人也十分聪明,家里人们都对这个面试结果感到吃惊,一问才知,被刷的理由很简单:开了10K的工资&#x…

FPGA笔试面试题目记录

1 logic utilization 题目:Rank the following operations from lowest utilization to highest. Assume that all variables are 32-bit integers,that the operations are implemented using LUTs ony and that the synthesiser will produce an optimal digital…

基于springboot实现医院管理系统项目【项目源码+论文说明】

基于springboot实现医院管理系统演示 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系…