持续整理会话,修剪不再必要的内容。这种上下文保留方式有什么具体的算法和实现吗

有,这块现在有比较成型的算法谱系。我按“选什么保、怎么保、什么时候触发”分三层说。 一、两种基本算法族 有个 2026 年的论文 Context Compaction Theory 把它形式化成两个博弈:Context Selection Game(选择保留一个子集)和 Context Generation Game(生成一条长度受限的新消息)。它证明了生成式压缩和单向通信复杂度等价,最小预算等于诱导通信问题在该错误率下的单向随机通信复杂度,所以通信复杂度的已知界可以直接搬过来。还给了个有意思的结论:存在一类查询,选择式需要比生成式多一个因子的预算。选择式等价于受限的一类单向协议,两者之间的 gap 就是两类协议的 gap。另外它拿 Anthropic 的压缩端点做了个 case study:让它只服务集合成员查询,结果错误率接近随机猜,而同样大小的 Bloom filter 是近最优——说明信息是在压缩阶段被丢掉的。 二、生产方式大概五类,按保守程度排 1. verbatim 删除式。模型给每行/每块打分,只删低信号内容,不生成任何新文本,存活行与原文逐字符一致。Morph 那套声称 50-70% 压缩、98% 逐字保真 tok/s。好处是彻底没有幻觉风险,文件路径、报错字符串、行号要么原样在要么彻底没了,不会被改写成“the stripe file”。问题是细粒度切分会切坏语义。 2. observation masking。JetBrains 的 Junie 那篇里提到的:工具调用记录保留,把旧的工具输出整块替换成 [masked]。在 SWE-bench 上质量与完整 LLM 摘要持平,且这一步零额外算力。核心假设是绝大多数工具输出只被消费一次,用完就不会再引用。 3. token 级剪枝。LLMlingua / LLMlingua-2 用小模型算 perplexity 或 BERT 打分,逐 token 删。自然语言能到 20x,但代码上很危险——删掉!== 里的! 或一个 new 直接改逻辑。所以对代码场景,删除粒度应该跟语义粒度对齐:按行/块,不按 token。 4. LLM 摘要式。Claude Code、Cursor、Codex 都走这条,Claude Code 具体做法是把消息历史丢给模型摘要,保留架构决策、未解决的 bug、实现细节,丢掉冗余的工具输出,然后带上最近访问过的五个文件继续。Anthropic 官方那条建议我觉得最实用:先在复杂 agent trace 上调 prompt 把 recall 拉满,确保不丢东西,再迭代 precision 去砍冗余。最低成本的一刀就是 tool result clearing。 5. 自适应 / 分层。ACON 的结论是均匀压缩是次优的,不同上下文段信息密度不同,该分别处理。大致可以分成三级:工具原始输出可以狠压(占典型会话 60-80% token);推理轨迹和决策记录要小心(token 少但密度极高);用户指令、当前报错、在改的文件路径、待办状态永远别压。这和 Anthropic 讲的“tool result clearing 是最安全最轻的一刀”是同一个判断。 三、触发与执行策略 阈值不是卡在 95% 才压,压完你得有空间继续干活。Morph 建议 80% 就触发,Claude Code 默认偏晚。还有个“预防优先”的思路:把压缩当成最后一道防线,先减少产生垃圾——搜索只返回片段而不是整文件、编辑用 diff 而不是整文件重写。他们测到这样能把 3-4 次压缩降到 0-1 次。 更关键的一点是:压缩之后 agent 只把压缩结果继续往下传,原始历史虽在存储里但不再进入上下文,因为每轮从全量历史重算一份摘要成本会爆炸。论文里算过一笔账:100 万 token 历史做一次摘要,光输出 10 万 token 就 5 美元、几分钟。所以压缩是有损且不可逆的,丢了的东西在后续步骤里就再也到不了模型。 四、几个具体实现可以照着抄 Hermes 那套(Joye 笔记里有):75% 触发,保留前 3 条 + 后最多 6 条做中段保护,中间轮次摘要,而且是迭代累积——下次压缩保留上次的摘要继续叠加,不是重新从原文摘要。压完旧 session 以 end_reason=compression 结束、新建 session 挂 parent_session_id,通过 session 链保持谱系,用户视角仍然是一条对话。同时它把记忆块的快照冻在 system prompt 里保前缀缓存,每轮检索结果作为围栏块注入但不落盘、不改写原始消息——这是“保留”的另一半:不是所有东西都该塞进历史里,能在需要时再取的就别常驻。 Anthropic 那边还有两条互补的路子:结构化笔记(agent 自己写 NOTES.md / progress 文件,跨压缩边界靠读自己的笔记恢复)和 subagent(子 agent 在自己的干净上下文里烧几万 token,只回 token 的浓缩结论)。 一句话建议:先想清楚“丢了什么会让后面的决策不一致”,把它设成永不压缩区;然后对工具输出用 masking 或逐字删除这种无损手段做第一刀;摘要式压缩留到最后,并且用迭代累积而不是每次重开。顺序上先调 recall 再调 precision,别反过来。