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

Memory全解析:截断、总结、检索,AI 的三种记性怎么选

你有没有遇到过这种情况:和 AI 聊了十几轮,突然它说"你刚才说的是什么来着?"——其实是你塞进 context 的消息太多,早几轮的内容被截掉了。或者反过来:把所有历史消息都带上,token 爆了,每次调用都超级贵。

Memory 管理,是多轮对话系统里最容易踩坑的环节。这篇把三种主流策略从原理到代码全拆一遍。


为什么需要 Memory 管理?

LLM 本质上是无状态的。每次调用 API,它都不记得上一次说了什么。要实现"记忆",唯一的方法是把历史对话放进messages数组传给它。

但问题来了:

  • 上下文窗口有限:GPT-4o 是 128K tokens,图片、工具调用、系统 prompt 会吃掉大量空间
  • Token 费用是实打实的:每次都带上 100 轮历史,费用直接乘以历史长度
  • 信息密度不均:第 1 轮说的"我叫小明"比第 98 轮的废话重要得多,但朴素截断会把它一起丢掉

所以,Memory 管理本质是一个信息压缩与检索的问题:怎么在有限的 token 预算里,保住最有价值的上下文?


三种记忆策略

LangChain.js 提供了三种主流 Memory 方案:

策略一句话定义类比
窗口截断只保留最近 N 轮对话鱼的记忆——只记得最近的事
摘要总结将历史压缩成一段摘要会议纪要——把几小时的会议浓缩成一页
向量检索历史存入向量库,按需检索相关片段笔记本+搜索——记住所有,按需翻出来

一、窗口截断(Buffer Window Memory)

只保留最近 K 轮对话,更早的直接丢弃。适合闲聊类、上下文不需要跨越太远的场景。

import { ChatOpenAI } from"@langchain/openai";import { ConversationChain } from"langchain/chains";import { BufferWindowMemory } from"langchain/memory";import { ChatPromptTemplate, MessagesPlaceholder } from"@langchain/core/prompts";const model = newChatOpenAI({ modelName: "gpt-4o-mini", temperature: 0.7 });const memory = newBufferWindowMemory({k: 5, // 保留最近 5 轮returnMessages: true, // ChatModel 必须设为 truememoryKey: "chat_history",});const prompt = ChatPromptTemplate.fromMessages([ ["system", "你是一个友好的 AI 助手。"],newMessagesPlaceholder("chat_history"), ["human", "{input}"],]);const chain = newConversationChain({ llm: model, memory, prompt });// 手动查看/写入 Memoryconst vars = await memory.loadMemoryVariables({});console.log("当前窗口:", vars);await memory.saveContext( { input: "LangChain 和 LangGraph 有什么区别?" }, { output: "LangChain 是链式调用,LangGraph 是有向图" });

二、摘要总结(Summary Memory)

让 LLM 把旧对话压缩成摘要,新对话继续追加。历史信息不丢失,代价是额外的 LLM 调用。适合长对话、需要保留早期用户背景的场景。

import { ChatOpenAI } from"@langchain/openai";import { ConversationSummaryBufferMemory } from"langchain/memory";import { ConversationChain } from"langchain/chains";import { ChatPromptTemplate, MessagesPlaceholder } from"@langchain/core/prompts";const cheapModel = newChatOpenAI({ modelName: "gpt-4o-mini", temperature: 0 });const smartModel = newChatOpenAI({ modelName: "gpt-4o" });// 混合版:近期保留原文,历史压缩成摘要const memory = newConversationSummaryBufferMemory({llm: cheapModel, // 摘要用小模型省钱maxTokenLimit: 1000, // 超过 1000 tokens 触发摘要压缩returnMessages: true,memoryKey: "chat_history",});const prompt = ChatPromptTemplate.fromMessages([ ["system", "你是一个专业的 AI 助手。以下是对话摘要,帮助你了解上下文背景。"],newMessagesPlaceholder("chat_history"), ["human", "{input}"],]);const chain = newConversationChain({ llm: smartModel, memory, prompt });// 即使对话很长,早期的"后端工程师"、"AI客服"等信息都会保留在摘要里const res = await chain.invoke({ input: "现在遇到 Memory 管理的问题,你有什么建议?" });const memVars = await memory.loadMemoryVariables({});console.log("当前摘要:", memVars.chat_history);

三、向量检索(VectorStore Memory)

把每一轮对话存入向量数据库,每次对话用当前输入做语义检索,找出最相关的历史片段塞进上下文。适合超长对话和知识密集型问答。

import { ChatOpenAI, OpenAIEmbeddings } from"@langchain/openai";import { VectorStoreRetrieverMemory } from"langchain/memory";import { MemoryVectorStore } from"langchain/vectorstores/memory";import { ConversationChain } from"langchain/chains";import { ChatPromptTemplate } from"@langchain/core/prompts";const vectorStore = newMemoryVectorStore(newOpenAIEmbeddings());const memory = newVectorStoreRetrieverMemory({vectorStoreRetriever: vectorStore.asRetriever(3), // 检索最相关的 3 条memoryKey: "relevant_history",inputKey: "input",});const prompt = ChatPromptTemplate.fromMessages([ ["system", `你是专业 AI 助手。以下是从历史对话检索到的相关片段:{relevant_history}根据这些上下文回答问题。`], ["human", "{input}"],]);const chain = newConversationChain({llm: newChatOpenAI({ modelName: "gpt-4o-mini" }), memory, prompt,});// 预加载历史await memory.saveContext( { input: "我叫小明,用的向量库是 Milvus" }, { output: "了解,Milvus 适合生产环境" });// 跨越多轮后,相关信息依然能被语义检索出来await chain.invoke({ input: "我应该用什么向量库?" }); // 会检索到 Milvus 相关历史

生产环境可以无缝替换为持久化向量库(如上一篇讲的 Milvus):

import { Milvus } from"@langchain/community/vectorstores/milvus";const milvusStore = awaitMilvus.fromExistingCollection(newOpenAIEmbeddings(), { collectionName: "conversation_memory", url: "http://localhost:19530" });const persistentMemory = newVectorStoreRetrieverMemory({vectorStoreRetriever: milvusStore.asRetriever(5),memoryKey: "relevant_history",inputKey: "input",});

选型对比:什么场景用哪种?

维度窗口截断摘要总结向量检索
实现复杂度⭐ 极简⭐⭐ 中等⭐⭐⭐ 较高
Token 消耗低(固定窗口)中(额外摘要调用)低(只取相关片段)
早期信息❌ 会丢失✅ 摘要保留✅ 语义检索保留
适合场景闲聊、短对话长对话、上下文连贯知识问答、超长历史
推荐指数🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟

选型决策树:

  • 对话轮数 < 10 轮 → 窗口截断(最简单)
  • 对话轮数 > 10 轮,且上下文连贯性重要 → 摘要总结(用混合版 SummaryBuffer)
  • 对话轮数极长 / 需要精准回溯 → 向量检索
  • 追求极致效果 → 摘要 + 向量检索组合

常见坑

坑1:returnMessages忘了设true

// ❌ 返回字符串,ChatModel 不认识const memory = new BufferWindowMemory({ k: 5 });// ✅ 返回 Message 对象,适配 ChatModelconst memory = new BufferWindowMemory({ k: 5, returnMessages: true });

坑2:memoryKey和 Prompt 占位符不一致

// ❌ memory 用 "history",Prompt 用 "chat_history",直接报错const memory = new ConversationSummaryMemory({ memoryKey: "history" });const prompt = ChatPromptTemplate.fromMessages([ new MessagesPlaceholder("chat_history"), // 对不上]);// ✅ 保持一致const memory = new ConversationSummaryMemory({ memoryKey: "chat_history" });

坑3:摘要 Memory 的额外 LLM 调用计入费用

摘要每次对话后都会触发一次 LLM。高频场景下费用不可忽视。建议摘要专用小模型,并设合理的maxTokenLimit避免频繁压缩。

坑4:向量检索结果不够稳定

向量检索是语义相似度,不是精确匹配。用户说"你之前说的第 3 点"时,检索结果可能召回语义相近但并非第 3 点的内容。对"明确引用历史"的意图,可结合时间戳/序号做精确检索。

坑5:多用户场景 Memory 没做隔离

// ❌ 所有用户共享同一个 Memory 实例,历史互相污染const sharedMemory = newBufferWindowMemory({ k: 5 });// ✅ 按 userId / sessionId 隔离const memoryStore = newMap<string, BufferWindowMemory>();functiongetMemory(userId: string) {if (!memoryStore.has(userId)) { memoryStore.set(userId, newBufferWindowMemory({ k: 5, returnMessages: true })); }return memoryStore.get(userId)!;}

可收藏清单 ✅

选型:

  • 对话 < 10 轮 →BufferWindowMemory
  • 需要保留早期信息 →ConversationSummaryBufferMemory(混合版)
  • 超长对话 / 知识问答 →VectorStoreRetrieverMemory

代码规范:

  • ChatModel 场景,returnMessages: true必须设
  • memoryKey与 Prompt 占位符严格对齐
  • 摘要 Memory 的 LLM 单独指定便宜模型
  • 多用户按userId/sessionId隔离 Memory 实例

性能与成本:

  • maxTokenLimit设合理值控制摘要频率
  • 向量检索的k值 3~5 条通常够用
  • 生产向量库选持久化方案(Milvus、Pinecone)

调试技巧:

  • memory.loadMemoryVariables({})随时查看 Memory 内容
  • verbose: true查看完整 LLM 调用链路

总结

这篇从头到尾拆解了 LangChain 三种 Memory 策略:

  • 窗口截断:实现最简单,只保留最近 K 轮,适合轻量级闲聊场景
  • 摘要总结:用 LLM 压缩历史,信息不丢失,混合版(SummaryBuffer)是长对话首选
  • 向量检索:语义召回历史片段,适合超长对话和知识密集型问答,生产级方案
  • 选型核心:轮数少用截断,轮数多用摘要,轮数极长且需精准回溯用向量检索
  • 关键细节returnMessagesmemoryKey对齐、多用户隔离,三个坑几乎人人踩过

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

相关文章:

  • 制造业AISMM落地失败率高达73%?(2024工信部白皮书权威数据+头部企业踩坑复盘)
  • 告别信号失真!用OTFS技术搞定高速移动场景下的无线通信难题(附与OFDM对比)
  • 哪个牌子的鱼油效果最好?2026全世界最好的鱼油排名推荐:降低血液粘稠度 - 资讯焦点
  • FPGA做多口万兆交换机?基于10G/25G Ethernet Subsystem主从模式搭建4路SFP光口UDP转发核心
  • 终极Windows 11系统优化完全指南:让电脑飞起来
  • Windows硬件指纹伪装终极指南:三步掌握EASY-HWID-SPOOFER核心技巧
  • 嵌入式Linux开发调试提速:用TFTP+NFS告别反复烧写EMMC的烦恼(基于I.MX6U平台)
  • JAVA低空经济无人机飞手接单平台系统源码的逻辑规则实现
  • 3大核心优势:智能化农场规划工具的效率革命
  • 重磅!JBoltAI V4.3发布:AgentRAG让企业A
  • 电化学工作站哪家供货商性价比高?国产与进口品牌深度测评 - 品牌推荐大师
  • AI辅助Python入门:向快马平台描述你的想法,自动获取带详细注释的示例代码
  • STC8H单片机IO口模式怎么选?从准双向到推挽,手把手教你配置寄存器(附代码避坑)
  • 渔人的直感:FF14钓鱼计时器终极指南与使用教程
  • 如何轻松导出微信聊天记录:WeChatMsg完整指南让数据真正属于你
  • paddleocrv5检测和识别分开识别代码
  • 快速验证图像处理想法:用快马平台十分钟搭建x7噪声风格化工具原型
  • 5分钟快速检测GPU显存稳定性:memtest_vulkan终极指南
  • 别再只用万用表了!拆解微波炉高压二极管CL01-12,实测9V才导通的秘密
  • 从买票看算法:用‘折半搜索’解决洛谷P4799冰球赛购票难题(附C++代码)
  • OpenClaw × Hermes:开源 Agent 的两种技术哲学,集体智慧和自我进化谁更像未来
  • 自感痕迹论的思想构件、自我批判与学术工具——基于三部手稿的元理论整合
  • 2026年巨果西西是骗人的吗?社区水果消费新观察 - 品牌排行榜
  • DsHidMini终极指南:让闲置PS3手柄在Windows上焕发新生
  • 基于大模型API与提示词工程,构建AI文本口语化转换工具
  • 如何用Python实现高并发抢票系统:3个核心技术突破点解析
  • 保姆级教程:在Linux上用Swingbench 2.5.9.971给Oracle数据库做压力测试
  • 免费查出来的AI率和学校检测会不会不一样?怎么免费查AI率?
  • ArcGIS Pro 基础:数据属性表的模糊、批量的查找和替换
  • 2026年吹塑机厂家选择指南:生产企业选型全攻略 - 速递信息