[LangChain] 19. 持久化记忆

news/2025/11/16 23:13:11/文章来源:https://www.cnblogs.com/Answer1215/p/19229308

目前我们所使用的 Memory,大多只存在于内存中,一旦进程关闭、用户刷新页面,所有历史对话都会丢失。实际项目中,我们常常希望:

  • 让用户“第二次回来”还能接着上次对话继续聊
  • 将多轮聊天记录保存在本地或数据库中,用于分析、审计、训练、回溯

这时候,我们就需要将 Memory 做持久化操作,从而实现“记忆不丢失”。

要进行持久化操作,无非就两种方式:

  1. 存储至文件
  2. 存储至数据库

课堂练习:手动封装一个做持久化处理的 FileChatMessageHistory 类。

import { BaseListChatMessageHistory } from "@langchain/core/chat_history";
import fs from "fs/promises";
import { AIMessage, HumanMessage } from "langchain";
import path from "path";export class FileChatMessageHistory extends BaseListChatMessageHistory {constructor(filepath) {super();this.filepath = filepath;this._q = Promise.resolve();}_enqueue(fn) {const run = () => fn();const p = this._q.then(run, run);this.q = p.catch(() => {});return p;}async _ensureDir() {await fs.mkdir(path.dirname(this.filepath), { recursive: true });}async _atomicWrite(text) {await this._ensureDir();const tmp = `.tmp-${Date.now()}-${Math.random().toString(36).substring(2)}`;await fs.writeFile(tmp, text, "utf8");await fs.rename(tmp, this.filepath);}async _readRaw() {// "[{type: 'human', content: 'xxxx'},{type: 'ai', content: 'xxxx}]"try {const txt = await fs.readFile(this.filepath, "utf8");const arr = JSON.parse(txt);return Array.isArray(arr) ? arr : [];} catch (e) {if (e && e.code === "ENOENT") return [];if (e instanceof SyntaxError) {console.warn(`历史文件损坏,已忽略:${this.filepath}`);return [];}throw e;}}async _saveMessages(messages) {const raw = messages.map((m) => ({type: m.type,content: m.content,}));await this._atomicWrite(JSON.stringify(raw, null, 2));}// 下面的方法就是对外的接口async getMessages() {const raw = await this._readRaw(); // 从文件中进行读取return raw.map((r) =>r.type === "human"? new HumanMessage(r.content): new AIMessage(r.content));}/*** 添加一条消息* @param {*} message 消息对象*/async addMessage(message) {return this._enqueue(async () => {const msgs = await this.getMessages();msgs.push(message);await this._saveMessages(msgs);});}async addMessages(messages) {return this._enqueue(async () => {const msgs = await this.getMessages();msgs.push(...messages);await this._saveMessages(msgs);});}async clear() {return this._enqueue(async () => {this._atomicWrite("[]");});}
}

什么时候做持久化?

不需要每一轮都写磁盘,这样太频繁了:

  • 文件 I/O 频繁写入会带来性能开销
  • 若使用数据库,也可能造成 写操作压力大

通常采用“退出写入”的机制,或者推荐如下的触发时机:

触发时机 推荐用途
每隔几分钟 自动同步、做日志
用户关闭页面 防止会话丢失
用户点击保存 主动存档、构建知识库

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

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

相关文章

2025 年 11 月 Q355B/Q345B/16Mn 冷拉圆钢厂家推荐排行榜,高强度结构钢,低合金圆钢,精密冷拉钢材公司精选

2025 年 11 月 Q355B/Q345B/16Mn 冷拉圆钢厂家推荐排行榜 行业背景分析 随着我国制造业向高质量发展转型,高强度结构钢和低合金圆钢在机械制造、汽车工业、重型装备等领域的应用日益广泛。Q355B、Q345B和16Mn作为典型…

2025 年 11 月 Q355B/Q345B/16Mn 冷拉方钢厂家推荐排行榜,高强度结构钢,建筑机械用冷拉方钢,优质钢材厂家精选

2025 年 11 月 Q355B/Q345B/16Mn 冷拉方钢厂家推荐排行榜,高强度结构钢,建筑机械用冷拉方钢,优质钢材厂家精选 行业背景与发展现状 冷拉方钢作为重要的工业基础材料,在建筑机械、重型装备、工程结构等领域发挥着关…

*题解:P11364 [NOIP2024] 树上查询

原题链接 困难题。 解析 考虑处理出形如 \((u,v,d)\) 的三元组表示编号从 \(u\) 到 \(v\) 的点的 LCA 深度为 \(d\),且区间 \([u,v]\) 是极长的。怎么处理呢?肯定要利用子树信息,我们尝试进一步合并子树已经合并出的…

oj第一题python解法

用pyhon实现自动识别输入截止功能 一、 序言与题目引入 对于新接触编程语言如python和c的新同学来说,学校的oj平台上有很好配套练习,既有一定难度,又不会像LeetCode等程序员公用的成熟平台那样太难上手,不过学长学…

11.16方法

11.16方法 1. 方法 是什么? 方法(method)是程序中最小的执行单元 有什么用? 重复的代码、具有独立功能的代码可以抽取到方法中。方法可以提高代码的复用性、可以提高代码的可维护性 2.方法的格式 方法就是把一些代…

基于Tcl命令的HyperView截图

准备工作 Tcl/Tk 命令可以实现 HyperWorks 的中更底层的操作和其他高级功能。应当注意在 HyperMesh 中不支持 Tcl 命令,必须在 HyperMesh Desktop 或 HyperWorks 中使用。不过 HyperView 似乎就直接是在 HyperWorks 环…

2025 年 11 月智能吉他厂家推荐排行榜,无弦吉他,自动档吉他,伴奏吉他,MIDI吉他,创新科技与便捷演奏体验之选

2025 年 11 月智能吉他厂家推荐排行榜,无弦吉他,自动档吉他,伴奏吉他,MIDI吉他,创新科技与便捷演奏体验之选 随着数字音乐技术的快速发展,智能乐器领域迎来了革命性突破。无弦吉他、智能吉他、自动档吉他、伴奏吉…

团队作业3——需求改进与系统设计

团队作业3——需求改进与系统设计团队作业3——需求改进与系统设计这个作业属于哪个课程 计科23级12班这个作业要求在哪里 团队作业3——需求改进与系统设计这个作业的目标 需求与原型改进、系统设计、Alpha阶段任务分…

完整教程:Redis(69)Redis分布式锁的优点和缺点是什么?

完整教程:Redis(69)Redis分布式锁的优点和缺点是什么?2025-11-16 23:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important…

2025 年 11 月 Q355B/Q345B/16Mn 方钢厂家推荐排行榜,低合金高强度方钢,结构用方钢,建筑用方钢公司推荐

2025 年 11 月 Q355B/Q345B/16Mn 方钢厂家推荐排行榜 在建筑、机械制造和基础设施建设领域,Q355B、Q345B 和 16Mn 方钢作为低合金高强度结构钢材,凭借其优异的力学性能和焊接特性,成为关键承重构件和机械部件的首选…

2025 年 11 月精密仪器厂家推荐排行榜,触摸仪表,手表锁具,测试针,医疗传感器,Pogopin声学弹簧公司精选

2025 年 11 月精密仪器厂家推荐排行榜,触摸仪表,手表锁具,测试针,医疗传感器,Pogopin声学弹簧公司精选 随着工业4.0和智能制造的深入推进,精密仪器行业正迎来技术升级与市场需求的双重驱动。精密仪器作为工业生产…

MySQL 数据库核心操作全解析:从创建到备份与连接管理 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

evalscope使用2-使用自定义数据集压测

使用evalscope进行大模型测试-使用自定义数据集进行压测 使用自定义数据集进行压测,需要定义模板、提示词数据集、自定义数据集插件,命令行中指定--dateset参数为custom 1、evalscope命令,其中指定dataset为cust…

2025 年 11 月摩托车/机车厂家推荐排行榜:街车、跑车、巡航机车、越野摩托车品牌实力与市场口碑深度解析

2025 年 11 月摩托车/机车厂家推荐排行榜:街车、跑车、巡航机车、越野摩托车品牌实力与市场口碑深度解析 行业背景与发展趋势 摩托车产业作为现代交通工具领域的重要组成部分,近年来呈现出多元化、专业化的发展态势。…

20232402 2025-2026-1 《网络与系统攻防技术》实验五实验报告

20232402 2025-2026-1 《网络与系统攻防技术》实验五实验报告 1.实验内容 1.1 域名与IP信息查询 用whois、dig、nslookup、traceroute/tracert及在线工具查询baidu.com,获取DNS注册人及联系方式,域名对应IP地址,IP注…

2025 年 11 月热轧方钢/扁钢厂家推荐排行榜,方钢,扁钢,热轧方钢,热轧扁钢,优质钢材生产公司推荐

2025年11月热轧方钢/扁钢厂家推荐排行榜 行业背景与发展现状 热轧方钢和扁钢作为基础金属材料,在建筑结构、机械制造、轨道交通等领域具有广泛应用。随着我国制造业转型升级的深入推进,对热轧钢材的尺寸精度、表面质…

2025 年 11 月冷拉/冷拔六角钢厂家推荐排行榜,冷拉六角钢,冷拔六角钢,精密冷拉六角钢,高强度六角钢公司推荐

2025年11月冷拉/冷拔六角钢厂家推荐排行榜 行业背景分析 冷拉/冷拔六角钢作为重要的工业基础材料,在机械制造、汽车工业、电梯制造等领域发挥着关键作用。随着制造业向高质量方向发展,市场对冷拉六角钢、冷拔六角钢的…

2025 年 11 月氢氧化镁厂家推荐排行榜,矿石氢氧化镁,水镁石氢氧化镁,阻燃剂氢氧化镁,改性氢氧化镁公司推荐

2025年11月氢氧化镁厂家推荐排行榜:矿石氢氧化镁、水镁石氢氧化镁、阻燃剂氢氧化镁、改性氢氧化镁公司推荐 行业背景与发展现状 氢氧化镁作为一种重要的无机化工产品,在阻燃材料、环保处理、医药制备等领域具有广泛应…

3种决策树算法

这是一个经典的西瓜数据集,让我们来求它的信息增益(ID3决策树算法)、决策树、信息增益率(C4.5决策树算法)、基尼指数【信息增益】(ID3算法) 记住两个量"信息熵"和"信息增益" [信息熵]表示信…

(Kotlin高级特性三)Kotlin密封类(Sealed Class)在何时比枚举更适用? - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …