1. 上下文构造
1.1. 信息优先级
系统指令、用户约束、当前环境事实、待完成目标和可用动作构成核心输入。历史内容只有在改变当前决策时才应保留。位置和格式同样影响模型能否利用信息。
构造器应从权威状态生成上下文,而不是把聊天消息无条件拼接。这样可以排除已经失效的计划,并保留最新资源版本。
设窗口预算为 ,候选片段为 ,长度为 ,对当前决策的效用估计为 。装配可近似写成在 下最大化 ,同时满足系统指令、用户约束和必要状态等硬约束。实际系统还要考虑顺序、来源与片段间依赖,因而不能只按相似度除以长度贪心选择。
预算先预留模型输出和工具结果空间,再分配给稳定前缀、任务状态、工具定义、检索证据与近期轨迹。工具集合可动态筛选,长日志保留诊断块与原始产物指针,代码按符号和行区间加载。每类内容都有上限,避免一个异常工具结果吞掉整个窗口。
1.2. 来源与冲突
工具观察、用户输入和模型推断需要不同来源标签。发生冲突时,系统根据权威级别与时间选择,并把未解决冲突显式留给策略。
网页或文档内容属于数据,不应与系统指令混在同一控制层。边界标记不能彻底消除注入风险,但能为过滤和审计提供结构。
冲突处理先比较主体、时间和证据。用户本轮明确更正优先于旧偏好,环境实时读取优先于模型摘要,已提交事实优先于计划。无法确定时同时保留候选及冲突标签,让策略获取更多证据,而不是用最近出现的位置自动覆盖。
装配结果需要清单:片段 ID、来源、版本、选择原因、token 数和所在区域。失败后可以回答关键约束是否被选中、是否在压缩中改变、是否被截断。没有装配 trace,context rot 往往只能被模糊归因于模型。
2. JIT检索与状态续接
2.1. 按需加载
Just-in-time 检索在决策出现信息缺口时才读取。基础上下文保留任务目标、当前状态和可发现能力;模型需要具体文件、历史事件或技能时,通过带范围的检索动作取得。与启动时预加载相比,JIT 降低无关内容和重复 token,也让读取行为进入可审计轨迹。
检索查询要绑定当前子目标,结果保留来源、时间与资源版本。未命中、权限拒绝和结果过多使用不同状态。模型可以改写查询,但重复无新增结果时触发停止或换检索轴。检索后并非全部注入,装配器仍检查相关性与预算。
2.2. 中断后的续接
状态续接恢复的是权威运行状态,不是把旧对话原样重放。检查点至少保存目标、约束、已完成子目标、未决问题、资源版本、最近提交动作、预算和原始事件指针。恢复器核对环境是否变化,再构造一份新的当前上下文。
正在执行的外部动作不能凭摘要假定完成。恢复时查询提交状态,明确已提交才更新事实,未知则暂停检查。旧计划若引用已经变化的文件或网页元素,需要重新观察并使相关节点失效。续接质量由恢复后能否正确选择下一动作评测,而不是摘要读起来是否连贯。
2.3. 缓存与失效
JIT 读取可缓存昂贵结果,但缓存键包含主体、资源 ID、版本、查询和权限域。文件修改、工具列表变化或用户撤销权限时,对应缓存失效。没有版本的语义缓存容易把旧事实送回新任务。
缓存命中也要出现在 trace 中。策略看到的是历史结果还是实时读取,会影响结论时效。高风险验证默认绕过陈旧缓存,或要求最大年龄;稳定参考资料可使用更长有效期。
2.1. 选择与摘要
选择保留原文片段,适合约束、代码和精确证据;摘要把多条事件合并为更短状态,适合已完成过程。两者不能互相替代。
摘要应保留未决事项、关键标识、数值、失败原因和来源指针。仅保存流畅叙事,容易把不确定判断写成确定事实。
摘要可分为事件摘要、状态摘要和证据摘要。事件摘要压缩发生顺序,状态摘要只保留当前有效变量,证据摘要把主张绑定来源。Agent 续接主要依赖状态摘要,审计依赖事件指针,研究回答依赖证据摘要。用一个自由文本摘要同时承担三项职责,容易丢失否定、版本和未决冲突。
压缩函数 的质量不能只看 。更重要的是约束保留率、事实一致性、可追溯率和下游动作一致性。对每个关键问题 ,比较原始历史与摘要条件下的答案或下一动作;若摘要导致资源 ID、数值或停止条件变化,就不适合替代原文。
2.2. 分层状态
近期观察放在热上下文,已确认事实进入结构化状态,完整轨迹留在外部存储。模型需要细节时再按标识读取原始事件。
这种分层让上下文预算与审计需求分离。压缩不会删除事实源,也不会迫使每轮携带全部历史。
MemGPT 以虚拟上下文管理说明分层思路:有限窗口承担当前工作区,外部 recall 与 archival storage 保存更多信息,系统通过函数调用和控制中断在层间移动内容。它在长文档分析和多会话聊天上评测这种设计。这里可借用的是显式层级与换入换出机制,不是把内存术语当作模型自然具备的能力。
换出策略需要保护硬约束和当前依赖。已经完成且可从事件恢复的过程优先压缩,最近工具 observation 在被消费前保留原文,用户明确要求和安全限制固定在稳定区域。换入则由当前任务、实体和未决问题触发,并限制一次读取规模。
3. 压缩验证
3.1. 保真检查
可用问答或状态重建任务比较压缩前后:约束是否保留,资源标识能否恢复,下一动作是否一致。长度下降本身不是质量指标。
对高风险任务,摘要生成与事实提取应由确定规则或独立校验辅助。错误摘要一旦成为后续唯一输入,会产生持续偏差。
可以构造压缩前后配对测试:要求恢复所有未决任务、列出已修改资源、复述精确数值、判断某动作是否已提交,并在相同环境中选择下一动作。摘要若遗漏一个普通闲聊细节影响有限,遗漏“尚未付款”会导致重复副作用。评测按字段风险加权,而不是平均字符重合。
事实型字段适合结构化提取与 schema 校验,自由叙事保留为辅助说明。压缩器输出事实时附源事件 ID,校验器随机回读原文核对。无法确定的内容标记 unknown,不为追求简短补全缺失信息。
3.2. 触发时机
压缩可由 token 预算、阶段完成或任务切换触发。只在窗口即将溢出时压缩,会把多个阶段的临时推理混成一段。
阶段边界压缩更容易区分已提交结果与下一阶段假设。每次压缩都记录源事件范围,使问题能够追溯。
4. Context rot与位置效应
4.1. 长度不等于利用率
Context rot 指随着上下文增长,相关信息的实际可用性下降。原因包括位置偏差、相似片段竞争、冲突事实、无关工具描述和多轮错误累积。窗口没有溢出也会发生退化,因此“还能放下”不是继续追加的充分理由。
Lost in the Middle 在多文档问答与键值检索中控制相关信息位置,观察到许多模型在信息位于开头或末尾时表现较好,位于长上下文中部时明显下降;即使声明支持长窗口的模型也不总能稳定利用所有位置。该实验要求评测同时改变长度和证据位置。
4.2. 缓解策略
稳定指令置于固定区域,当前任务状态靠近决策位置,检索证据按子问题分组并去重。对很长材料先建立索引,JIT 读取原文片段,而不是把所有文档拼接。重要约束可在结构化状态中重复呈现,但重复必须来自同一事实源,避免多个版本竞争。
排序策略本身需要消融。按相关性、时间、来源权威或任务依赖排序会得到不同结果。把正确证据固定在不同位置,检查答案和动作是否稳定;随机打乱无关片段,检查系统是否受表面邻近影响。
4.3. Context污染
工具结果和外部文档可能带有诱导指令,旧轨迹也可能包含已经否定的计划。装配器按来源分区,把数据内容放在不可信区域,并只提取任务所需片段。安全依然由工具权限强制,因为文本隔离无法保证模型永不受影响。
污染还包括无意偏差:把失败尝试的结论摘要成事实,把另一个用户的缓存结果带入当前任务,或加载不兼容版本技能。来源、主体和版本检查在进入上下文前完成,不能期待模型自行辨认所有污染。
5. 上下文系统评测
5.1. 组件指标
装配阶段统计关键片段召回、无关 token 比例、冲突检出和预算使用;压缩阶段统计约束保留、事实一致与可追溯;续接阶段统计恢复后的下一动作正确率;JIT 检索统计查询成本、命中和对任务终局的增益。
这些指标需要与任务成功联合解释。相关片段召回高但排序差,模型仍可能不用;压缩率高但丢失一个停止条件,会造成严重错误。评测集要包含短任务、长轨迹、冲突更新、跨会话恢复和恶意文档。
5.2. 消融与实验控制
比较全历史、滑动窗口、摘要、结构化状态和 JIT 检索时,固定模型、工具、任务与总 token 预算。若某方法使用额外模型做摘要或检索改写,这些调用计入成本。多次运行并报告长度与位置分桶结果。
位置实验把同一关键事实放在开头、中部和末尾;冲突实验改变新旧事实顺序;续接实验在不同提交阶段中断;压缩实验逐步提高比率。完整 trace 用于判断失败来自未选中、被截断、摘要失真,还是模型看到后没有使用。
5.3. 一条长任务装配轨迹
设代码 Agent 已运行四十轮,目标是修复支付回调偶发重复入账。原始轨迹包含需求、二十次搜索、六个文件片段、三次失败补丁、测试日志和一次用户更正。装配器固定保留用户更正、当前工作树版本、已确认根因、未完成谓词与可用工具;失败补丁只留下结论和事件指针,重复搜索折叠为已排除路径,最近一次测试错误保留原文。
模型准备编辑时,JIT 读取当前回调实现和数据库唯一键定义。补丁完成后,旧代码片段立即失效,新差异与哈希进入状态。测试阶段加载项目验证技能,只带相关命令说明;测试日志裁剪为退出码、失败用例与堆栈。整个过程每次重建上下文,权威事实仍保存在状态和事件库。
若服务在验证前中断,恢复器读取检查点并核对文件哈希。哈希一致时继续测试,变化时使旧补丁验证状态失效并重新读取。摘要中即使写着“代码已经修改”,也不能越过版本核对。续接由环境事实驱动,而非由叙事连贯性驱动。
5.4. 摘要漂移与递归压缩
多次对摘要再次摘要会产生漂移:限定条件消失,不确定语气变成确定陈述,两个时间点合并成一个当前事实。系统应尽量从原始事件和结构化状态生成新摘要,而不是无限递归压缩旧摘要。必须递归时,保留上一层来源范围和关键字段校验。
可以设置不可压缩槽位,例如用户硬约束、未完成副作用、资源标识、精确数值和冲突事实。自由文本摘要只覆盖解释性过程。每轮压缩后运行自动问题集,核对“谁要求什么”“哪些动作已提交”“下一步依赖什么”“还有哪些风险”。任一答案缺失就降低压缩率或回读原文。
摘要模型与执行模型可以分离,但额外模型并不天然更可靠。摘要器需要看到来源边界,输出受 schema 约束,并在评测中单独记录错误。使用更便宜模型降低成本时,要比较关键字段保留与下游完成率,而非只比较摘要可读性。
多主体与权限装配。
同一 Agent 服务多个用户或 Workspace 时,候选片段先按主体和权限过滤,再做语义检索。先检索后过滤可能在日志、排名或缓存中泄露私有信息,也会让无权内容影响相关性排序。共享技能、团队记忆和个人偏好使用不同命名空间。
权限变化会使已经缓存的上下文片段失效。用户离开项目后,旧会话恢复不能继续加载项目文件;共享文档转为私有后,摘要和向量索引同步撤销。装配 trace 记录每个片段使用的授权依据,审计时才能解释模型为何当时可见。
跨主体协作只传递明确产物与权限允许的摘要,不共享整个上下文。子任务返回结果时标注来源与可见范围,父任务在装配前再次过滤。上下文隔离是信息流边界,不只是节省 token 的优化。
Context rot诊断。
诊断先做可见性测试:关键片段是否进入上下文、是否被截断、位置在哪里。随后做利用测试:在相同装配下询问直接事实或要求选择下一动作。若事实问答正确而动作错误,问题更可能在策略;若片段根本未进入,则修检索和预算。
再做置换实验,把关键片段移动到开头、中部和末尾,保持其余内容不变;做干扰实验,逐步加入语义相近但错误的片段;做长度实验,保持信息位置比例并增加无关内容。三组曲线可以区分位置偏差、竞争干扰和纯长度成本。
生产监测不应保存敏感全文,可以记录片段 ID、位置、长度、来源类别和被后续动作引用的关系。失败样本在授权环境中回放。这样既能量化 context rot,又不把完整用户数据复制到分析日志。
预算调度的数值例子。
假设模型窗口为 32000 token,预留 6000 给输出和下一次工具 observation,剩余 26000 用于输入。稳定指令和用户约束占 3000,动态工具定义占 4000,当前任务状态占 3000,近期原始事件占 6000,检索证据最多 8000,另留 2000 作为误差缓冲。装配器若发现工具定义扩大到 9000,不能挤掉用户约束,而应筛选工具或缩短证据候选。
一次搜索返回十篇各 2000 token 的文档时,系统先按子问题和来源去重,选出三篇关键片段共 6000 token,并保留其余文档索引。模型形成新缺口后再 JIT 读取第四篇。若一次性放入两万 token,窗口仍未溢出,却会压缩近期错误与任务状态,增加位置效应。
预算利用率要和完成率共同观察。某策略始终把窗口填满,可能只是在携带冗余历史;另一策略平均使用一半窗口,通过精确检索获得更高成功率。成本报告包含装配、摘要、检索改写和额外读取的所有模型调用,避免把外围计算隐藏在“主调用 token”之外。
约束保持测试。
测试集可以为每条长轨迹植入若干可核查约束:禁止修改某目录、发布前必须审批、金额上限、指定输出格式与一个中途更正。轨迹增长和多次压缩后,在不同阶段要求 Agent 选择动作,检查违反约束的比例。约束文本始终存在却没有影响动作,也算利用失败。
更正测试尤其重要。旧约束先出现,新约束在中段覆盖它;装配器应保留当前版本和变更来源,避免开头位置优势让模型继续执行旧规则。将新旧位置互换可区分版本处理与位置偏差。
工具 observation 也能携带约束,例如 API 返回速率上限或文件标记只读。状态提取器把它们转成当前有效条件,并保留原始来源。摘要若遗漏,后续动作可能合法解析却被环境拒绝,评测应把首次遗漏定位到压缩步骤。
约束测试还应覆盖相互依赖的条件。用户允许修改测试文件,但只在生产代码同时修复时成立;允许访问网络,但只限官方文档域名。装配器若把复合条件拆成两个孤立事实,模型会获得过宽能力。结构化状态保存条件表达式和作用域,呈现给模型时保持逻辑关系。
对多阶段任务,约束可能在阶段切换时生效或失效。探索阶段允许只读搜索,实施阶段开放补丁,发布阶段才出现部署工具。上下文构造器依据状态机选择规则和工具,旧阶段内容进入事件历史而不继续占据控制区。评测在边界时刻检查工具集合与约束版本,能发现续接后阶段错位。
装配器本身也应采用确定版本并接受回归测试。规则变化会改变所有下游调用的输入分布,必须和模型升级一样记录、比较与回滚。 上下文工程的目标是在固定预算内提供足以支持当前决策的状态,装入最多文本没有独立价值。可将候选片段 的选择写成带约束优化:最大化 ,同时满足 和权限、来源、新鲜度约束。效用 依赖当前动作,不能由全局相似度一次决定。
预算还需预留输出、工具 schema、错误恢复和验证空间。把输入填满窗口会导致模型无法生成完整工具调用,或在关键 observation 到达后被迫丢弃早期约束。Runtime 根据阶段分配动态预算,规划、执行和验证使用不同信息组合。
上下文条目包含内容、来源、资源版本、时间、权限标签和依赖。用户指令、系统策略、工具 observation 与网页文本保持角色边界。外部资料即使与任务高度相关,也不能因检索分数高而覆盖系统约束。
选择顺序从硬约束开始:当前目标、权限、已提交效果、待审批动作和错误状态具有最高保留级别。随后加入直接依赖证据、相关接口和近期 observation,背景与示例只在仍有预算时加入。位置优化不能弥补关键事实缺失。
JIT 检索把上下文视为可寻址外存。模型先看到目录、符号或来源摘要,在形成具体问题后展开原文。代码任务从错误定位到调用方,研究任务从主张缺口到原始来源;无目的全库读取既昂贵,也增加旧信息污染。
检索查询来自当前 belief,但要防止确认偏差。若模型假设某模块有 bug,只搜索支持该假设的符号,会遗漏真正责任层。查询计划包含反证、邻接调用方和权威事实源,并记录未命中,避免把“没有搜到”直接当“不存在”。
缓存以内容哈希、资源版本、权限主体和变换版本为键。摘要模型升级或源文件改变后,旧缓存失效。跨用户共享的向量缓存若遗漏权限维度,可能泄露文档存在性;缓存命中也不能延长已撤销授权。
状态压缩分为删除、抽取和摘要。已确认无关的原始日志可以移出活动上下文,稳定结构字段直接抽取,开放讨论才使用生成式摘要。三者风险不同:删除可能漏掉未来相关信息,抽取受 schema 限制,摘要可能产生语义漂移。
摘要应围绕未来行动保存目标、已验证事实、未解决问题、否定证据、资源版本、已提交副作用和恢复入口。把一段历史改写成“已处理登录问题”没有说明处理了什么、是否验证、当前代码版本,无法支持续接。
递归压缩会累积误差。若每轮摘要遗漏概率为 ,关键事实经过多次独立压缩后的保留率近似 ;实际错误还会相关并被后续摘要当成事实。系统保留结构化状态和原始产物引用,定期从源证据重建,而不是永远总结上一次总结。
压缩后的保真检查可以生成约束问答:当前目标是什么,哪些动作已提交,哪个版本通过测试,哪些风险仍未知。答案与压缩前结构状态比较。该测试不要求复现所有措辞,只验证后续决策所需的不变量。
位置效应意味着模型对相同内容在窗口不同位置利用率不同。关键约束靠近当前决策并以稳定格式重申,长工具输出放在外部产物,通过索引按需展开。简单扩大窗口可能让重要事实淹没在更多干扰中。
context rot 还来自互相矛盾的版本。旧 API 文档、新 schema、历史错误和当前实现同时出现,模型可能拼成不存在的接口。装配器按资源身份聚类,优先当前权威版本,旧内容仅在迁移分析时展示并明确标签。
污染可以跨轮持久化。恶意网页内容被摘要进长期笔记,下次任务即使不访问网页也会继承伪指令。所有派生内容保留来源污点,写入长期记忆需独立策略;系统规则和用户偏好不能由外部文本更新。
多主体上下文遵守最小权限。父 Agent 拥有的全部材料不会自动传给子 Agent,只发送任务所需片段和能力。子 Agent 返回结构化结果与产物引用,父会话不吸收其完整历史。这样既减少 token,也缩小信息泄露和提示注入范围。
设总预算 32k token,固定系统与工具占 6k,输出与验证预留 6k,活动状态 4k,剩余 16k 给证据。三个候选文件分别 9k、7k、6k,无法全放入。装配器先抽取相关符号窗口共 8k,再加入失败日志 3k、接口契约 2k,保留 3k 余量应对新 observation。
若模型在执行后得到 5k 测试日志,系统把完整日志存为产物,抽取失败用例、首个 cause、退出码和截断标记约 800 token。后继需要某段堆栈时按引用展开。相比先塞满 22k 文件再截断日志,这种预算更符合决策价值。
一次长程迁移任务中,Agent 先读取 schema、调用方与项目规则,完成后保存工作树哈希和测试结果。服务重启使模型执行体丢失,恢复器装配目标、已改文件、失败测试和未处理调用方;旧探索对话不必全部回放。
恢复后的模型发现文件版本与检查点不一致,因为用户追加了修改。装配器标记冲突,并同时提供检查点 diff 与当前文件相关段。模型重新规划合并,不把旧 patch 直接应用。版本标签把上下文冲突转成显式状态。
反例是“为了保险把所有内容放进去”。超长上下文增加推理成本,旧日志与重复定义稀释当前证据,模型还可能引用过期结果。另一个反例是极端摘要,只保留结论而删除来源,使 verifier 无法核对,错误也无法追踪。
组件评测分别测检索 recall、重要约束保留、来源正确、新鲜度、压缩率和 token 成本。端到端评测在相同任务与模型下替换装配策略,观察成功、首次偏离与恢复。单看摘要相似度无法知道它是否支持行动。
消融可以移除结构状态、版本标签、否定证据、权限过滤和原始引用。若删除某项后任务仍成功,但越权或重复动作增加,它仍有系统价值。评测需包含长程、冲突和恢复任务,短问答无法暴露压缩缺陷。
最终,上下文是权威状态的一个临时视图。事实仍在仓库、数据库、事件日志和来源中,窗口只为当前决策装配必要部分。把窗口当事实源会让截断与摘要变成数据丢失;把它当缓存,系统才可在任何阶段重新水合和验证。
上下文装配还要处理引用闭包。一个片段引用类型定义、缩写或上游结论时,单独加入可能无法理解;装配器补充最小依赖,或把缺失依赖标记出来。闭包同样受预算约束,因此优先选择自包含证据,避免把半个依赖图塞进窗口。
表格、代码和图像具有不同压缩方式。代码保留签名、控制流和相关调用,不能只做自然语言摘要;表格保留列定义、单位与选中行;截图配合 OCR 和区域坐标。统一把所有产物转成段落会丢失结构,使后继工具难以引用。
观察排序不能采用“最近即最重要”。刚产生的冗长日志可能不如较早的用户硬约束重要。装配器把时间作为一个特征,与任务依赖、权威性和失效风险共同评分。已被新版本替代的最近内容也退出活动窗口。
用户修正拥有显式覆盖关系。用户说“不要修改数据库”后,旧计划中的迁移节点立即失效;系统保存修正事件和受影响节点。仅把新消息追加到窗口,模型仍可能受此前长计划牵引,继续生成被禁止动作。
摘要模型升级后,要在恢复任务上比较约束保持、事实准确和后继决策。新模型更流畅却遗漏版本号,会降低系统可靠性。摘要提示、模型、输出 schema 与源状态都进入版本元数据。
隐私最小化在装配前完成。任务只需知道客户所属地区时,可信工具输出地区而非完整地址;只需判断额度时,输出布尔结果而非余额。减少敏感原文进入模型,比事后依赖输出过滤更可靠。
线上指标包括有效 token、检索展开率、被引用 observation、过期内容命中、压缩触发和恢复重复动作。大量装入却从未影响后继动作的片段,提示选择策略浪费预算;安全约束虽不被显式引用,仍需单独统计其阻断效果。
装配计划本身写入 trace:候选有哪些、为何选择、哪些被预算排除、摘要来自哪个版本。失败后可以区分模型没有利用已提供事实,还是装配器根本没提供关键证据。缺少这层观测,所有上下文问题都会被笼统归为模型遗忘。
上下文服务还应支持可重复快照。一次模型调用记录实际渲染后的消息、工具定义哈希与引用产物版本,之后才能复现“当时模型看到了什么”。仅保存数据库当前值,会在源文件更新后错误重建历史输入。敏感快照按权限和保留期存储,过期删除后保留结构元数据。
成本评测把检索、摘要和模型输入分别计量。某方案减少输入 token,却在每轮重复做昂贵摘要,端到端可能更慢;另一方案缓存命中高,但经常使用旧状态。成功、延迟、新鲜度和费用共同形成前沿,不能只优化压缩率。
当任务结束时,活动上下文不直接整体写入记忆。系统抽取候选事实和技能,经过来源、稳定性、隐私与效用检查后分别提交。临时错误、过期计划和外部提示注入随运行归档,不进入未来任务的默认视图。