How to persist LangChain conversation memory (save and load)

题意:如何持久化 LangChain 对话记忆(保存和加载)

问题背景:

I'm creating a conversation like so:        我正在创建一个对话,如下所示:

llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY, model_name=OPENAI_DEFAULT_MODEL)
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())

But what I really want is to be able to save and load that ConversationBufferMemory() so that it's persistent between sessions. There doesn't seem to be any obvious tutorials for this but I noticed "Pydantic" so I tried to do this:

但我真正想要的是能够保存和加载 ConversationBufferMemory(),以便它在会话之间保持持久性。似乎没有关于这方面的明显教程,但我注意到了“Pydantic”,所以我尝试这样做:

saved_dict = conversation.memory.chat_memory.dict()
cm = ChatMessageHistory(**saved_dict) # or cm = ChatMessageHistory.parse_obj(saved_dict)

But this fails:        但是失败了

ValidationError: 6 validation errors for ChatMessageHistory
messages -> 0Can't instantiate abstract class BaseMessage with abstract method type (type=type_error)

Thoughts? I'd love links to any sort of guide, repo, reference, etc.

想法?我很乐意看到任何相关的指南、仓库、参考等链接。

问题解决:

I just did something similar, hopefully this will be helpful. On a high level:

我刚刚做了一些类似的事情,希望能有所帮助。在高层次上:

1. use ConversationBufferMemory as the memory to pass to the Chain initialization

使用 ConversationBufferMemory 作为内存传递给链(Chain)的初始化

llm = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo-0301')
original_chain = ConversationChain(llm=llm,verbose=True,memory=ConversationBufferMemory()
)
original_chain.run('what do you know about Python in less than 10 words')

2. extract messages from memory in the form of List[langchain.schema.HumanMessage|AIMessage] (not serializable)

从内存中提取消息,以 List[langchain.schema.HumanMessage | AIMessage] 的形式(不可序列化)

extracted_messages = original_chain.memory.chat_memory.messages

3. transform the extracted message to serializable native Python objects

将提取的消息转换为可序列化的原生Python对象

ingest_to_db = messages_to_dict(extracted_messages)

4. perform db operations to write to and read from database of your choice, I'll just use json.dumps and json.loads to illustrate

执行数据库操作以写入和读取您选择的数据库,为了说明,我将只使用 json.dumps 和 json.loads

retrieve_from_db = json.loads(json.dumps(ingest_to_db))

5. transform the retrieved serialized object back to List[langchain.schema.HumanMessage|AIMessage]

将检索到的序列化对象转换回 List[langchain.schema.HumanMessage | AIMessage] 的形式

retrieved_messages = messages_from_dict(retrieve_from_db)

6. construct ChatMessageHistory from the messages

从消息中构建 ChatMessageHistory

retrieved_chat_history = ChatMessageHistory(messages=retrieved_messages)

7. construct ConversationBufferMemory from ChatMessageHistory

从 ChatMessageHistory 中构建 ConversationBufferMemory

retrieved_memory = ConversationBufferMemory(chat_memory=retrieved_chat_history)

8. pass memory back to the newly initiated Chain

将内存(memory)传递回新初始化的链(Chain

reloaded_chain = ConversationChain(llm=llm,verbose=True,memory=retrieved_memory
)

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

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

相关文章

【CTF】BUU BURP COURSE 11

打开靶机之后,显示只能在本地打开(一度以为靶机出问题)。 解题步骤: 1.分析请求包信息 2.构建本地请求IP X-Real-IP:记录真实客户端IP地址信息; X-Forward-for:记录了请求IP到目标ip所经历的…

新型基坑气膜:施工开挖的得力干将—轻空间

随着城市建设的加速推进,施工过程中的环境问题日益受到关注。新型基坑气膜以其卓越的防尘、降噪、节能和防火功能,成为施工开挖领域中的得力干将,极大地提升了绿色施工的水平。 基坑气膜的作用 基坑气膜在施工现场形成了一个完全封闭的作业空…

Java EE之Servlet

Servlet 是 Java EE(Java Platform, Enterprise Edition)规范中的一个技术,是服务器端 Java 程序,用于处理客户端请求并生成动态响应。Servlet 通常用于构建 Web 应用程序,并与 HTTP 协议紧密集成。以下是对 Servlet 的…

JavaWeb系列七: 动态WEB开发核心(Servlet) 下

韩老师学生 ServletConfigServletContext网站计数器 HttpServletRequest细节1细节2细节3 Dispathcer请求转发应用实例请求转发细节和注意事项习题 HttpServletResponse请求重定向请求重定向注意事项动态获取到application context练习题 ServletConfig ●ServletConfig基本介绍…

docker --restart 容器重启策略

官网连接:https://docs.docker.com/config/containers/start-containers-automatically/ 当容器退出后,或者docker程序重启了,容器是否要重启,可以用重启策略控制。 用docker run命令的时候,用--restart 设置容器重启…

1.文件上传漏洞渗透及防御(OWASP实战训练)

1.文件上传漏洞渗透及防御(OWASP实战训练) OWASPupload上传漏洞实验一:低安全模式下,上传任意类型的文件,文件大小不受限制实验二,安全级别调整将其变为中等安全级别实验三:将其设为高安全级别 …

【教程】如何一步一步训练一个SOM神经网络-自组织竞争神经网络(Self-organizing Feature Map)

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是SOM神经网络1.1.SOM神经网络有什么用1.2.SOM神经网络是如何聚类的 二、如何训练一个SOM神经网络2.1. 训练一个SOM神经网络的代码示例2.2. 如何查看SOM神经网络的聚类中心 SOM神经网络全称为自组织竞争…

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-05-数字孪生体(Digital Twin)技术概述

文章目录 1. 数字孪生体发展历程1.2 准备期1.2 概念产生期1.3 领先应用期1.4 深度开发和大规模扩展应用期 2. 数字孪生体的定义3. 数字孪生体的关键技术3.1 建模3.2 仿真技术3.3 其他技术 4. 数字孪生体的应用4.1 制造领域4.2 全产业链上的应用4.3 城市4.4 战场 1. 数字孪生体发…

解决Java中的NoSuchAlgorithmException异常的技术实践

解决Java中的NoSuchAlgorithmException异常的技术实践 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,NoSuchAlgorithmException异常…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据,不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

【机器学习】python之人工智能应用篇——3D生成技术

在Python中,人工智能(AI)与3D生成技术的结合可以体现在多个方面,比如使用AI算法来优化3D模型的生成、通过机器学习来预测3D模型的属性,或者利用深度学习来生成全新的3D内容。然而,直接通过AI生成完整的3D模…

单片机IO口模拟串口实现原理

参考链接 1、使用GPIO来模拟UART 2、STM32之IO模拟串口篇 1、工作原理 单片机IO口模拟串口的实现原理通常是通过软件来模拟串行通信的传输和接收。下面说明了单片机IO口模拟串口的实现原理: 配置IO口:选择两个IO口作为模拟串口的发送和接收引脚。通常…

go语言:数据库sql查询保存任意数量字段的数据

1、查询任意列数的表,并输出 func search() {rows, _ : db.Query("select * from users") // 查询数据columns, _ : rows.Columns() // 查询到的字段名列表values : make([]any, len(columns)) // 根据字段数量,创建接收…

优雅的参数校验——Guava库中的Preconditions

Guava库中的Preconditions类提供了一些静态方法,用于在程序中执行参数的检查和验证。这些方法在编写健壮和可维护的代码时非常有用 checkArgument(boolean expression): 作用:用于验证方法的参数是否满足某个条件。如果条件不满足&#xff0c…

rancher快照备份至S3

巧用rancher的S3快照备份功能,快速实现集群复制、集群转移、完全崩溃后的极限修复 1.进入集群管理,在对应的集群菜单后,点击编辑配置 2.选择ETCD,启用,Backup Snapshots to S3选项 并填入你的minio 3 配置成功后 手…

使用adb shell getprop命令获取Android设备的属性

常用属性获取: adb shell getprop ro.build.version.emui —查询EMUI版本 adb shell getprop ro.product.brand —查询手机品牌 adb shell getprop ro.product.name --查询设备名称 adb shell getprop ro.serialno —查询设备序列号 获取手机系统信息( CPU,厂商…

C# 信号量的使用

学习来源:《.net core 底层入门》 第六章第9节:信号量 案例:主线程负责添加数据,子线程负责获取数据 使用SemaphoreSlim(轻信号量)实现: using System; using System.Collections.Generic; us…

python中的<class ‘complex‘>

一般编程里面不怎么会讲&#xff0c;但是还是挺强大的一个类。 在 Python 中&#xff0c;<class complex> 表示复数类型。复数是一种包含实部和虚部的数学数&#xff0c;可以用 a bj 的形式表示&#xff0c;其中 a 表示实部&#xff0c;b 表示虚部&#xff0c;j 是虚数…

bat脚本暂停写法

使用 timeout 命令来实现暂停&#xff1a; timeout /t 1 /nobreak >nul/t &#xff1a;指定暂停的时间&#xff0c;单位为秒。/nobreak&#xff1a;防止用户按任意键终止暂停。

13 物理层介质及设备

物理层介质及设备 一、线缆的连接 &#xff08;一&#xff09;线序 ​ 线序&#xff1a; RJ-45连接头12345678568A绿白绿橙白蓝蓝白橙棕白棕568B橙白橙绿白蓝蓝白绿棕白棕 ​ 1、2发送&#xff0c;3、6接收 &#xff08;二&#xff09;线缆的应用 1.线缆的连接 ​ 标准…