如果模型支持 5 亿 token 上下文会怎么样? opencode-acp 超长会话上下文压缩插件, pai-acp pi agents

ranxianglei 2026-08-02 22:59 1

这个插件用一句话就能说明白是什么,简单说,他是 opencode 上目前最新先进(可能也是所有 agents 最先进)的上下文压缩插件,他支持:



  1. 超长会话:实测最低支持 5 亿 token 级别上下文不丢关键信息,持续工作数日不换窗口。

  2. 极省 token:20w 上下文足够,按需使用上下文,绝大多数情况下上下文都维持在 10w 左右,对于 100w 上下文模型,长期工作实测省 5 倍 token 。


好,接下来详细介绍这个插件如何实现以上能力的。


压缩哲学



  1. 模型在任何时候不能知道总上下文大小。(模型不再懒于压缩)

  2. 一些压缩都服务于当前上下文任务。(模型有权拒绝压缩,或者少量压缩)

  3. 只有可压缩的内容出现才提示模型压缩。(防止过度压缩)

  4. 最近 N 条消息永远保留。(防止模型漂移)

  5. 分段压缩,N 级蒸馏压缩。(蒸馏自己过去自己的记忆,逐渐遗忘而不是断崖式忘却)。

  6. 上下文永远不删除,只隐藏。(日后模型可以找回记忆)


工作原理


不同于传统上下文压缩插件,等会话满了(比如 80%)再着手压缩。ACP 会基于一个增长节点触发上下文压缩,对于 100w 上下文模型这个数值是 5w token 。然后模型会收到一个注入(用户不可见),告诉模型应该压缩,如何压缩。
注意,ACP 不会让模型压缩所有内容,而是:



  1. 压缩过去一段时间增长的,现在大概率不再使用,尤其是工具调用,大量日志,冗余文件。

  2. 小范围压缩,而不是过去所有内容全部压缩。


不会压缩:



  1. 最近在使用的 5 条消息

  2. 最后 1 条用户消息。


防止模型压缩后漂移。


模型可以选择压缩还是拒绝压缩。实际测试 90%情况模型会选择压缩,10%左右会延后压缩。模型为了上下文工作质量和节省上下文会做自主出这个选择。


长久工作后,上下文大概长这个样子:


压缩块 b1 1000token 000001 ~ 000030 扫描代码,理解用户需求...
压缩块 b2 1200token 000031 ~ 000080 分析问题,定位 bug 原因...
压缩块 b3 2100token 000081 ~ 000150 问题已经修复,修复方案...
...
010000 ~ 010200 未压缩,可能使用中
010201 ~ 010400 未压缩,当前会话,使用中

压缩块具体内容我有一个冗长的约束,经过俩月调试这个约束确认给出来的质量非常高。参考How To Compress .


三级压缩


压缩块永远保留,上下文会逐级增长,虽然增长缓慢。根据经验测试,压缩消息比例:平均58:1。也就是原始消息 5w token,压缩后 900 token 左右。


这样经过长久迭代,会话达到数亿 token 后,比如 5 亿 token 后,压缩块可能也满 5w token 了。


为了防止这种泄漏,会触发t2 压缩


t2 压缩后,5w token 会降低到 5000 到 1w token 左右。


久而久之,t2 也满 5w 了,就会触发 t3 压缩。


经过测算,


stateDiagram-v2
Raw --> Tier1 : compress (约每 7 轮)
Tier1 --> Tier2 : distill (约每 250 轮)
Tier2 --> Tier3 : condense (约每 2500 轮)
Tier1 --> Raw : decompress
Tier2 --> Raw : decompress (递归)
Tier3 --> Raw : decompress (递归)
Tier1 --> GC_Truncated : GC ( 100% 上下文)

会话容量 — 一个会话从空 → T1 → T2 → T3 → 上下文极限,总共可以处理多少 token (真实校准:500 次 API 调用/天,~9.6K 新 token/调用,T1=45x/T2=10x/T3=3x ):


































上下文上限 1 个月 3 个月 到极限 极限时间
1M 19 亿 tok 105 亿 tok 689 亿 tok 第 259 天(~8.6 月)
400K 19 亿 tok 103 亿 tok 103 亿 tok 第 89 天(~3 月)
400K ( 200 调用/天) 5.6 亿 tok 25 亿 tok 95 亿 tok 第 212 天(~7 月)

Token 节省 — 无 ACP 时上下文无限增长,约 100 次 API 调用后崩溃(~0.2 天)。有 ACP 时上下文被压缩在有界范围:





















指标 无 ACP 有 ACP ( 1M 模型)
会话寿命 ~0.2 天 259 天(长 1295 倍
总 token 产出 ~5200 万 689 亿(多 1325 倍

核心价值:ACP 不是减少每次调用的 token 成本,而是让一个会话能处理 1000 倍以上的工作量


PS:当然额外带来的好处是,100w 上下文省 5 倍 token


如何找回记忆?


插件提供了两种方式恢复记忆:search_contextdecompress


模型可以搜索自己的上下文,然后找到相关的块直接解压。也可以回忆上下文,直接解压。瞬间恢复所有上下文细节。


实战测试


真实工程中的上下文情况。


在 6 个活跃工程会话( 11,000+ 次 API 调用)中,上下文 p90 稳定在 15 万–19 万( 15–19%),p95 在 16 万–21 万( 16–21%)—— 聚合缓存命中率达 91%。(注意这是平均缓存命中率,不是单会话命中率——后面对 Prompt 缓存的影响会解释,这实际上比传统压缩算法大幅度节省了 token 。)



















































































会话 时长 消息数 API 调用 累计 token 缓存命中率 上下文 p50 上下文 p90 上下文 p95
0b89319b 230h (9.5d) 3,344 2,796 3.39 亿 93% 10.8 万(11%) 16.7 万(17%) 21.0 万(21%)
0a3be0cd 130h (5.4d) 3,183 2,499 2.76 亿 91% 10.4 万(10%) 14.5 万(15%) 15.3 万(15%)
0b2cd5a7 131h (5.4d) 2,560 2,181 3.14 亿 91% 14.2 万(14%) 19.1 万(19%) 19.7 万(20%)
08f2d501 37h (1.5d) 1,985 1,888 1.96 亿 95% 10.0 万(10%) 15.6 万(16%) 16.8 万(17%)
1410c791† 865h (36d) 1,279 1,100 2.18 亿 87% 13.2 万(13%) 40.7 万(41%) 42.7 万(43%)
096cf8c4 72h (3d) 1,041 918 0.91 亿 89% 9.2 万(9%) 14.8 万(15%) 16.1 万(16%)

† Bug 测试会话,p95 异常偏高。排除该会话后,其余会话 p95 均 ≤ 21 万。


(上下文百分比均以 1M 窗口计。)


问题


1.缓存命中率如何?


实测大部分时间缓存命中率在 98%到 99%之间。


2.缓存在什么时候失效?失效比例?


在触发压缩的时候,一般失效最近 5w token,但是这 5w token 会被删除导致的失效,而不是破坏。


实际上每次调用省了这 5w token 。


3.真的能省 5 倍 token 吗?


100w 上下文场景能省 5 倍 token,省的原因是,上下文总是保持在 20w 以下,每次调用都是按照上下文 token 计费的,只要保持上下文尽可能低,就会省 token 。


4.相比一些其他插件哪个更省 token ?


ACP 更省 token,其他插件大部分原理是减少工具输入,减少模型输出等方式,这种治标不治本。


因为 ACP 直接删掉了工具输入和模型输出,治本。


5.你在多大的项目测试过?


我的项目总代码是 100w 行,我经常在这个量级跑。


PS:上下文是按需动态的,原则是需要多少用多少。


6.你这个插件适合执行大任务不适合执行小任务?


这是误区,实际上,ACP 同时适合执行大任务和小任务。只要你上下文大于 5w,用 ACP 一定是节省的,并且可以长久工作。


7.上下文保持在 10w 以下必要吗?是不是很极端?


首先说明,不是我要求必须保持上下文 10w 以下的,ACP 的原则是,按需使用 token ,大多数情况下,确实 10w 上下文足够了,这个是实测自然结果。不是强制压缩到这个范围。


8.压缩质量如何?


个人体验,压缩质量超级好(当然也取决于你的模型是否聪明)。这个你自己实践了才是最好的。


9.模型会不会失忆?


在很长的会话里面,比如连续独立工作 1 天的任务,模型基本不会失忆,这是因为 T1 压缩质量足够好,大概率还没有触发 T2 压缩。


即使触发了 T2,模型会有模糊不精确的记忆,模型可以通过解压工具找回精确记忆。


10.一个会话你一般工作几天?


一般我会按照主题搞很多会话,把一个会话当作数字员工。
一个会话我一般不关。工作数十天。目前最长会话 10 亿 token 上下文,工作了半个月。还能接单。


11.ACP 和 DCP 是什么关系?


opencode-acp 最原始的代码 fork 自opencode-dynamic-context-pruning ,经过了大量优化后,现在已经完全脱骨于 dcp 了。ACP 的压缩理念已经发生了翻天覆地变化。


虽然 ACP 目前还是用 DCP 的框架,但是实际上其核心压缩算法已经完全不同于 DCP 。ACP 已经不是 DCP 的增强版本和 bug 修复版,而是一个新的独立的上下文压缩版本。其实际效果要远远领先 DCP 。


12.其他 agent 支持 ACP 主动上下文压缩吗?


pi 也支持 pai-acp,而且效果更好。在 pi 中,上下文可以控制到 15w 以下。大部分时间上下文在 8w 以下。超级超级省 token,而且可以连续工作好多天。


放一个开发 pai 自己的会话


pai-acp 会话统计


会话 ID: 019fbb41-8c70-701f-9403-9b17c118c173
项目: pai-acp(~/projects/pai-acp)
统计时间: 2026-08-02
会话时长: 自 2026-08-01 02:57 起(约 1.8 天)


pi 统计(累计)









































指标 数值
消息总数(jsonl 行) 5,906
assistant 轮次 2,909
API 请求数 2,909
累计输入 token(求和) 327,552,040
最大单次请求 token 258,780
最小单次请求 token 0
平均单次请求 token 112,599
最近 5 次请求 token 81,983 / 82,456 / 83,376 / 83,901 / 84,696
ACP 压缩统计





























指标 数值
当前上下文用量 ~85K(约 8.5% / 1M 窗口)
活跃压缩块 53 个
块摘要总量 32.1K
原始内容总量(压缩前) 957.8K
整体压缩比 957.8K → 32.1K(~30×)
上下文构成(breakdown)

























类别 token 占比
tool 63.0K 64%
summaries 32.1K 32%
text 4.0K 4%
分层使用

















层级 token
T1(捕获) 29.9K
T2(蒸馏) 2.2K

效果小结



  • 上下文长期稳定在 ~85K(1M 窗口的 8.5%),即使累计已处理 3.27 亿 token 。

  • 53 个压缩块把 957.8K 原始内容压到 32.1K(30×),且这些是可搜索、可解压的。

  • 单次请求 token 峰值 258K,均值 112K,远低于无压缩时的线性增长(5,906 条消息无压缩会远超 1M)。

  • T2 蒸馏已开始工作(2.2K),说明多级架构正在按预期逐层精炼。


PS:我已经准备全面切 pi 了。


13.codex 和 claude 支持这个插件吗?


说实话,我也想支持,不过二者都不开放完全接管上下文的接口。所以无法支持。


其他 agents 如果你需要可以告诉我,我去看看是否支持上下文接管接口,只要支持就可以迁移过去。


14.项目地址在哪里?如何安装


https://github.com/ranxianglei/opencode-acp


opencode plugin opencode-acp@latest --global
# 或者稳定版本
opencode plugin opencode-acp@stable --global

https://github.com/ranxianglei/pai-acp


pi install npm:pai-acp

15.老用户遇到很多问题怎么解决?


建议升级最新版本,过去一个月频繁更新,基本解决了大部分问题。如果求稳定可以安装 opencode-acp@stable版本。


16.其他问题?


如果有 bug 或者问题麻烦直接到 github 上提哈,更多在 github 那边。

最新回复 (8)
  • ranxianglei 楼主 08-02 23:20
    1
    分享为啥被搞成推广了 不理解呀 。个人开发者,打字 1 个小时
  • fantasts 08-03 01:05
    2
    一直用的 cortexkit/magic-context 效果很好。不知道对比效果如何?
  • ranxianglei 楼主 08-03 02:10
    3
    @fantasts 从压缩效果和长上下文优势和省 token 来说 acp 是更好的选择。二者里面完全针锋相对。acp 认为基于当前状态下的压缩才是最好的,mc 恰恰相反,交给后台压缩。

    省 token 来说,acp 是绝对优势,acp 哲学是当前用多少上下文就多大。

    长上下文优势来说,这个我不能评判 mc ,仅 acp 来说一个窗口开数十亿 token 是没问题的,mc 我没有测过。

    记忆共享,mc 的独特之处。和 acp 完全不一样的理念,acp 相反,记忆共享会影响模型效果。

    总之,二者完全是两个极端。
  • ranxianglei 楼主 08-03 02:14
    4
    另外补充一点 推理质量 acp 更优,acp 基本上只用模型前百分之 10 的上下文,理论上模型在这个位置更聪明 。

    综合来说,除了没有记忆共享,acp 更优。
  • ranxianglei 楼主 08-03 02:27
    5
    又深入研究了 mc 机制,本质上是异步的 acp 。acp 把上下文压缩即时化,充分利用了缓存,mc 相当于复制一份流量,用另外的模型压缩。
    我理解 mc 把问题搞复杂了,即时压缩不但省 cache ,模型根据当前状态决定哪些重要,而异步搬出去压缩会丢掉这个决策信号,实际上会造成压缩质量下降。
    最终 mc 会比 acp 费 5 到 10 倍 token ,做的事情未必有 acp 好
  • ranxianglei 楼主 08-03 02:29
    6
    另外站长 V2EX 本来就没有多少高质量帖子 好不容易来一个还给移动到推广区,还要充钱。
    给 V2EX 带来高质量本身就付出了巨大成本,最后还需要自己花钱,花钱是不可能的
  • fantasts 08-03 03:44
    7
    @ranxianglei 原来如此,不过 mc 使用其他模型异步压缩,使用的是更实惠便宜的模型。我在一个会话内跑编排任务跑了大概 30 个小时,消耗了 10 亿 token 没有遇到问题。

    不过 mc 目前有个很蛋疼的设计缺陷。

    子代理也同样会被替换为 mc 的压缩机制,然后子代理返回结果给主模型是通过最后一条消息。

    出现了子代理刚输出完返回内容,然后被 mc 的 hook 消息重新唤醒开始整理上下文。然后最后一条消息可能变成了空,或者“我已完成上下文整理。”,主代理收到懵了,直接认为子代理内部异常了😅。
  • ranxianglei 楼主 08-03 09:02
    8
    @fantasts 你提到的这个问题应该是 bug 或者设计问题,可以稍微修改源码就能解决。

    另外会话消耗 token 10 亿可能和 acp 实际处理任务不在一个量级,acp 大多数情况下上下文在 10%左右 acp 10 亿 token 相对 mc 来说应该在 50 亿左右。或者反过来 mc10 亿 token 换算成 acp 大概 2 亿左右。

    实际上 mc 不管用不用异步压缩用不用便宜模型 都没有省 token 。
* 帖子来源V2EX
返回