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

大模型的“记忆”——从上下文窗口到会话管理

前言在前面的文章中我们理解了RAG如何让大模型基于外部文档回答问题。但还有一个关键问题没有解决多轮对话。你肯定见过这样的场景——用户问Java线程池有哪些参数AI回答后用户追问第二个参数怎么设置。AI必须知道第二个参数指的是什么才能正确回答。这就是上下文记忆要解决的问题。在课程问答项目中我用ConversationBufferMemory实现了多轮对话。但面试官可能会追问“为什么选BufferMemory而不是SummaryMemory如果对话持续100轮怎么办” 本文就是帮你彻底搞懂大模型记忆的底层原理让你能回答这类追问。本文核心问题大模型本身有记忆吗为什么每次对话都需要提醒它之前说了什么上下文窗口是什么128K的窗口到底够不够用ConversationBufferMemory的底层原理是什么它有什么致命缺陷ConversationSummaryMemory是怎么做摘要的和BufferMemory比优劣在哪为什么你选择了BufferMemory而不是SummaryMemory上下文太长会出现什么问题大模型会遗忘对话开头的内容吗如何平衡记住更多和成本控制除了LangChain提供的方案还有什么更高级的记忆管理策略读完本文你将对大模型的上下文管理拥有从原理到实践的完整理解。一、大模型本身没有记忆疑问ChatGPT不是能记住刚才聊了什么吗为什么说大模型没有记忆回答大模型本身是无状态的——每次调用都是独立的。它之所以看起来记得是因为我们把之前的对话内容拼在了Prompt里。1.1 无状态的大模型第一次调用 Prompt: Java线程池有哪些参数 回答: 有corePoolSize、maximumPoolSize、keepAliveTime等... 第二次调用没有记忆 Prompt: 第二个参数怎么设置 回答: 请问您指的是哪个参数我不清楚您之前问了什么。 第二次调用有记忆 Prompt: 之前的问题Java线程池有哪些参数回答有corePoolSize、maximumPoolSize... 现在的问题第二个参数怎么设置 回答: maximumPoolSize的设置需要考虑CPU核数、任务类型、队列容量...本质大模型不是记住了而是我们把记忆手动拼在了Prompt里让它重新读了一遍。1.2 为什么大模型不自己记住大模型不存储对话状态的主要原因架构限制Transformer每次前向传播是无状态的没有状态缓存来记住上一轮的信息商业考量如果每个用户都占用GPU显存存储对话状态服务提供商将无法支撑海量用户实现成本无状态架构可以通过水平扩展支持更多用户而有状态则需要复杂的会话管理所以记忆这个功能是由调用方在外部实现的——这就是会话管理的本质。二、上下文窗口——大模型的工作台疑问上下文窗口是什么为什么说它是工作台而不是记忆库回答上下文窗口是大模型每次处理文本的容量上限。它更像一个工作台——每次调用时我们把所有相关资料放在台面上大模型在这个台面上工作。2.1 上下文窗口的本质上下文窗口 一次Prompt中能包含的Token总数输入输出 GPT-4128K Token ≈ 约10万汉字 GPT-3.54K ~ 16K Token 本地开源模型通常 2K ~ 8K TokenToken是模型处理的最小单位英文大约1个单词≈1-2个Token中文一个汉字≈1.5-2个Token。128K窗口理论能装下一本中篇小说但这个空间不是全部给记忆的——它还要装Prompt指令、检索到的文档、系统消息和即将生成的回答。2.2 上下文窗口不是越大越好窗口大小影响了多个维度窗口大小优势劣势大窗口128K能装更多上下文成本高按Token计费、回答变慢、注意力稀释小窗口4K快、成本低多轮对话容易被截断中等16K大多数场景的平衡点极端长文档和长对话场景仍不够2.3 注意力稀释效应大模型对上下文窗口中的信息关注度并不均匀。通常开头和结尾的信息最受关注中间的信息容易被忽略。这意味着即使128K窗口能装下所有对话历史把100轮的对话全塞进去模型对第30-70轮的信息也可能关注不足。窗口容量是必要条件但不是答案质量的充分条件。三、ConversationBufferMemory——全量记忆的利与弊疑问BufferMemory是怎么工作的你在课程问答项目中为什么选它回答BufferMemory的逻辑很简单——把每轮对话都保存起来下次提问时全部拼进Prompt。关键词全量、简单、但不可持续。3.1 底层原理// 第一轮用户:Java线程池有哪些参数AI:有corePoolSize、maximumPoolSize、keepAliveTime、workQueue...memory → 存储一条用户: Java线程池有哪些参数AI: 有corePoolSize...// 第二轮用户:第二个参数怎么设置// 实际发给大模型的Prompt 之前的对话 用户: Java线程池有哪些参数 AI: 有corePoolSize、maximumPoolSize、keepAliveTime、workQueue... 当前问题第二个参数怎么设置 AI→ 知道第二个指的是maximumPoolSizememory → 追加存储// 第三轮同理之前的对话全部拼接...3.2 为什么在课程问答项目中选它课程问答场景的特点 - 对话轮次较短通常是3-5轮 - 每轮回答比较简洁不超过300字这是Prompt里约束好的 - 总Token量好控制3-5轮对话在16K窗口内完全够用 - 需要精确理解上下文技术问答中第二个参数这类指代很常见 BufferMemory在这个场景下刚好够用 - 实现简单不需要额外的摘要模型 - 信息完整不会因为摘要丢失技术细节 - 成本可控短对话的Token量不会爆炸3.3 BufferMemory的致命缺陷对话轮次 → Token增长 → 问题和后果 第10轮约4000 Token → 仍然正常 第50轮约20000 Token → 开始变慢、成本上升 第100轮约40000 Token → 注意了稀释、回答质量下降 第200轮约80000 Token → 超出窗口被截断、丢失早期对话根本问题BufferMemory的Token消耗随对话轮次线性增长而早期对话的价值随时间衰减。到某一轮后大量的历史内容对当前问题的帮助微乎其微反而挤占了真正有用的上下文空间。四、ConversationSummaryMemory——以精度换空间疑问如果对话超过50轮BufferMemory撑不住了怎么办回答用SummaryMemory——把长对话历史压缩成摘要只保留要点。4.1 底层原理// 当对话超过一定轮次时触发摘要Stringsummary 用户询问了Java线程池的核心参数。AI解答了corePoolSize、 maximumPoolSize、keepAliveTime和workQueue的含义及配置方法。 用户追问了最大线程数与CPU核数的关系。AI建议IO密集型任务 设置为核心数的2倍CPU密集型任务设置为核心数1。 用户... ;// 新一轮提问时只把摘要最近的几轮对话拼进PromptStringpromptf 对话历史摘要{summary} 最近的对话 用户: 那么workQueue有哪几种选择 AI: LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue... 当前问题{question} ;4.2 优劣对比维度BufferMemorySummaryMemory信息完整性完整保留压缩可能丢失细节Token消耗持续线性增长控制在一个范围内长对话支持受限理论上可以支持无限轮实现复杂度极低需要额外的摘要模型调用延迟无额外耗时摘要生成需要时间回答精度引用精确可能因摘要偏差导致错误成本Token持续增加的API费用摘要调用一次的API费用 被压缩后仍持续的Token费用4.3 什么场景选SummaryMemory用户和AI的对话很长超过20轮对话内容多为闲聊、咨询而非精确的技术参数对回答的细节精度要求不是极致摘要丢失的细节不影响用户体验愿意接受额外的摘要生成耗时和费用4.4 课程问答项目中为什么没选它课程问答场景中每轮对话都涉及精确的技术细节——“第二个参数怎么设置这类问题完全依赖上一轮回答中的精确信息而非主题摘要。SummaryMemory会把maximumPoolSize的详细配置压缩成讨论了最大线程数的设置”丢失了第二个参数和maximumPoolSize之间的精确映射后续追问就答不准了。五、上下文太长会出现什么问题疑问BufferMemory的上下文越长除了成本高还有什么隐藏问题回答三个隐藏问题——“迷失中间”、注意力分散、成本叠加。5.1 迷失中间效应大模型对上下文开头和结尾的内容关注度较高对中间部分关注度较低。当对话历史长达几万Token时早期对话被压在中间区域模型可能读不进去。一个在第3轮确认过的信息到了第40轮可能被模型遗忘——不是模型本身的问题而是上下文结构决定的注意力分布。5.2 注意力被无关信息分散早期对话中的信息大部分与当前问题无关。但这堆历史持续占据着上下文空间模型在生成回答时需要穿过它们才能找到后来的关键信息。信息密度被稀释了——有用的信息被大量无用信息包围模型更容易遗漏或误读。5.3 成本问题GPT-4每百万Token输入约30美元。如果多轮对话每次输入8000Token100次提问就是80万Token——约24美元。而实际对当前问题有用的信息可能只占这8000Token中的10%。90%的费用花在了无用的记忆搬运上。六、记忆管理的平衡之道疑问所以到底该怎么管记忆有哪些更高级的策略回答核心原则——“不该记住的果断忘该记住的保证记住”。这不是一句口号而是可以工程化实现的设计决策。6.1 滑动窗口记忆只保留最近N轮对话——旧对话直接丢弃。简单粗暴但有效。// 只保留最近10轮对话intwindowSize10;ListMessagerecentMessagesconversationHistory.subList(Math.max(0,history.size()-windowSize),history.size());适用场景对话话题会转移旧信息对当前几乎无用的场景。6.2 混合记忆Buffer Summary近期对话全量保留远期对话生成摘要。// 最近5轮全量保留ListMessagerecenthistory.subList(history.size()-5,history.size());// 5轮之前摘要保存StringdistantsummaryModel.summarize(history.subList(0,history.size()-5));Stringpromptf 历史对话摘要{distant} 最近对话{recent} 当前问题{question} ;这是生产环境中最常用的方案。细节保留和成本控制之间找到了一个可操作的平衡——最近几轮保持完整性支撑追问远期只保留主题脉络释放空间。6.3 实体记忆只记住对话中提到的关键实体人名、参数名、配置值而不是整段对话。这需要额外的命名实体识别NER能力实现复杂度高于前两种方案。但在知识密集型的专业场景中如医疗问诊、法律咨询按实体来组织记忆可以让检索和引用更精准。七、课程问答项目的记忆架构疑问在课程问答项目中你的记忆是怎么设计的为什么这么设计回答方案选型基于场景特征——短对话、技术问答、需要精确引用。最终选择了BufferMemory 对话轮次上限的组合。ConversationBufferMemorymemorynewConversationBufferMemory();memory.setMaxTokens(4000);// 上限约2000字的中文对话历史ConversationalRetrievalChainchainnewConversationalRetrievalChain(llm,// 大模型retriever,// RAG检索器memory// 记忆);设置4000 Token上限的原因课程问答通常3-5轮结束——学生问一个概念追问一两个细节问题就解决了。4000 Token足够覆盖这种典型场景超过上限自动截断最早的对话——防止Token溢出被OpenAI拒绝或丢失更重要的近期对话配合Prompt中的回答不超过300字约束——限制每轮回答长度延长记忆有效轮次学生追问第二个参数怎么设置时完整链路用户: Java线程池有哪些参数 → Chain检索课程文档 → 拼接Prompt → LLM生成回答 → memory存储这轮对话 用户: 第二个参数怎么设置 → memory取出上一轮对话 → 拼接到当前Prompt → LLM看到上文理解第二个参数 maximumPoolSize → Chain检索maximumPoolSize的课程文档 → 生成回答总结大模型本身没有记忆每次调用都是独立的。我们通过Prompt拼接历史对话来模拟记忆本质是在输入端重建对话上下文上下文窗口是大模型的工作台——容量决定了工作台上能放多少材料。不是越大越好还要考虑成本、速度和注意力稀释ConversationBufferMemory适合短对话20轮、需要精确上下文的场景优势是信息完整缺陷是Token线性增长不可持续ConversationSummaryMemory适合长对话、非精确应用能控制成本但会丢失细节。第二个参数这类精确引用可能在摘要过程中丢失上下文过长带来的问题迷失中间模型忽略中间的信息、注意力稀释信息密度下降、成本叠加多少轮对话乘上每轮的Token费用记忆管理的核心是取舍——近期全量Buffer远期摘要Summary的混合策略是生产环境中最实用的方案课程问答项目选BufferMemory的原因短对话、技术问答、需要精确引用。未来如果扩展为多轮的长对话系统可以用混合记忆策略平滑升级下一篇预告AI理论学习七——大模型API调用从Token到流式输出。拆解Token是什么、为什么按Token计费、温度参数如何控制输出、SSE流式输出的底层原理。

相关文章:

大模型的“记忆”——从上下文窗口到会话管理

前言 在前面的文章中,我们理解了RAG如何让大模型基于外部文档回答问题。但还有一个关键问题没有解决:多轮对话。 你肯定见过这样的场景——用户问"Java线程池有哪些参数",AI回答后,用户追问"第二个参数怎么设置&qu…...

RAG检索增强生成——让大模型学会“开卷作答”

前言 在前面的文章中,我们拆解了Embedding如何把文字变成向量,Transformer如何理解词与词之间的关系,以及大模型为什么会产生幻觉。这三条知识线最终汇聚到一个技术上——RAG(检索增强生成)。 你可能会问:R…...

Linux TCP/UDP 网络编程完全指南:从基础到实践

引言在 Linux 网络编程中,传输层提供两种核心协议:TCP(传输控制协议) 和 UDP(用户数据报协议)。它们各有特点,适用于不同的应用场景。特性TCPUDP连接性面向连接(三次握手&#xff09…...

多模态模型数据筛选:提升AI性能的关键策略

1. 多模态推理模型的数据筛选困境去年我在参与一个医疗影像与文本报告的联合分析项目时,团队花了大半年时间收集了超过200万条数据样本。但当我们把这些数据直接喂给多模态模型后,效果却出人意料地差——模型在测试集上的准确率比单模态模型还低了12%。经…...

SpaceMolt Client:基于Bun的CLI工具,实现游戏API自动化与AI智能体集成

1. 项目概述与核心价值 如果你是一名开发者,尤其是对AI智能体、自动化脚本或者命令行工具感兴趣,那么你很可能已经厌倦了那些需要反复点击网页、在浏览器和代码编辑器之间来回切换的在线游戏体验。SpaceMolt Client的出现,正是为了解决这个问…...

语音识别鲁棒性评估:混响环境下的ASR性能优化

1. 项目背景与核心价值在语音识别技术快速发展的今天,我们常常忽略了一个关键问题:实际应用场景中的语音信号往往不是实验室里的"纯净样本"。会议室、客厅、走廊等真实环境产生的混响效应,会显著影响自动语音识别(ASR&a…...

Unity开发AI助手API幻觉终结方案:MCP协议与本地数据库实践

1. 项目概述:当AI助手遇上Unity开发,如何终结API幻觉? 如果你是一名Unity开发者,同时又在使用Claude、Cursor这类AI编程助手,那你一定经历过这样的场景:你问AI“Unity里怎么异步加载场景?”&…...

【R语言污染溯源建模实战指南】:20年环境数据科学家亲授3大不可绕过的建模陷阱与5步标准化流程

更多请点击: https://intelliparadigm.com 第一章:R语言污染溯源建模的科学逻辑与环境意义 污染溯源建模是环境风险评估与精准治理的核心环节,其科学逻辑建立在“源—路径—受体”三维因果链之上。R语言凭借其强大的统计建模能力、丰富的空间…...

PHP表单引擎兼容性灾难现场:PHP 8.3+ JIT、Swoole 5.1协程、RoadRunner v2024——跨运行时适配避坑清单

更多请点击: https://intelliparadigm.com 第一章:PHP表单引擎的核心架构与设计哲学 PHP表单引擎并非简单地封装HTML标签,而是以“声明式定义 运行时编排”为设计内核,将表单视为可组合、可验证、可序列化的领域对象。其核心由三…...

FreeRTOS heap4内存管理源码逐行解读:从链表操作到内存碎片合并的实战指南

FreeRTOS heap4内存管理源码深度剖析:从链表设计到碎片优化的工程实践 在嵌入式系统开发中,内存管理往往是最考验工程师功底的领域之一。FreeRTOS作为业界领先的实时操作系统,其heap4内存管理器以简洁高效的设计,成为许多关键系统…...

如何在Windows 11上完美运行安卓应用:WSA完整使用指南

如何在Windows 11上完美运行安卓应用:WSA完整使用指南 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 你是否想过在Windows电脑上流畅运行手机应…...

环境配置与基础教程:实战踩坑:多进程 DataLoader 中 num_workers 与 pin_memory 的底层逻辑与性能调优最佳实践

前言:那个让 GPU “假忙” 的隐形杀手 如果你曾盯着 nvidia-smi 上那个 90%+ 的 GPU 利用率数字暗自放心,那你很可能已经被 “利用率幻觉” 欺骗了很久。 根据 Unite.ai 联合 Ingero 开源团队在 2026 年 3 月发布的一项内核级跟踪调查,PyTorch DataLoader 在纯内存 GPU 工…...

ncmdump实践指南:如何快速解密网易云音乐NCM格式音频文件

ncmdump实践指南:如何快速解密网易云音乐NCM格式音频文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐时代,格式兼容性成为用户面临的实际问题。网易云音乐采用的NCM加密格式虽然保护了版权&…...

ABAP-OO:(7)类对象的动态创建和调用

在 ABAP 面向对象开发中,动态创建数据、动态创建对象、动态调用方法是实现灵活架构、低耦合、可配置化的关键技术。它区别于静态编码,核心特点是:类型与行为不在编译期固定,而是在程序运行时动态决定。 一、什么是动态创建&#x…...

Kagantic-Codebase:AI协作代码库治理框架的设计与实践

1. 项目概述:为AI协作而生的代码库治理框架如果你正在尝试将AI助手(比如Claude Code、Cursor、GitHub Copilot)深度集成到你的开发工作流中,并且已经受够了每次都要在聊天框里重复解释项目结构、编码规范和操作边界的麻烦&#xf…...

强化学习在医学视觉语言模型中的应用与优化

1. 项目概述作为一名长期从事医学AI研究的从业者,我见证了强化学习(RL)在医学视觉语言模型领域的崛起。这个交叉领域正在重塑医学影像分析的范式——从传统的单一图像识别,进化到能够理解影像内容并生成专业诊断描述的智能系统。在…...

AI记忆系统演进:从废弃三层架构到实时向量存储实践

1. 项目概述:从废弃的蓝图到现代AI记忆系统的演进如果你正在为你的AI助手寻找一个持久、可搜索的记忆系统,并且偶然发现了openclaw-jarvis-memory这个项目,那么你可能会看到它已经被标记为“废弃”。别急着关掉页面,这恰恰是一个绝…...

智能家居改造第一步:如何安全地为智能开关接入零线?老房无零线解决方案盘点

智能家居改造第一步:如何安全地为智能开关接入零线?老房无零线解决方案盘点 智能家居的普及让传统开关逐渐被智能开关取代,但许多用户在改造过程中遇到一个棘手问题:老房子的开关底盒里可能没有零线。这种情况在2000年以前建造的住…...

利用快马平台与hyperdown快速构建markdown实时预览编辑器原型

最近在做一个需要快速验证想法的项目时,发现用InsCode(快马)平台配合hyperdown解析器来搭建markdown实时预览编辑器特别方便。整个过程从构思到实现只用了不到半小时,完全不需要操心环境配置的问题,特别适合需要快速原型验证的场景。 为什么…...

文明越复杂,伪装就越精致,人性就越容易迷失在符号之中

你说得非常透彻,而且带着一种历史穿透力的清醒。“看最原始的东西就行了”——这其实是一种政治经济学的底层思维:剥开制度、话语、技术、法律的外衣,直视权力与资源分配的本质。一、你说的“原始的东西”是什么?其实就是人类组织…...

AI命令行代理评测框架Terminal-Bench设计与实践

1. 项目背景与核心价值命令行终端是开发者日常工作中不可或缺的效率工具。随着AI技术的快速发展,各类AI代理开始尝试理解并执行自然语言指令来自动化终端操作。但如何量化评估这些AI代理在真实命令行环境中的表现,一直缺乏系统化的评测方案。这正是Termi…...

别再纠结选哪个了!51单片机AD转换方案全对比:XPT2046、PCF8591和内部ADC到底怎么选?

51单片机AD转换方案深度评测:XPT2046、PCF8591与内部ADC实战指南 在嵌入式系统开发中,模拟信号采集是连接物理世界与数字系统的关键桥梁。面对市面上琳琅满目的AD转换方案,工程师们常常陷入选择困境:是使用外置专业芯片还是依赖单…...

Reactor:基于节点化工作流的AI人脸修复与替换引擎深度解析

1. 项目概述:一个被低估的AI图像生成工作流引擎如果你最近在折腾Stable Diffusion,大概率听说过ComfyUI。它以节点式的工作流和强大的自定义能力,成为了许多高阶玩家的首选。但今天我想聊的,是另一个同样基于节点、但在设计理念和…...

选型指南:TJA1021、MC33662等主流LIN收发器怎么选?从单通道到四通道全解析

LIN收发器选型实战指南:从单通道到四通道的工程决策 汽车电子工程师在设计LIN总线节点时,往往会在收发器选型环节陷入纠结。面对NXP、Infineon等厂商的数十种型号,如何根据项目需求精准匹配?我们以实际工程案例为线索,…...

别再让显存拖后腿了:手把手教你用VLLM的PageAttention优化大模型推理

突破大模型推理瓶颈:VLLM与PageAttention实战指南 当你在深夜调试一个即将上线的智能客服系统时,突然发现并发请求量稍大就会触发显存不足的警报——这种场景对AI开发者来说再熟悉不过。大语言模型推理过程中的显存管理问题,就像一道无形的天…...

2026年AI大模型接口中转站全网实测:五大头部服务商谁能脱颖而出,引领行业潮流?

【2026年3月31日 科技产业快讯】2026年,全球AI大模型产业正式从技术创新阶段步入规模化商业落地阶段。AI大模型接口中转站作为连接底层模型能力和上层产业应用的关键基础设施,其市场需求呈现出指数级的增长。国家数据局最新公布的数据显示,截…...

初识AI产品经理:我的学习心得与“夸父追日“感悟(收藏版)

本文以作者成为AI产品经理第一个月的真实学习体验切入,用"夸父追日"比喻AI领域知识更新速度远超学习速度的现实。文章核心聚焦AI产品经理与传统PM的思维差异(管确定性 vs 不确定性)、必备基础能力(需求分析、沟通、PRD写…...

零售业RFID技术实施指南:从合规到高效供应链

1. 零售业RFID合规实施全景解读2003年沃尔玛首次在零售行业推行托盘和箱级RFID标签计划时,这项技术还被视为供应链管理的"未来选项"。如今走过二十年发展历程,RFID技术已从最初的合规要求演变为提升供应链效率的核心工具。作为参与过多个跨国零…...

深入DSP F28335 ADC内核:用示波器实测同步采样与顺序采样的时序差异(附代码与波形图)

深入解析DSP F28335 ADC内核:同步与顺序采样的硬件实测与时序优化 在嵌入式系统开发中,ADC(模数转换器)的性能往往直接决定了整个系统的精度上限。德州仪器(TI)的F28335数字信号处理器搭载的12位ADC模块&am…...

别再空谈概念了!用Python+Three.js从零搭建一个简易的智慧城市数字孪生原型

用PythonThree.js从零构建智慧城市数字孪生原型:十字路口交通模拟实战 当技术博客充斥着数字孪生的概念解析时,真正能让开发者兴奋的永远是动手实现的快感。想象一下,你不仅能理解红绿灯调度算法,还能在三维空间中实时观察车流如何…...