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

[LangGraph] 管理短期记忆

随着对话会随着轮数不断增长。

这时候,一个非常现实的问题就会出现:对话越聊越长,最终可能会超出大模型的上下文窗口限制。

这并不是 langgraph 独有的问题,而是所有基于大模型的长对话系统都会遇到的限制。

为了解决这个问题,通常有几种常见的处理思路。

  1. 裁剪消息
  2. 永久删除消息
  3. 总结消息
  4. 自定义策略

1. 裁剪消息

最简单的做法是:在每次调用 LLM 之前,只保留一部分对话消息。

例如:

  • 只保留最近的 N 轮对话
  • 或者删除最早的几条消息

这种方式的优点是实现简单、成本低;但缺点也很明显:被裁掉的内容,大模型就“彻底不知道了”。

因此,它更适合用于对历史依赖不强的聊天场景。

2. 永久删除消息

和裁剪类似,但更加彻底:

  • 不是“这一次不用”
  • 而是直接从 langgraph 的 State 中删除

一旦删除,这些消息就不会再参与后续的流程,也不会被 checkpoint 记录。

这种方式适合那些:

  • 明确已经“失去价值”的历史消息
  • 或者只对当前流程阶段有意义的临时信息

3. 总结消息

相比简单裁剪,更合理的一种方式是:把早期对话“压缩成一段总结”。

做法通常是:

  1. 将较早的对话内容交给 LLM
  2. 生成一段摘要
  3. 用这段摘要,替换原本冗长的消息列表

这样一来:

  • 大模型仍然能“知道之前发生了什么”
  • 但上下文占用大幅减少

这也是实际项目中最常见、最平衡的一种方案。

// 这是图里面的一个节点:用于对对话进行压缩总结的
import type { TState } from "./state.ts";
import { KEEP_LAST_N_MESSAGES } from "./config.ts";
import { model } from "./model.ts";
import { AIMessage } from "@langchain/core/messages";export async function summarizeNode(state: TState): Promise<Partial<TState>> {console.log("📝 正在对早期对话进行总结...");// 拿出需要被总结的旧消息const messagesToSummarize = state.messages.slice(0,state.messages.length - KEEP_LAST_N_MESSAGES,);// 构造总结 Promptconst summaryPrompt = `请将以下对话内容总结成一段简短的中文摘要,保留关键信息和上下文,不要逐条列举:${messagesToSummarize.map((m) => `${m.type}: ${m.content}`).join("\n")}`;// 调用大模型得到摘要结果const summaryResponse = await model.invoke(summaryPrompt);const summaryContent =typeof summaryResponse.content === "string"? summaryResponse.content: JSON.stringify(summaryResponse.content);// 输出总结后的内容console.log("\n" + "=".repeat(50));console.log("🧹 触发历史消息总结 (Summarization)");console.log(`📝 摘要内容: ${summaryContent}`);console.log("=".repeat(50) + "\n");// 这个相当于就是一条信息const summaryMessage = new AIMessage(`【对话摘要】${summaryContent}`);// 上面的这一条 AIMessage 就需要去替换原来对话历史里面对应条数的对话const newMessages = [summaryMessage,...state.messages.slice(-KEEP_LAST_N_MESSAGES),];return {messages: newMessages,};
}

4. 自定义策略

在真实业务中,往往不会只用上述某一种方法,而是组合使用。例如:

  • messages 里,只保留「最近的 + 必要的」
  • 早期对话,压缩成摘要
  • 无关内容直接过滤
  • 关键事实,单独写入长期记忆

这样混合使用,可以取各种策略的优点。总之,自定义策略的核心目标只有一个:让模型在不超出上下文限制的前提下,依然能“知道自己在干什么”。

http://www.jsqmd.com/news/462553/

相关文章:

  • SSL证书收费标准:2026年安信SSL证书价格总览 - 麦麦唛
  • 从仿真到实战:基于LTspice的H桥电机驱动电路设计与优化
  • 打造编程利刃:自定义按键鼠标的极客秘籍
  • 学影视化妆选择哪个学校好?艺丽美妆学校影视化妆数据盘点 - 梅1梅
  • 回收永辉超市卡的正确方法,这份指南不可错过! - 团团收购物卡回收
  • iptables当成路由器
  • parted实战:无损扩容根分区(GPT大磁盘篇)
  • 二进制分析双雄对决:WinHex与ImHex在CTF中的高阶使用指南
  • 从零开始:在Logisim中实现MIPS单周期CPU的详细步骤(华中科技实验同款)
  • 避坑!PyTorch安装报错‘Python版本不匹配‘?3分钟自查表+降级方案
  • 从“搬砖工具”到“超级员工”:企业如何从RPA升级到AI Agent(智能体)模式?
  • 遥感图像小目标检测避坑指南:YOLO-FNC与YOLOv7的5个关键性能对比
  • 降本增效必看:企业管理者如何通过部署Agent降低人力成本?
  • DDD实战:如何用聚合根解决电商库存与订单的数据一致性问题?
  • 5款AI原型设计工具横向评测:墨刀、Figma、Uizard谁更适合你的团队?
  • 永磁同步电机无位置传感器控制:ESO-PLL与传统PLL性能对比实测
  • 天津国际教育择校指南:六力维多课程中心与四大热门国际学校全解析 - 品牌2026
  • Qt字体族FontFamily实战速查与避坑指南
  • Hugging Face Transformers实战:AutoProcessor如何简化多模态模型预处理?
  • 【快速EI检索 | SAE出版】第五届航空航天、空气动力学和机电工程国际学术会议(AAME 2026)
  • 多路归并算法在外部排序中的实现与优化的技术7
  • 5分钟搞定Meta Quest3与Unity串流测试(ARM64+IL2CPP配置)
  • 即梦AI必记的神级指令,保姆级提示词完整入门教程
  • 5分钟教你用纯HTML+JS打造轻量级Postman替代工具(附完整源码)
  • JavaScript基础课程一、 从小白到专家,程序员的成功之路
  • 【快速EI检索 | IEEE出版】2026年第十一届智能计算与信号处理国际学术会议(ICSP 2026)
  • 2026年天津比较知名的国际高中有哪些?有哪些优势? - 品牌2026
  • Zabbix监控系统内存泄漏?从866个僵尸进程看Swap异常背后的真相
  • 音视频开发必看:FFmpeg PCM转MP3的底层原理与性能优化技巧
  • 什么是高性能计算服务器?