17 大模型的记忆只有“一杯水“,长对话怎么不翻车?
面试官翻着简历你做过 AI 客服候选人点头对知识库问答 多轮对话。用户跟 AI 聊了 20 轮之后AI 还记不记得第一轮说了什么……应该记得吧你确定你了解上下文窗口吗如果 Token 超了会发生什么候选人沉默了。他做多轮对话时确实没考虑过这个问题——反正框架自动处理历史消息用户聊到一半 AI 突然失忆他还以为是模型的问题。这不是模型的问题是记忆管理的问题。大模型的记忆是有限的、有成本的、还是一次性的。这篇聊透。大模型的记忆到底有多小很多人以为大模型像人一样记性好。错了。大模型每次回答只能看到你这次请求里塞给它的所有文字。上一次对话它根本记不住——除非你把历史对话重新发给它。所以所谓多轮对话本质是每轮都把之前所有的对话重新拼进 Prompt 里再发给模型。而模型一次能看到的文字总量就是上下文窗口Context Window。GPT-4o 一般是 128K Token但很多国产模型只有 8K、32K。8K Token 是什么概念大概 6000 个汉字或者 20 轮左右的简单对话。一杯水就这么点。更麻烦的是窗口不是只有历史对话在占用系统提示词占一块、历史对话占一块、RAG 检索结果占一块、用户当前问题占一块。四块加起来不能超过窗口上限。超了怎么办两个后果1. API 直接报错maximum context length exceeded2. 框架自动截断——最早的历史被丢掉AI 就失忆了失忆的代价一个很典型的场景举个典型场景AI 保险顾问用户咨询理赔。用户第一轮说我父亲去年买的 XX 重疾险今年确诊了肺癌。AI 答得挺好给了一堆理赔指引。聊了 30 轮用户问那像我父亲这种情况之前说的那个免赔额条款还适用吗AI 答您父亲是哪款产品之前没有提到过请补充说明。用户当场炸了我刚说了一万遍技术排查发现历史对话超过了窗口最早的几轮被截断丢弃模型压根不知道用户父亲买的是什么保险。这不是模型蠢是记忆管理没做好。用户不会理解上下文窗口这种技术概念他只知道这 AI 记性真差。记忆管理方案一滑动窗口最朴素的做法只保留最近 N 轮对话更早的直接丢弃。public ListMessage slidingWindow(ListMessage history, int maxTurns) { if (history.size() maxTurns) { return history; } // 保留系统消息 最近 maxTurns 轮 Message system history.get(0); ListMessage recent history.subList(history.size() - maxTurns, history.size()); ListMessage result new ArrayList(); result.add(system); result.addAll(recent); return result; }优点实现简单几乎零成本速度最快。缺点早期信息全丢。用户第一轮说的关键信息父亲买的保险第 21 轮就被丢了。滑动窗口适合客服问答、单轮为主、对历史依赖不强的场景。记忆管理方案二摘要记忆既然原始对话太占空间那就压缩。每隔几轮让模型把之前的对话总结成一段摘要以后只带摘要 最近几轮。public class SummaryMemory { private final ChatModel chatModel; private String summary ; // 累积摘要 public ListMessage buildMessages(ListMessage recentTurns) { ListMessage messages new ArrayList(); // 先放压缩后的历史摘要 if (!summary.isEmpty()) { messages.add(new SystemMessage(历史对话摘要 summary)); } // 再放最近几轮原始对话 messages.addAll(recentTurns); return messages; } // 每 5 轮触发一次摘要更新 public void maybeSummarize(ListMessage allHistory) { if (allHistory.size() % 10 0) { this.summary chatModel.call( 把以下对话压缩成 200 字以内的摘要保留关键事实\n allHistory ); } } }摘要的本质是丢细节换容量。用户父亲买的是哪款保险、确诊什么病、问过哪些条款——这些关键事实会被摘要保留但对话的细枝末节就没了。优点能记住早期关键信息容量可控。缺点摘要本身有信息损失每 5 轮多一次模型调用有成本和延迟摘要更新时机要设计好。记忆管理方案三向量记忆最重的方案也是大厂 Agent 产品的主流做法。思路把每一轮对话或每个知识点向量化存进向量数据库。用户提问时先从向量库里语义检索出最相关的几条历史拼进 Prompt。Service public class VectorMemory { private final VectorStore vectorStore; // 每轮对话结束后把内容存入向量库 public void remember(String sessionId, String userMsg, String aiMsg) { Document doc new Document( 用户说 userMsg \nAI 答 aiMsg, Map.of(sessionId, sessionId, timestamp, System.currentTimeMillis()) ); vectorStore.add(List.of(doc)); } // 用户提问时检索相关历史 public ListDocument recall(String sessionId, String question, int topK) { return vectorStore.similaritySearch( SearchRequest.builder() .query(question) .topK(topK) .filterExpression(sessionId sessionId ) .build() ); } }优点容量大存多少都行、检索精准只带相关历史、天然支持跨会话长期记忆。缺点架构重要引入向量库、多一次检索延迟几十毫秒、历史片段怎么切分有讲究。实战Token 预算怎么算面试官问你怎么控制 Token光说压缩历史不够得有具体方法。第一步估算。中文场景有个粗略公式1 个汉字 ≈ 1.5~2 个 Token1 个英文字符 ≈ 0.3 个 Token。不够精确但做预算够用。要精确就调 API 的 tokenizer 接口或者用 tiktoken 库// OpenAI 官方 tiktoken 的 Java 移植版 int tokens EncoderFactory.get().encoder() .encode(prompt) .size();第二步分级预算。我习惯按比例分配以 8K 窗口为例public class TokenBudget { private static final int WINDOW 8000; // 各部分预算给当前问题留足空间 private static final int SYSTEM_BUDGET (int) (WINDOW * 0.15); // 1200 private static final int HISTORY_BUDGET (int) (WINDOW * 0.50); // 4000 private static final int RAG_BUDGET (int) (WINDOW * 0.20); // 1600 private static final int QUESTION_BUDGET (int) (WINDOW * 0.15); // 1200 public ListMessage assemble(String question, ListMessage history, ListDocument ragDocs) { // 历史超预算 → 从旧到新截断或触发摘要 ListMessage trimmedHistory fitHistory(history, HISTORY_BUDGET); // RAG 文档超预算 → 只保留最相关的 ListDocument trimmedDocs fitDocs(ragDocs, RAG_BUDGET); return buildMessages(trimmedDocs, trimmedHistory, question); } }第三步超预算的降级策略。按优先级丢弃先丢最老的对话 → 再触发摘要压缩 → 再丢低相关度 RAG 文档 → 如果还不够明确告诉用户对话太长请开启新会话。宁可降级不要硬塞导致 API 报错。这里有个反直觉的点RAG 文档的优先级要高于早期对话。因为早期对话的信息大概率已经进了摘要而 RAG 文档是当前问题的答案依据丢了就直接答错。三种方案怎么选面试这样答方案成本记忆能力适用场景滑动窗口零只记最近 N 轮客服、单轮问答摘要记忆低记关键事实丢细节多轮业务对话向量记忆高精准召回容量大Agent、长期记忆生产环境的正确姿势是组合拳滑动窗口保底防止超窗报错 摘要记忆兜底保留关键事实 向量记忆增强需要时精准召回。另外两个必答的细节第一Token 预算要主动控制。不要等窗口满了再截断。每次组装请求前估算一下总 Token系统提示 历史 检索 问题给当前问题留足空间。常见做法历史压缩到窗口的 50% 以内检索结果 20%系统提示 15%问题 15%。第二128K 窗口不是让你全塞进去的。这是面试官最爱挖的坑。窗口越大越贵按 Token 计费、越慢处理时间长、越容易分心注意力被无关内容稀释。上下文管理的目标不是塞满是只带该带的。 面试官视角的标准回答如果面试官问长对话中 AI 失忆了怎么办先解释根因大模型本身没有记忆所谓多轮对话是把历史重新拼进 Prompt 再发送。上下文窗口有限历史太长就会超窗框架自动截断最早的部分导致 AI失忆。我的解决方案是三层记忆第一层滑动窗口保底。保留最近 N 轮防止超窗报错。这是兜底方案保证系统不崩。第二层摘要记忆。每隔几轮让模型把历史压缩成摘要保留关键事实。这样即使早期对话被丢弃用户说过的关键信息比如买了什么保险、什么病情还在摘要里。第三层向量记忆。把历史对话向量化存库提问时语义检索最相关的片段。适合 Agent 和需要长期记忆的场景。另外我会主动做 Token 预算管理每次请求前估算各部分的 Token 占比给当前问题留足空间。还要强调一点上下文窗口不是越大越好越大越贵越慢记忆管理的核心是只带该带的。下一篇聊 AIGC 面试必考的另一座大山——幻觉。AI 一本正经地胡说八道根因到底是什么RAG、提示约束、解码参数、事后校验四层防线怎么搭

相关新闻

如何在 Java 中使用 Selenium 绕过 CAPTCHA

如何在 Java 中使用 Selenium 绕过 CAPTCHA

我发现了一些技巧,可以在自动化操作时减少处理 CAPTCHA 的麻烦。无论是使用 Selenium 还是其他工具,这些策略都能提高你越过这道障碍的机会。目标并不是破解系统,而是在涉及 CAPTCHA 时,让自动化变得不那么复杂、耗时。让我们深入…

2026/10/5 2:27:37 阅读更多 →
代码折叠怎么做:让 Agent 先看接口,再看实现

代码折叠怎么做:让 Agent 先看接口,再看实现

一、全文给出去之后 你需要改一个很小的行为:shop 项目的订单取消,只有在订单存在时才允许取消——订单不存在时,现在的代码抛了一个难以理解的异常。你要把这个行为改成明确的 404。 为了"让它看清楚",你把 src/orders…

2026/10/5 2:27:37 阅读更多 →
小延迟缺陷(SDD)检测与多重检测(N-detect)技术

小延迟缺陷(SDD)检测与多重检测(N-detect)技术

小延迟缺陷(SDD)检测与多重检测(N-detect)技术 面向IC测试/DFT工程师的SDD与N-detect深度实战指南:从故障模型、timing-aware ATPG原理,到TetraMAX/Tessent/Modus工具链、PrimeTime SDF协同、Verilog缺陷注入验证,再到签核最佳实践。 一、小延迟缺陷SDD概述 1.1 先进工艺下…

2026/10/5 2:27:37 阅读更多 →

最新新闻

多普勒效应公式推导:从波前间距到雷达测速与天文红移

多普勒效应公式推导:从波前间距到雷达测速与天文红移

在站台等车的时候,你多半留意过这样一个细节:列车从远处鸣笛驶来,音调明显比它静止时更尖锐;等车从身边呼啸而过之后,音调又一下子低沉下去。这个高低变化,就是多普勒效应最直观的体现。教材里的标准定义很…

2026/10/5 3:03:50 阅读更多 →
C#调用百度OCR全流程:从Token获取到批量识别避坑指南

C#调用百度OCR全流程:从Token获取到批量识别避坑指南

简介:这是一个基于C#实现的百度OCR图像文字识别示例项目,面向有一定C#基础、希望快速接入百度AI开放平台OCR能力的开发者。项目完整展示如何申请API密钥、构造HTTP请求上传图像(支持URL与Base64编码)、设置语言等可选参数&#xf…

2026/10/5 3:03:50 阅读更多 →
神经气体网络与GNG网络:从K-means缺陷到自组织拓扑骨架实战

神经气体网络与GNG网络:从K-means缺陷到自组织拓扑骨架实战

从K-means的缺陷说起,聊聊神经气体网络和GNG网络到底在解决什么问题。如果你只是想把一堆散点分成几个簇,那K-means和层次聚类已经够用;但当你面对的是——数据形状不规则、类别数量未知、还要求保留拓扑结构时,聚类那套就撑不住了…

2026/10/5 3:03:50 阅读更多 →
从零搭建后端:数据库建模与REST API实操全记录

从零搭建后端:数据库建模与REST API实操全记录

这是「30天全栈开发挑战」系列的第三天。前两天的内容分别完成了环境准备和一个极简前端页面,很多朋友私信问我“第三天到底干什么”,今天的答案很明确:把数据库表建明白,把接口写能跑起来。文章会围绕一个演示项目——团队任务管…

2026/10/5 3:03:50 阅读更多 →
工业数据中心一体化选型:连接、监控、供配电如何保障长期稳定运行

工业数据中心一体化选型:连接、监控、供配电如何保障长期稳定运行

1. 为什么“稳定不间断”会卡住绝大多数数据中心方案工业数据中心和普通企业机房有一个本质区别:普通机房追求的是“够用”,工业数据中心追求的是“不间断”。这两个词听着差不多,实际操作中完全是两套设计哲学。普通机房每年计划性停机维护几…

2026/10/5 3:03:50 阅读更多 →
微软驱动签名新规:Windows 11开发者与用户应对指南

微软驱动签名新规:Windows 11开发者与用户应对指南

最近这半年,微软针对驱动签名出了好几条新规,做驱动开发的和装驱动机器上遇到问题的普通用户,两边都被折腾得不轻。开发圈子最先感受到变化——以前“用 EV 证书签完名就能装”的老套路开始失灵,系统在加载驱动时不再只看签名有没…

2026/10/5 3:02:49 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →