当前位置: 首页 > news >正文

[LangChain] 19. 持久化记忆

目前我们所使用的 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.jsqmd.com/news/42217/

相关文章:

  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拉圆钢厂家推荐排行榜,高强度结构钢,低合金圆钢,精密冷拉钢材公司精选
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拉方钢厂家推荐排行榜,高强度结构钢,建筑机械用冷拉方钢,优质钢材厂家精选
  • *题解:P11364 [NOIP2024] 树上查询
  • oj第一题python解法
  • 11.16方法
  • 基于Tcl命令的HyperView截图
  • 2025 年 11 月智能吉他厂家推荐排行榜,无弦吉他,自动档吉他,伴奏吉他,MIDI吉他,创新科技与便捷演奏体验之选
  • 团队作业3——需求改进与系统设计
  • 完整教程:Redis(69)Redis分布式锁的优点和缺点是什么?
  • 2025 年 11 月 Q355B/Q345B/16Mn 方钢厂家推荐排行榜,低合金高强度方钢,结构用方钢,建筑用方钢公司推荐
  • 2025 年 11 月精密仪器厂家推荐排行榜,触摸仪表,手表锁具,测试针,医疗传感器,Pogopin声学弹簧公司精选
  • MySQL 数据库核心操作全解析:从创建到备份与连接管理 - 详解
  • evalscope使用2-使用自定义数据集压测
  • 2025 年 11 月摩托车/机车厂家推荐排行榜:街车、跑车、巡航机车、越野摩托车品牌实力与市场口碑深度解析
  • 20232402 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 2025 年 11 月热轧方钢/扁钢厂家推荐排行榜,方钢,扁钢,热轧方钢,热轧扁钢,优质钢材生产公司推荐
  • 2025 年 11 月冷拉/冷拔六角钢厂家推荐排行榜,冷拉六角钢,冷拔六角钢,精密冷拉六角钢,高强度六角钢公司推荐
  • 2025 年 11 月氢氧化镁厂家推荐排行榜,矿石氢氧化镁,水镁石氢氧化镁,阻燃剂氢氧化镁,改性氢氧化镁公司推荐
  • 3种决策树算法
  • (Kotlin高级特性三)Kotlin密封类(Sealed Class)在何时比枚举更适用? - 指南
  • 2025 年 11 月冷拉/冷拔扁钢厂家推荐排行榜,冷拉扁钢,冷拔扁钢,精密冷拉扁钢,高强度冷拔扁钢公司推荐
  • 20232309 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • CIO的能力
  • 20232326 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • LangChain4j实战-工具(函数调用)Tools(Function Calling)
  • 应用安全 --- frida成功的关键 之 时机
  • 小米路由器通过电脑使用手机usb共享网络联网教程
  • 第27天(简单题中等题 二分查找)
  • 题解:P14452 [ICPC 2025 Xian R] Follow the Penguins
  • Atcoder 432 A-F 总结+题解