ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

上下文工程:ChatMemory、滑动窗口与MCP在编码代理中的实践

上下文工程:ChatMemory、滑动窗口与MCP在编码代理中的实践 1. 为什么 AI 编码代理最先撞上上下文墙1.1 上下文不是“越大越好”而是“装得对”我最早天真地以为只要把上下文窗口拉满模型就不会“失忆”。实际用下来这个想法很快被现实教训了窗口再大也有尽头而且塞进窗口的内容一旦超过模型的有效注意力区域后面的几百个 token 往往被模型“视而不见”表现和没放进去一样。更麻烦的是不同编码代理比如 Cursor、Claude Code、Cline 这一类对上下文的组织方式差别很大有的会把整个文件全文塞进去有的则只放了文件摘要和关键函数。你看着界面上的 token 计数没爆但模型实质上已经处于“高烧”状态答非所问、反复横跳、改 A 文件时把 B 文件的逻辑也顺带改了这些都是上下文管理失当的典型症状。我认为在处理代码这个场景里上下文工程的核心不是“尽量多存”而是“按需装配”。代理在解决一个具体任务时真正需要的上下文往往非常集中当前编辑文件、相关依赖文件、项目里的接口定义、最近的报错信息、用户的原始意图。这些内容的体积通常不会超过几千 token但绝大多数代理默认会把这些有用的信息淹没在大量无关的聊天历史里。比如一个跨度三小时的会话前两个小时你都在讨论需求第三个小时开始改代码这时候如果把前两个小时的闲聊原封不动推进去真正该聚焦的代码片段反而只占很小比例模型输出的准确率会直线下降。我在实际项目里用的判断标准是“上下文有效性”模型在给定上下文中能否在第一次调用时就完成目标任务而不需要你反复补充信息或纠正错误。如果每一步都需要人工介入那大概率是上下文里有效信息占比太低。这也是为什么我后来花大力气研究 ChatMemory 和滑动窗口因为它们的本质就是把“有效信息占比”作为优先优化目标而不是单纯压缩 token 数。1.2 提示工程解决“怎么说”上下文工程解决“给什么”很多人容易把提示工程和上下文工程混为一谈我最初也分不太清楚。后来我用一个很直白的类比给自己理清了思路提示工程是决定你如何对模型下达指令比如“请你用 Python 实现一个带滑动窗口的最大值函数并说明复杂度”而上下文工程是决定在和模型对话时给它看哪些资料、看多长、按什么顺序看比如“当前仓库里有 200 个文件我只给你看其中 5 个相关文件并在对话历史里只保留最近 3 轮内容”。以前大家追捧的“角色设定”“思维链”“few-shot 示例”本质上都是提示工程的范畴它们优化的是模型对输入的理解方式。但编码代理的场景里一个更致命的问题是如果没有上下文工程做支撑再好的提示词也会失效。你可以在提示词里写“请严格参考 src/utils/queue.ts 中的 Queue 类实现”但如果你的上下文体系根本没有把 queue.ts 的内容输送给模型模型只能靠“猜”来完成任务。这种“提示词与上下文不匹配”的情况在真实编码代理项目中非常常见——用户给了详细的指令代理也“看到”了指令但代理并没有真正看到指令中提到的文件于是每次都在瞎编。另一个容易被忽略的点是上下文工程还决定了“顺序”。模型对上下文前后部分的敏感程度不同中间部分的信息往往容易被丢失。如果代理把最重要的任务指令放在对话轮次的最中间前后全是无关内容那么模型大概率会忽略关键信息。所以我做上下文工程时不仅关注“放什么”还关注“放在哪”最新的用户指令、当前目标、明确的任务清单这些内容一定要放到上下文最前面的位置或紧跟 system prompt 之后历史辅助信息放后面工具返回的大段日志尽量折叠或只放摘要。这一条看起来简单实际执行起来对输出质量的提升非常明显。2. ChatMemory让编码代理真正“记得住”的会话记忆系统2.1 ChatMemory 的核心架构与信息分级我最早接触 ChatMemory 是从一个研究项目的实验代码里看到的当时一个编码代理被要求“先读取项目说明文档再修改配置文件”但它连项目说明文档都没记住改了配置之后就忘了文档里的约定。ChatMemory 这个名字听起来像是在说“聊天记录存储”但它的核心设计思想其实比这深入得多它不是一个简单的消息列表而是一套带有分级结构的信息管理系统。ChatMemory 的典型架构会将会话信息划分为几级第一级是“工作记忆”保存当前任务相关的关键信息比如用户当前的目标、正在修改的文件路径、最近一次报错的堆栈摘要第二级是“项目记忆”保存整个项目层面的稳定信息比如项目结构、依赖关系、编码规范、接口定义第三级是“长期记忆”保存跨会话的规律性信息比如用户的编码偏好、历史踩坑记录、常用设计模式。每一级信息的生命周期、容量上限、检索方式都不同。我见到的一个实现里ChatMemory 的信息分级是通过一套“重要性打分”机制动态完成的。每当系统收到一条新消息或工具返回结果它会先判断这条信息是否与当前任务目标相关并给相关度打分再判断信息是否能被压缩比如代码中的大量重复结构可以折叠为摘要最后判断信息的有效期比如临时变量名很快过期但项目架构约定长期有效。这套打分机制的结果决定了信息是进入工作记忆还是长期记忆也决定了它在后续对话中如何被检索和注入。对于编码代理而言ChatMemory 最可贵的地方是它保存“决策链路”。我遇到过很多次模型改了半天代码最后发现它改了 A 函数却忘了之前明确说过“A 函数由服务端负责客户端只调接口”。这种问题在长会话中反复出现就是因为代理没有把“已经达成的决策”作为一个独立信息单元保存下来。ChatMemory 的思路是把这类决策单独抽取出来形成“决策清单”每次新会话开始时优先注入这样代理在后续任务里就不会做前后矛盾的事。其实这个思想我们在多人协作时也会有两个人如果不对齐“刚才说过什么定了什么”后面一定会产生混乱。ChatMemory 做的就是让模型也具备这种对齐能力。2.2 记忆写入与检索的平衡写入太积极会污染太保守会遗忘设计 ChatMemory 最难的不是“怎么存”而是“存哪些什么时候存”。写入太积极有个非常实际的坑模型每收到一条消息都尝试摘要、提取、存储结果就是记忆库被各种鸡毛蒜皮的信息塞满检索时反而难以找到真正重要的内容。我见过有的实现把存储频率设为每一轮对话都触发跑了 50 轮之后记忆库里全是“用户说了一句谢谢”“工具返回了某个中间变量的值”这类噪音真正有用的决策反而淹没在里面。更合理的策略是“基于任务里程碑触发写入”。也就是说只有当系统检测到某个任务阶段完成、某个决策被明确确认、或者出现了需要跨轮保留的关键事实时才执行记忆写入操作。比如用户说“以后所有数据库操作都走 repository 层不要直接写 SQL”这句话就是一个里程碑信息必须存而用户说“好的”“继续”这种状态反馈完全可以不留。检索侧也有讲究。我常用的模式是“分层召回”在生成回复或执行工具调用之前先从工作记忆里直接取当前任务信息这部分不经过复杂的语义检索速度最快然后再从项目记忆里做关键词或向量检索把相关的接口定义、项目结构信息补充进上下文最后只有当系统判断当前任务需要跨会话知识时才去长期记忆里做深度检索。这种分层召回的模式好处是既保证了响应速度又不会把长期记忆里的无关内容一股脑倒进上下文。我给这套系统加过一个自检规则每次检索完成之后系统都会统计一下放进上下文的信息条数如果超过预设阈值比如 15 条就会触发“收敛提醒”强制把信息分类合并后再注入。这个规则上线后模型在长会话中的“飘忽感”明显下降了因为它每次看到的上下文都是经过收敛的而不是一团乱麻。其实这就是一个很朴素的工程直觉上下文越干净模型的表现越稳定。3. 滑动窗口编码代理的上下文“保鲜机制”3.1 滑动窗口原理与关键参数窗口大小、压缩策略、丢弃规则滑动窗口这个概念做网络的同学听到会想到 TCP 的滑动窗口重传协议做信号处理的同学会想到滑动窗口滤波。但在上下文工程里滑动窗口的核心语义是只保留最近一段时间或最近 N 条内容让模型始终在一个“新鲜度优先”的上下文范围里工作。对于编码代理而言这个机制解决的核心痛点是“长会话中的信息过时”会话早期讨论的技术方案可能早就被否定了如果一直被保留在上下文里模型就越改越糊涂。我实际用的滑动窗口参数不只看 token 数量而是看“消息条数 token 数的双重约束”。比如我会设置窗口大小为“最多保留最近 20 条完整消息且总 token 不超过 8000”。为什么用双约束因为如果只看消息条数可能存在某条消息异常庞大比如一次工具返回了 5000 行日志窗口一挤就把其他消息全挤掉了如果只看 token 数可能窗口里塞了 100 条超短消息上下文里全是碎片。双约束可以兼顾“连续性和新鲜度”。滑动窗口的“滑动”动作往往伴随着三个子操作压缩、丢弃、提取。压缩是指把窗口内靠前的老消息改写为摘要比如原来是一条包含大量报错堆栈的消息压缩后变成“修复了数据库连接池超时问题”丢弃是直接删除与当前任务无关的消息比如用户聊了一轮与当前任务无关的技术选型提取是把老消息中仍然重要的信息比如决策、路径、规范抽取出来放入 ChatMemory 的长效层避免在窗口滑动时彻底丢失。我常用的做法是每滑动一次窗口就触发一次“关键信息提取”把提取出的内容作为“持久化线头”带着走。关于窗口大小怎么定我给一个实际参考值在 128K 上下文窗口的模型上跑编码代理我把滑动窗口限制在 24K token 左右相当于只用了约 1/5。你可能觉得“那不是浪费吗”其实恰恰相反这 24K 才是模型能够稳定聚焦并高效处理的信息量。剩下的空间留给工具返回结果、动态文件内容和临时信息。这个策略在多个模型上实测下来都比较稳比直接暴力塞 128K 的效果更好、更可控。3.2 滑动窗口的“断层”风险重要信息被滑出后的补救机制滑动窗口有一个天然风险就是“断层”。窗口滑得太快老信息大量丢失模型就会“失忆”窗口滑得太慢旧信息堆积上下文又回到混乱的老路。我踩过的最深的一个坑是这样的有一次我让代理重构一个支付模块任务周期比较长会话进行了 40 多轮滑动窗口只保留最近 15 轮。结果在第 38 轮时窗口滑掉了最开始那段关于“支付回调必须保持幂等”的硬性要求代理就开始在回调逻辑里随意加数据库操作导致重复订单风险。这个 bug 不是代码逻辑写错而是上下文断层造成的“规则遗忘”。为了解决这种断层我后来设计了一个“关键约束锁存”机制每次系统识别到一条“硬性约束”比如安全要求、性能指标、不可变业务规则就把它单独存入 ChatMemory 的项目记忆层并在滑动窗口压缩时作为“常驻内容”始终保留。这样即便窗口滑动了硬性约束也不会被打出上下文。另一个补救手段是“回滚检索”。我观察到滑动窗口导致遗忘后不要急着重新生成而是去 ChatMemory 里查询“当前任务最近被修改过哪些关键决策”把相关决策重新注入上下文再让代理继续工作。这条操作听起来很笨但在实际项目中非常有效。我还见过有人把滑动窗口的断层当成“特性”用故意把窗口缩小逼迫代理每个阶段只关注当前子任务然后在阶段切换时再重新装配完整上下文。这种“分阶段上下文重置”的思路在复杂重构项目中反而比全程维持大窗口要好因为模型的注意力不会被跨阶段的旧信息干扰。我在实际操作中还会写一个很简单的“窗口健康检查”每 10 轮对话统计一下窗口内各类信息的占比比如“代码内容占比”“用户指令占比”“工具结果占比”“摘要占比”。如果发现摘要占比超过 50%说明窗口里大量内容是被压缩过的模型正在失去细节如果发现用户指令占比特别低说明代理可能已经偏离主线。这个健康检查不需要很复杂的统计一个计数器就能完成但它能帮我提前发现上下文结构失衡避免模型崩掉之后才来排查。4. Context-mode MCP把上下文管理变成一套可调用的协议4.1 MCP 在编码代理中的角色标准协议如何打通“模型—上下文—工具”MCPModel Context Protocol这两年已经逐步成为编码代理连接外部数据的标准协议。它本质上是一个“工具调用总线”定义了模型如何向外部系统发起请求、外部系统如何返回结构化结果。但在上下文工程的视角下MCP 的更大价值在于它提供了一套统一的“上下文获取”机制让代理不再依赖模型“记得什么”而是随时按需从外部拉取信息。我在项目里把 MCP 服务器按用途分了两类一类是“资源型 MCP”负责提供文件内容、目录结构、数据库 schema、Git 历史等信息代理按需调用另一类是“加工型 MCP”负责对上下文做处理比如把一段长文本压缩成摘要、把一堆函数签名整理成接口列表、把报错堆栈解析成结构化错误信息。Context-mode MCP 其实就属于第二类所有 MCP 服务对外暴露的能力都和“如何组织上下文”相关。有一个非常容易被忽略的细节是MCP 工具返回的上下文也需要做“体重”控制。我刚接触 MCP 的时候给代理加了一堆工具比如 list_files、read_file、search_code、get_git_diff……结果代理一次任务流程里要调用七八个 MCP 工具每次返回一两千 token光工具结果就把上下文撑爆了。后来我给每个 MCP 工具设了“返回摘要模式”默认只返回精简结果只有在代理显式要求“完整内容”时才返回全量数据。这个改动让上下文消耗骤降而代理的实际输出质量反而提升了——因为它不再被无关的工具返回噪音干扰。另外一个经验是 MCP 工具数量不宜贪多。工具越多模型在“要不要调用这个工具”这件事上就需要额外判断有时候模型会调用错误的工具或者在大量工具里迷路。我在一个项目里把 MCP 工具从 12 个精简到 6 个编码代理的完成率反而提升了接近 10%。这个结论初看反直觉但本质上是符合认知负荷规律的工具越多决策空间越大误导概率越高。4.2 Context-mode 的上下文装配流程按需加载、结果净化、动态压缩Context-mode MCP 的核心设计理念不是“把所有上下文都准备好”而是“让代理在使用时按需获取”。我搭过一套典型的 Context-mode 装配流程分四步第一步是“意图解析”也就是根据用户当前输入和任务目标判定接下来需要哪些上下文。比如用户说“修改订单查询接口使支持分页”意图解析就会判断需要订单相关实体、控制器、服务层、数据访问层这四类上下文。第二步是“按需加载”。通过 MCP 调用资源型工具精确读取上述相关文件内容而不是把整个仓库的代码都搬出来。加载时还要注意“只取相关片段”一个 1000 行的文件可能真正与订单分页相关的只有其中 40 行应该让系统通过结构化检索把 40 行先提出来而不是把 1000 行全塞进去。第三步是“结果净化”。MCP 工具返回的原始内容往往带有大量无关杂质比如注释、历史遗留代码、临时调试信息。结果净化就是把这些杂质剥掉只保留与当前任务直接相关的代码片段、函数签名、依赖关系再注入上下文。第四步是“动态压缩”。如果在某一步加载的上下文仍然超过预设阈值就对其中较次要的部分执行压缩。比如把某个大文件的内容改成“该文件主要包含 OrderService 类提供 createOrder/cancelOrder/queryOrder 三个方法其中 queryOrder 为当前任务相关方法”然后再把 queryOrder 的方法体完整放进去。这套流程跑下来效果非常稳定。我把它封装成一套 MCP 资源协议之后代理几乎不再出现“读了整个文件却忘了关键函数”的怪问题因为能进到上下文的内容都已经被清洗过一遍。这里顺带提一个很关键的经验动态压缩的“结果”不能是一次性的。因为编码任务是迭代性的你这次压缩后得到的摘要下次任务可能还需要细看所以要把压缩产物同时写入 ChatMemory作为后续任务的基础信息。我在项目里把这个机制叫“上下文派生”上下文不再只是从原始文件里读取还可以从之前处理过的压缩产物中读取。这样既保证了上下文新鲜又避免了反复读取大文件的性能浪费。4.3 ChatMemory、滑动窗口、Context-mode MCP 的组合编排很多人会误以为 ChatMemory、滑动窗口、Context-mode MCP 是三个独立的模块其实在真正的编码代理体系中它们必须组合编排。我的经验是把这三层看作“生产—保鲜—按需供给”的闭环ChatMemory 负责生产结构化记忆滑动窗口负责保鲜Context-mode MCP 负责按需供给。一个典型的编排流程长这样代理启动时Context-mode MCP 先从 ChatMemory 的项目记忆层读一批“常驻约束”注入上下文然后滑动窗口初始化并设定双约束阈值。任务进行中每次对话轮次结束时ChatMemory 评估当前轮次是否有值得写入的决策或约束滑动窗口判断是否要压缩、丢弃或提取老消息。当代理需要调用工具或读取文件时Context-mode MCP 负责按需加载并净化加载结果再经过滑动窗口的容量约束决定是完整放入还是压缩放入。这三个环节之间需要一个“共享总线”来传递信息我用的方案是把 ChatMemory 的存储层作为共享状态滑动窗口的“持久化线头”即提取出的关键信息直接写入 ChatMemoryContext-mode MCP 加载到的文件摘要也缓存到 ChatMemory。这样三者在数据层面就打通了而不是各管各的。我实测量过组合编排前后的效果对比。单独用滑动窗口时50 轮会话的任务完成率大约在 60% 左右加入 ChatMemory 后任务完成率到了 75%再加入 Context-mode MCP 按需加载后能稳定到 85% 以上。虽然这组数字受限于具体模型和项目规模不能算是普适结论但趋势非常明显每加一层代理的稳定性就能上一个台阶。发生的问题类型也在变化从最早的“模型失忆”“重复劳动”逐步变成“工具调用冗余”“压缩质量不稳定”这类更靠后的工程问题——这也侧面说明上下文工程的成熟路径确实是先解决“存不住”再解决“找不到”最后解决“装配不合理”。5. 落地实操上下文优化方案的三层配置与调参参考5.1 第一层配置ChatMemory 的分级参数与触发时机如果你要在自己的编码代理里落地这套体系我给一个可以直接用的初始配置参考。ChatMemory 这边我建议先把工作记忆的容量设为 50 条关键信息项目记忆设为 200 条长期记忆不设上限但设置“最少访问次数”作为淘汰条件。写入触发时机建议不要每轮都写而是设置三个硬触发条件一是检测到明确的“决策性话语”包含“必须”“以后都”“统一”等词汇二是任务阶段结束比如一轮代码修复完成后三是出现错误修正信息比如用户明确指出“刚才那个方案不对”。长期记忆的淘汰策略我踩过不少坑。之前我用“最近最少使用LRU”结果把很多低频但重要的项目规范淘汰掉了。后来我改成“LRU 重要度优先”的混合策略先按重要度排序再在重要度相同的分组里用 LRU 淘汰。这样既不会清理掉关键约束又能控制长期记忆的体量。这个混合策略其实只需要给每条记忆打一个“重要度分数”就可以实现工程成本很低回报却很明显。5.2 第二层配置滑动窗口的双约束与压缩比例滑动窗口这边我的参考配置是消息条数上限 20 条token 上限 8K窗口每次滑动时将窗口内最早的 40% 内容进行压缩或提取而不是直接丢弃。为什么保留 40% 而不是全部压缩因为如果每次把窗口外内容全部清空前后的上下文就失去了连续性模型会感到“断片”保留一部分压缩摘要能维持一个连贯的任务脉络。压缩比例的动态调整也值得一说。我使用一个“任务复杂度因子”来调整压缩力度如果当前任务涉及多个文件交叉修改说明信息密度高压缩比例降低到 30%如果当前任务只是简单问答或单文件修改压缩比例可以提高到 60%。这个因子可以在会话开始前由用户确认也可以由系统根据当前上下文里文件数量来自动估算。自动估算需要一个小工具统计当前上下文里出现了多少个“文件路径标识”数量越多说明任务越复杂压缩就应越谨慎。这套方法没有严格的数学推导但实测比固定压缩比例要好用得多。注意一个操作禁忌压缩时不要把报错信息压缩得太狠。我曾经为了省 token把一段 TypeError 的堆栈压缩成“遇到类型错误”结果代理完全无法定位问题只能反复试错。报错信息保留原始堆栈的关键前 10 行比任何摘要都更有价值。这条经验后来被我写成了一条固定配置滑动窗口压缩时报错类信息永远不压缩只做截断。5.3 第三层配置Context-mode MCP 的工具组织与调用链路Context-mode MCP 的配置重点在两个地方工具列表的组织和调用链路的顺序。工具列表一定要按“获取型”“加工型”“执行型”分类并给每个工具配上清晰的“何时调用”说明。我给每个工具写了一个 tool_description 后缀专门说明“当用户提到 XX 时使用本工具”这个小改动极大减少了模型误调工具的概率。调用链路顺序上我建议遵循“先检索、再读取、后执行”的原则。代理收到任务后先通过 search_code 检索相关文件路径再通过 read_file 的结构化模式读取关键片段最后才调用执行类工具做修改。这个顺序的好处是不会让代理在一开始就跑去读了一堆无关文件。为了强化这个顺序我在 system prompt 里用一个简单的流程描述来约束代理同时在 MCP server 端对 read_file 设置了“必须携带 search_context 参数”的限制防止代理无脑整文件读取。如果你的编码代理支持多 MCP server 同时挂载我还建议把 Context-mode 的 server 独立出来不要和普通工具 server 混在一起。这样可以在出问题时单独降级或替换而不影响其他工具的正常运行。我实际拆过一次之后排障时间缩短了很多因为你不再需要在一大堆工具日志里翻找上下文装配的痕迹。6. 常见问题与排查技巧实录6.1 会话变长后模型开始“左右横跳”现象同一段对话里模型一会儿用方案 A一会儿用方案 B改了又改代码风格明显不一致。这个问题的根因往往是滑动窗口滑动后早期确认的技术方案被滑出了上下文而 ChatMemory 又没有及时把“方案 A 已确认”作为决策清单写入导致模型在下一次生成时忘记了既有决策。排查顺序第一检查 ChatMemory 决策清单里有没有“方案 A 已确认”的记录第二检查当前上下文里决策清单是否真的被注入第三检查滑动窗口压缩时有没有把决策清单当普通信息压缩掉。我遇到最多的是第一种情况也就是 ChatMemory 的写入触发条件没覆盖“方案确认”这个场景。解决办法是在写入触发条件里加一个“用户确认型话语”识别比如“就用这个”“可以”“没问题”配合前文出现过的“方案”关键词触发决策写入。6.2 MCP 工具返回内容过大把窗口撑爆现象代理调用了一个搜索工具搜索结果返回了 2000 个匹配项结果直接把可用上下文占满后续生成的代码质量急剧下降。这个问题在使用全文检索类工具时特别常见。解决思路有两个层面。第一层是在 MCP server 端做“结果截断”比如 search_code 默认只返回前 20 条匹配结果并附上“共匹配 X 条已截断”的提示第二层是给代理的每次工具调用的返回加一个 token 预算超出预算的部分自动转为摘要摘要再超出就丢弃。这个预算通常设置为当前剩余上下文的 30% 左右。如果你发现代理频繁被大返回撑爆多半是预算设得太高建议下调到 20% 甚至 15%。6.3 代理读到了文件内容但不按文件里的逻辑改现象代理能看到代码内容却仍然按照自己的“想象”修改改完之后文件根本编译不过。这种情况让我曾经很困惑后来才发现不是代理看不懂代码而是上下文里同时存在“旧版文件内容”和“新版文件内容”代理分不清哪个才是当前版本。根因是文件内容被多次读取后旧版本没有被滑动窗口及时清出而新版本又被 MCP 加载进来两个版本在上下文里“打架”。解决方案是在设计 MCP read_file 时对同一个文件路径返回统一打上版本标记并在滑动窗口压缩时设定“同路径文件只保留最新版本”的规则。这个规则执行起来不复杂只需在文件路径上做一个哈希去重但效果立竿见影。6.4 记忆系统存了太多噪音检索反而不准现象加入 ChatMemory 后模型不仅没变聪明反而更容易被无关记忆干扰经常把旧任务的信息带到新任务里。这个问题的根源基本都在“写入太积极”。我之前提过一个判断标准如果记忆库里 50% 以上的内容与当前任务无关说明写入策略已经失衡。解决办法是“提高写入门槛”。把触发条件从“检测到关键信息”改为“检测到关键信息且该信息影响后续任务路径”。具体来说一条信息如果只在当前轮次有用不写入只有它在未来轮次可能被再次引用才写入。这个判断看起来主观但可以通过一个简单规则近似信息中是否包含明确的“实体”文件名、函数名、接口名、人物角色名。如果包含实体则大概率会在后续引用可以写入如果只是情绪表达或状态描述则不写入。这个规则在工程上很容易落地也是我目前最推荐的第一版记忆写入过滤方案。我在实际使用中还有一条体会上下文工程没有“一步到位”的银弹方案。不同的模型、不同的代理框架、不同的项目代码量最优参数都会变化。我的建议是先按本文给的初始配置跑起来然后针对自己项目里最常出现的“失忆”“漂移”“上下文爆炸”三类问题分别从 ChatMemory 触发条件、滑动窗口参数、MCP 返回截断三个方向去调。每调整一次记录一次任务完成率和平均上下文占用两周之后你就能形成一套属于自己的调参依据。这个动态调优的过程本身也是上下文工程最核心的日常状态。
返回列表