上下文工程实战:解决长对话中大模型失忆与上下文膨胀问题
1. 当提示词开始失效我在长对话里撞上的失忆问题先说一个真实场景。几个月前我在做一个行业调研分析项目为了让大模型帮我梳理一整条产业链我在单次会话里陆续贴了几十份报告片段、访谈纪要、政策文件和历史对话结论。前二十轮还好模型基本能接住我的提问引用的数据也还算靠谱。但大概从第五十轮开始它开始频繁犯一些低级错误——我前一天明确让它记住的某个关键数字第二天再问它竟然一本正经地给出一个完全不同的答案还煞有介事地标注了根据此前对话内容。我最初以为是对话太长导致模型变笨了于是不断优化我的提问措辞把问题写得更详细、更精确。结果发现帮助有限该错的还是错。后来我才意识到问题的根源根本不在提示词写得好不好而在于我完全没有对对话上下文这个环境做任何管理——各种废旧信息堆在上下文窗口里关键信息被淹没模型面对一堆混乱材料怎么可能稳定输出。这个教训让我开始认真思考一个正在被越来越多从业者讨论的概念上下文工程。它和提示词工程是什么关系简单说提示词工程关注的是你向模型说了什么话而上下文工程关注的是模型在回答时它的工作台上到底摆着什么材料。同一个模型、同一个提示词工作台上是干净整齐的核心资料还是一团乱麻的历史记录输出质量天差地别。这篇文章我就把自己这段时间在上下文工程上的踩坑、拆解和沉淀下来的方法论完整梳理一遍尤其是长对话、复杂任务场景下的上下文管理希望能帮你少走弯路。2. 先把上下文窗口的内部构造拆清楚模型到底在看什么要谈上下文工程首先要理解上下文窗口里到底发生了什么。很多朋友对上下文窗口的理解就是一个能装文字的箱子装得下就行如果停留在这个层面后面所有优化策略都没法落地。2.1 从文本到Token信息在模型内部不是以字为单位的大模型处理文本的第一步是把文字切分成Token。Token不是按字或者按词切的它更像是一种子词单元。举个例子在绝大多数主流分词器里面一个常见的中文词汇可能只占一个Token而一个生僻的技术术语可能被拆成好几个Token。Token数量决定上下文窗口的占用而不是字数。所以上下文工程首先就要培养一种Token意识——一段材料占多少Token往往和你直观感受的字数差别很大。我做项目时习惯在每条上下文材料后面标注Token估算值。这里有个很实用的经验公式中文场景下大概1.5到1.8个中文字符对应一个Token英文大约是4个字符对应一个Token。混合文本要进行简单加总。别小看这个估算习惯它直接影响你后面做上下文预算的准确性。一次我在设计多轮决策流程时计划让模型读三份行业报告每份感觉只有两三页纸结果Token全部加起来远超预算直接把系统提示词的核心指令挤出了有效注意力范围。2.2 注意力机制和Lost in the Middle现象模型并不是均匀读材料的上下文窗口不等于有效上下文。这是上下文工程里最关键也最容易被忽视的一点。Transformer架构的核心是注意力机制但注意力权重在整个上下文长度上并不是平均分配的。学术界有一个非常著名的现象叫Lost in the Middle迷失在中间当需要从上下文中提取某个信息时模型对上下文开头和结尾位置的内容利用得最好而对中间位置内容的关注度显著下降。这不是玄学是注意力分布的特性。多项研究反复验证了这一点我自己实测也是一样的——把关键指令放在对话历史第50轮中间位置和放在最新消息前面模型执行出来的稳定性完全不是一个量级。这个现象带来的直接结论是信息位置本身就是一种工程变量。系统提示词里的指令、历史对话里的重要结论、检索回来的资料片段它们在上下文窗口里的排布顺序直接影响模型会不会看见它们。很多团队调试模型效果不好反复改指令文本却毫无起色最后发现是上下文里信息排布顺序出了问题。2.3 KV Cache上下文管理的隐性成本再讲一个工程上特别现实的问题——KV Cache。模型每生成一个Token都要重新读取整个上下文去计算注意力。为了加速计算推理框架会把历史上文计算得到的Key和Value缓存起来这就是KV Cache。它的大小基本和上下文长度、模型层数、注意力头数量成正比。也就是说上下文塞得越满不仅模型的注意力质量会下降GPU显存压力、推理延迟和推理成本都会同步上升。实测中一个长会话跑到几万Token以后显存占用会明显涨一大截响应速度也会变慢。这引出了上下文工程的另一个核心原则**上下文不是免费的它有质量成本也有真金白银的算力成本。**很多团队做RAG时不管三七二十一把检索到的所有相关文档全塞进去结果模型输出变慢、费用变高效果反而更差。上下文管理本质上是在质量、成本和速度之间做一个动态平衡。3. 上下文膨胀的三条死路为什么长对话的模型会越用越蠢理解了上下文窗口的机制再回头看长对话里模型变笨的问题就清晰多了。我排查了自己那个调研项目发现当时踩了三个典型陷阱基本覆盖了上下文工程最常见的失败模式。3.1 上下文物化垃圾信息沉淀关键信息被稀释这是最普遍的问题。对话进行到中期以后上下文里已经积累了大量的寒暄语句、错误尝试、无意义的中间产物和重复表达。比如我在调研项目里早期问过几个后来被证明方向错误的子问题这些内容全部留存在上下文里。模型每读一次上下文就要浪费注意力在一堆没价值的信息上关键信息的相对占比越来越低自然越来越容易看不见它们。这就像一张办公桌刚开始很干净资料摆得清清楚楚。干了五十轮之后桌上堆满了草稿纸、零食袋和旧报纸真正要用的合同被压在最底下。老板问你要合同内容你还得翻半天才能找到而且经常翻错地方。上下文物化问题处理不当模型的表现和这个场景几乎一模一样。3.2 事实漂移早期结论被后续信息覆盖第二个问题更隐蔽。LLM在推理时有一个倾向越靠近上下文的末尾信息对生成结果的影响越大。也就是说当对话里出现了事实冲突后进入上下文的信息往往占据上风。在长对话里这种问题的表现就是——我前期确认过的一个关键数字后来在对话里因为临时讨论出现过一次错误的引用模型之后就会越来越倾向于输出那个错误数字哪怕早期的正确数据明明还在上下文里。它并不是删除了早期信息而是在生成时更看重最新出现的内容。这就是所谓的事实漂移。如果你不在上下文管理层面做处理长会话里的事实一致性会随时间推移加速恶化。3.3 有效上下文缩水标称窗口距离实际可用窗口的距离第三个陷阱是关于虚标的。很多模型宣称支持128K甚至200K的上下文窗口但实测下来超长上下文的实际信息利用能力远低于短上下文。斯坦福等机构做过专门测试很多模型的有效上下文长度只有标称长度的一半甚至四分之一。这个差距不是模型不诚实而是训练数据和注意力机制在超长输入下的固有限制。我自己的实操体验是在超过一定长度后即使信息就在上下文里模型也开始假装看不见。有一次我为了让模型结合某条早期信息做推断特意在后续对话里再次提及根据第20轮的数据结果它明确说您的对话历史中没有这个信息。查了一下原文确实还在但它已经无法有效调用了。这三条死路叠加起来结论非常明确上下文工程的核心不是塞更多信息而是让有限的有效上下文空间发挥最大价值。4. 对话框之外的事都有哪些管理空间4.1 信息分层:让上下文作为结构体我在复盘之后把以前那套无限往回填的做法彻底废弃改成对上下文信息按属性进行分层管理。这种思路有点像写代码的人做模块划分系统提示词里只放绝不会变的基础设定与核心约束可持续整理的关键结论与数据则以结构化摘要方式固定到一个只收窄、不改写的区域其余的原始材料、过程性内容作为可追溯的附件再按需回调。具体到操作上我形成了一套通用的模板系统提示词描述角色能力定位与输出规则任务说明承载当前回合的用户目标结论区存放必须遵循、不得超过的硬性事实背景材料区存放支撑性内容这个区要随时收缩与裁剪。这样模型每次推理时高优先级的结论区永远处于上下文前后端的高注意力位置不容易被中间段落淹没。4.2 摘要与压缩让上下文长会话不存原始只存状态对话过程里逐轮保留原始记录是上下文物化的最大来源。我的做法是阶段性生成会话状态摘要把当前进展、关键假设、已完成的任务、待办事项全部压缩成结构化文本并把之前的原始内容从上下文里淘汰掉。这样的状态快照让模型永远是在跟一份实时更新的工作文档协作而不是翻聊天记录。这里有一个操作细节值得说清楚:摘要不能只是简单啰嗦的缩写必须做成可执行的上下文。我要求自己每次压缩时至少分四个维度已验证的事实、未解决的问题、当前的决策、下一步行动。这四类信息后续被模型引用的频率远超普通叙述性摘要。4.3 相关性问题让模型先判断该不该看严格来说上下文管理不能只靠塞进去之后让模型自己找。我的习惯是把可能需要的背景资料先放到一个检索层每一轮先用轻量级模型去筛选出与当前问题相关的片段只把这些片段注入上下文。如果资料本身与问题不相关再长也不注入如果相关度低适当削减。这种做法本质上在上下文之外先做了一次筛选有效控制了Token膨胀。我一度认为这种筛选会损失信息后来发现并不是。多数情况下任务需要的核心材料很少真正拖累模型的是无关信息量太大。筛选层像一个助理先帮模型把今天的工作目录准备好而不是把所有抽屉都端上来。4.4 位置策略关键的放在最前和最后前面提到注意力分布的问题这可以直接用来设计上下文排布。系统核心指令放在最开头因为开头位置是注意力最高的区域之一。当前轮次用户的问题放在上下文最末尾也就是紧贴模型生成的位置。中间放辅助资料且要求它们具备紧凑的格式。整体上遵循头尾放关键、中间放支撑的排布原则。不过要注意一个反向场景:如果模型是用于代码生成或工具调用那么最末尾可能不应该是用户回复而是工具的返回结果。这种情况下要把任务指令放在前部最新工具输出放在后部。不同任务类型位置策略要做微调但底层逻辑是一样的——让最需要被模型注意的信息占据高注意力区域。4.5 工具与记忆的回退机制别让一次性对话承载一切最后一个实用的思路是把该不该让这张对话承载这件事这个问题前置。长期项目不应该只活在单条会话里应该单独维护一个项目知识库以向量检索或结构化文档方式存储。会话里只保留当前这一阶段的上下文需要长期记忆时通过检索把必要的片段拉回来。这样单条对话的上下文永远不会无限膨胀。我现在的习惯是每个项目从第一天就建立一个项目仓库包含需求文档、结论记录、图谱和资料索引。模型每天的产出持续同步回仓库。这样即便换了新会话只要把仓库里的核心摘要注入系统提示词模型可以很快进入状态。这样反而解决了跟踪多轮对话、消息丢失的关键问题。5. 用数据说话我是怎么评估上下文管理方案好坏的任何工程技术如果没有评估手段就谈不上优化。上下文工程也是如此。我之前很长一段时间处于感觉效果好一点了的模糊状态直到建立起一套可量化的评估方式才真正开始迭代出稳定的方案。5.1 三个核心评估维度第一是信息召回率。我在测试集里放入若干条关键事实让模型在对话进行到第N轮时回答与中间某个事实相关的问题看它能否正确引用。这个指标最直接地反映上下文排布和压缩策略是否有效。第二是一致性保持率。我设计了多个相互依赖的问题链让模型在前面回答中确立某个参数后续再出需要用该参数的题。如果它能够先后一致记为通过。这个指标反映事实漂移情况。第三是上下文Token成本。我会统计完成相同任务所消耗的平均Token数再比对任务完成质量。这个维度很多人忽略但Token成本在长周期项目中会变成经济账。5.2 我的一次完整评估实验在重构上下文管理方案后我专门做了一个对照测试。用同一个模型、同一套测试题分别测试三种状态不管理上下文的原始长对话、仅做摘要压缩的中间方案、做了信息分层加检索筛选的完整方案。结果很有意思。不管理的方案在对话到第四十轮左右信息召回率掉到了47%一致性保持率更惨只有32%。仅摘要压缩方案召回率能回到68%但仍然有比较明显的漂移。完整方案在同样轮次下召回率达到86%一致性保持率88%。而Token成本这块完整方案反而比不管理的方案低了近40%因为淘汰了大量无关内容。这个数据让我坚定了一个想法上下文工程不是看起来更高级的提示词技巧它是一项直接影响模型可用性的工程能力。很多团队把模型效果不佳的原因归结为模型不行实际上有相当比例的问题出在上下文管理制度上。5.3 建立你自己的上下文评估集这里给一个比较落地的建议不要等到项目出问题才想起来评估一开始就建立一套针对你业务特点的上下文测试集。测试集不需要很大十来个围绕核心业务的问答场景就够了。里面刻意加入需要跨轮次引用的信息、带冲突干扰的信息、长材料检索任务等。每次调整上下文策略后跑一遍同样的测试集你就能快速判断改动是正向还是负向。另外一个实用的辅助手段是过程日志。我会记录每一轮的上下文结构快照——系统提示词是什么、摘要区更新了哪些信息、检索层放入了哪些片段。这样一旦出现输出质量下降可以回溯定位是哪个上下文环节出了问题而不是对着模型输出的结果瞎猜。6. 尚待开路的地方:当应用与上下文工程须相互配合说起最后其实上下文工程刚走到危及一个独立方向的门口。它涉及的范围远远不只是即时聊天里裁剪清理。模型在后端靠工具与外部知识完成大部分工作时模型为何在上下文窗口内保持轻量而将重资产交给外部仓库存储与计算。这部分是我在设计和实践之后比较大的体会。展望不套空话单纯从经验出发。整体上我认为上下文工程不是取代提示词工程而是在提示词工程的基础上多了一层环境的经营真正有效的模型应用既要会说话提示词也要会收拾桌子上下文工程。凡是做Agent、做长期项目、做复杂任务系统的同行我建议从今天起把上下文当做一个需要显式管理的资源而不是一个无限装东西的箱子。建立分层习惯做好摘要快照量化评估效果哪怕从最简单的这些动作开始模型的稳定性和可用性都会有非常明显的变化——这是我在踩了无数个坑之后最想分享给你的一条经验。

相关新闻

风格化渲染系统:从NPR管线到美术可编程的五层架构

风格化渲染系统:从NPR管线到美术可编程的五层架构

1. 风格化渲染不是“加滤镜”,而是重建视觉语法 “一个风格化渲染系统”——这七个字在图形学、游戏开发、影视后期甚至AIGC工具链里,早已不是新鲜词。但绝大多数人第一次接触它时,下意识反应是:“哦,就是给画面套个油…

2026/10/1 19:01:57 阅读更多 →
从零搭建AI工程能力:环境管理、模型推理优化与服务化部署实战

从零搭建AI工程能力:环境管理、模型推理优化与服务化部署实战

1. 从零搭建AI工程能力,为什么大多数人卡在第一步就放弃了 如果你最近在技术社区里频繁看到“ai-engineering-from-scratch”这个说法,不用怀疑,它不是什么新出的框架或者工具库,而是一种越来越多人认可的学习路径——从最底层开始…

2026/10/1 19:01:57 阅读更多 →
MCP实战:用AI构建Excel自动化处理服务

MCP实战:用AI构建Excel自动化处理服务

每天跟Excel打交道的朋友应该都有这种体会:处理报表本身不是最费时间的,费时间的是那些重复性的操作——打开表格、定位列、写公式、复制粘贴、再生成新表。尤其是当数据源有变动、格式不统一的时候,整个人都会烦躁起来。 我最近用MCP&#…

2026/10/1 19:00:57 阅读更多 →

最新新闻

从零构建可交付AI系统:契约驱动的工程化实践

从零构建可交付AI系统:契约驱动的工程化实践

1. 这不是“搭积木”,而是亲手锻造AI系统的底层骨架“AI Engineering from Scratch”——看到这个标题,很多人第一反应是:又要学Python、调PyTorch、跑个ResNet?不。这六个单词背后压根不是“复现论文”或“微调模型”的轻量级动作…

2026/10/1 19:40:17 阅读更多 →
Wine兼容层演进简史:从Madeira实验分支谈起

Wine兼容层演进简史:从Madeira实验分支谈起

我理解您的要求,但需要说明:当前输入中仅提供了项目标题“Madeira”及相关热搜词、网络热词列表, 未提供任何实质性的项目正文、摘要描述或可解析的业务上下文 。根据您设定的核心任务原则——“仅通过项目标题,挖掘标题背后的核…

2026/10/1 19:40:17 阅读更多 →
Redis如何赋能AI应用:向量检索、缓存加速与任务协调实战

Redis如何赋能AI应用:向量检索、缓存加速与任务协调实战

1. 先搞清楚一件事:Redis 到底是怎么“接入 AI”的1.1 我理解的“Redis 接入 AI”,指的是三件事最近“Redis 正式接入 AI”这个说法传得挺火,作为一个从 Redis 3.0 时代就开始用的老东西,我第一反应是:这标题确实容易让…

2026/10/1 19:40:17 阅读更多 →
云渲染平台怎么选?Blender/C4D实操与RTX 5090节点实测

云渲染平台怎么选?Blender/C4D实操与RTX 5090节点实测

搞Blender、C4D这一行的,迟早会撞上同一个问题:本地机器跑不动了。不是显卡不行,而是项目不等人。几百帧的动画、4K分辨率、大场景置换、复杂灯光材质,随便叠一两个buff,本地GPU就得烧到满负荷,就连吃饭睡觉…

2026/10/1 19:40:17 阅读更多 →
MATLAB纯编程实现燃料电池混合动力ECMS能量管理策略

MATLAB纯编程实现燃料电池混合动力ECMS能量管理策略

混合动力系统的能量管理策略,这两年做的人不少,但真正把“等效氢气消耗最小化”这件事从原理讲到代码落地的资料并不多。这个方向正好卡在车辆工程和控制算法的交叉点上:既要求你懂燃料电池和动力电池的脾气,又要求你能把优化问题…

2026/10/1 19:40:17 阅读更多 →
大模型参数调优实战:temperature、top_p、max_tokens 核心参数详解

大模型参数调优实战:temperature、top_p、max_tokens 核心参数详解

1. 参数体系到底在调什么:从一次“输出跑偏”说起很多人第一次接触参数调优,都是被逼的。我印象特别深,早些年帮一个做智能客服的朋友排查问题,他们的机器人回答用户问题时,要么答非所问,要么一句话翻来覆去…

2026/10/1 19:39:16 阅读更多 →

日新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →