第51课 · 让 AI 自动管理上下文:ACP 插件
你用 OpenCode 写过 Skill、做过系统、搞过工具,有没有发现一个问题——聊着聊着,AI 就开始「犯糊涂」了?
这不是 AI 变笨了,而是它的「记忆盒子」塞满了。这节课介绍的 ACP 插件,就是来解决这个问题的。
本节要点
- 上下文为什么会出问题:对话越长,上下文越大,带来费钱和犯糊涂两个毛病
- DCP 插件的局限:之前用的 DCP 是固定阈值压缩,太生硬
- ACP 插件是什么:在 DCP 基础上修复了 39 个 bug,让 AI 自己智能判断什么时候压缩
- 怎么安装:一行命令装好,或直接把网址发给 AI 让它帮你装
- 什么时候该装、什么时候别装:长时间复杂任务才需要,随便问两句话别装
1. 上下文是个什么东西?
1.1 一句话理解上下文
你跟 AI 每说一句话,AI 都得把之前的对话全部重新读一遍才能回复你。这些「全部对话」就是上下文。
打个比方:AI 就像一个只有短期记忆的助手,你每问一个问题,他都要把你之前说的所有话从头到尾再看一遍,才能回答。
1.2 上下文满了会怎样?
OpenCode 默认的行为是:等上下文用到 80%~90%,甚至满了(100%)的时候,才自动做一次压缩。
这会带来两个问题:
第一个:费钱。 你每发一条指令,AI 都要带着前面那么长的上下文一起处理。上下文越长,消耗的 token 越多,花的钱也越多。每一次 API 调用都在为那些已经没用的旧对话买单。
第二个:AI 犯糊涂。 上下文太长之后,尤其是你用的模型不是特别强的时候,AI 的指令遵循性会变差——你说东它往西,开始胡言乱语,丢三落四。
2. 之前的方案:DCP 插件
2.1 DCP 是什么
DCP(Dynamic Context Pruning,动态上下文修剪)是一个 OpenCode 插件,它的原理很简单:
设定一个固定的阈值,比如 50% 或 60%,上下文一达到这个值,立刻压缩。
它确实能解决问题,但太生硬了——不管三七二十一,到了线就压。
2.2 DCP 的两个问题
- 太死板:固定阈值,不管当前对话的实际需要,一刀切压缩
- 作者跑路了:DCP 的原作者已经去做其他项目了,更新不再频繁,积累的 bug 没人修
DCP 项目地址(供参考):https://github.com/Opencode-DCP/opencode-dynamic-context-pruning
3. ACP 插件:让 AI 自己决定
3.1 ACP 是什么
ACP(Active Context Pruning,主动上下文修剪)是在 DCP 的基础上,由另一位开发者复刻(fork)并持续维护的插件。
它跟 DCP 最大的区别是:
不是死板地到了某个值就压缩,而是让大模型自己判断——什么时候该压缩、压缩哪些内容。
ACP 项目地址:https://github.com/ranxianglei/opencode-acp
3.2 为什么换 ACP
| 对比项 | DCP | ACP |
|---|---|---|
| 压缩策略 | 固定阈值,一刀切 | AI 智能判断,灵活压缩 |
| 维护状态 | 作者已转做其他项目,更新停滞 | 更新频繁,持续修复 |
| Bug 修复 | 累积 bug 无人修 | 在 DCP 基础上修复了 39 个 bug |
| 缓存命中率 | 较低 | 约 91%,更省钱 |
3.3 ACP 修复了 DCP 的哪些问题
ACP 在 DCP v3.1.11 的基础上,修复了 39 个 bug,其中包括多个严重(CRITICAL)级别的问题:
- 重启后状态丢失——压缩记录、消息映射全部清零
- 压缩时悄悄丢失摘要内容(数据丢失)
- 上下文使用量计算错误,导致压缩提示永远不触发
- 压缩后的消息在
/compact后又冒出来(上下文泄漏) - 日志和分词器每轮延迟 20~50 秒(268 倍减速)
- ……
完整 bug 列表可以看 ACP 的 GitHub Issues。
3.4 ACP 的实际效果
根据 ACP 项目的真实数据(6 个活跃工程会话,11000+ 次 API 调用):
- 上下文使用量:p90 稳定在 150K~190K(1M 窗口的 15%~19%),大部分时间保持在 10%~15%
- 缓存命中率:约 91%
- 超长会话支持:单个会话可达 3300+ 条消息、累计 3 亿+ token
简单说:省钱、不丢关键信息、支持超长对话。
4. 安装 ACP
4.1 方法一:一行命令安装(推荐)
打开终端,运行这一行命令:
opencode plugin opencode-acp@latest --global装完重启 OpenCode 就行。
4.2 方法二:写进配置文件
打开你的 OpenCode 配置文件(opencode.json),加上这段:
{
"plugin": {
"opencode-acp": "latest"
}
}保存后重启 OpenCode。
4.3 方法三:让 AI 帮你装
你甚至可以直接把 ACP 的项目地址发给 OpenCode 里的 AI,跟它说:
AI 会自动帮你完成安装。
4.4 ⚠️ 重要:关闭 OpenCode 自带的自动压缩
ACP 会自己管理上下文压缩,如果 OpenCode 自带的自动压缩还开着,两个会打架,导致压缩后的消息又被展开、压缩状态丢失。
在你的 opencode.json 里加上:
{
"compaction": {
"auto": false
}
}或者设置环境变量:
export OPENCODE_DISABLE_AUTOCOMPACT=14.5 从 DCP 迁移到 ACP
如果你之前装了 DCP,迁移很简单,三步搞定:
- 删掉旧的 DCP 插件——从
opencode.json里移除 DCP 的配置 - 安装 ACP——按上面的方法安装
- 重启 OpenCode
ACP 会自动迁移 DCP 的数据:
- 会话状态(压缩记录、消息映射)自动从
plugin/dcp/迁移到plugin/acp/ - 配置文件
dcp.jsonc自动迁移为acp.jsonc - 斜杠命令从
/dcp变成/acp(/dcp仍然兼容,两个都能用)
5. 用起来:什么都不用做
装好 ACP 之后,你什么都不用干,正常对话就行。
ACP 会在后台默默工作。当上下文增长到一定比例(默认上限 55%),它就会让 AI 智能判断,把那些已经没用的内容压缩掉——比如:
- 已经用完的搜索结果、联网调研的冗长输出
- 走错方向后的无效探索
- 重复读取同一个文件的结果
- 已完成任务的中间步骤
- 已经做出决定的讨论过程
你只会看到上下文百分比自动下降,比如从 57% 掉回 46%,完全无感。
6. ACP 的常用命令
ACP 提供了一个 /acp 斜杠命令(也兼容 /dcp):
| 命令 | 作用 |
|---|---|
/acp | 显示所有可用的 ACP 命令 |
/acp context | 查看上下文 token 分类统计(系统/用户/工具等各占多少) |
/acp stats | 查看跨会话的累计压缩统计 |
/acp compress | 手动触发一次压缩 |
/acp decompress <编号> | 恢复某个被压缩的内容块 |
/acp manual on | 开启手动模式(AI 不再自动压缩,只在你手动触发时才压缩) |
日常使用基本用不到这些命令,ACP 全自动运行。需要手动控制时才用。
7. 配置说明(可选)
ACP 的配置文件在 ~/.config/opencode/acp.jsonc,第一次运行时自动创建。
大部分情况下默认配置就够用,不用改。如果你用的模型上下文窗口比较小(比如 GitHub Copilot 模型或本地模型),可以调低压缩阈值:
{
"compress": {
"maxContextLimit": "40%", // 上下文超过 40% 时开始强烈建议压缩
"minContextLimit": "30%" // 上下文低于 30% 时不提醒压缩
}
}完整配置项可以查看 ACP 项目的 README 文档。
8. 什么时候该装、什么时候别装
✅ 适合装的场景
- 长时间复杂任务:开发一个系统、做一个完整的项目,在同一个会话里持续工作很久
- 写 Skill / 做工具:涉及大量探索、试错、调试,上下文增长很快
- 深度调研:让 AI 联网搜索、阅读大量文档,产生大量中间内容
❌ 不该装的场景
- 只是随便问两三个问题:对话很快就结束了,上下文根本不会涨到需要压缩的程度
- 简单的一问一答:装了反而多此一举
核心原则:只要有压缩,就会有细节损失。ACP 压缩的都是基本无用的内容(走错方向的探索、重复的搜索结果等),但如果你的对话本来就不长,完全不需要压缩,装了反而是浪费。
9. 其他 AI 工具也能用
ACP / DCP 这类上下文管理插件,不局限于 OpenCode。
如果你用的是 Claude Code、Codex 等其他 AI 编程工具,同样可以找类似插件。比如:
- Context Mode
- Better Compact
你可以让 AI 帮你搜索适合你工具的上下文管理插件。
小结
| 要点 | 说明 |
|---|---|
| 问题 | 上下文太长 = 费钱 + AI 犯糊涂 |
| ACP 方案 | 让 AI 自己判断什么时候压缩、压缩什么 |
| 安装 | opencode plugin opencode-acp@latest --global,一行搞定 |
| 关键操作 | 装完记得关闭 OpenCode 自带的自动压缩 |
| 使用 | 装好就行,全自动,无需任何操作 |
| 适合谁 | 长时间复杂任务的人;随便聊两句的不用装 |
ACP 项目地址:https://github.com/ranxianglei/opencode-acp
DCP 项目地址(旧):https://github.com/Opencode-DCP/opencode-dynamic-context-pruning