在日常使用 OpenCode 进行开发时,你可能会遇到这样一个场景:聊着聊着,AI 突然"忘记"了之前说过的话,或者给出的建议开始偏离最初的需求。这不是 AI 出了 bug,而是上下文窗口已经满了。
OpenCode 提供了 /compact 命令来解决这个问题。本文将深入讲解 OpenCode 的上下文管理机制,以及如何利用 /compact 保持长时间对话的连贯性。
每次你和 OpenCode 对话时,模型会把你输入的所有消息、OpenCode 执行过的工具调用、读取过的文件内容、以及它自己的回复,一起打包发送给 LLM。这个"打包"的容量上限就是上下文窗口(Context Window)。
不同模型的上下文窗口各不相同:
| 模型 | 上下文窗口 |
|------|-----------|
| Claude 4.5 Sonnet | 200K tokens |
| GPT-5 | 128K~256K tokens |
| Gemini 2.5 Pro | 1M tokens |
| DeepSeek V3 | 128K tokens |
Token 不等于字数。简单估算:1 个中文字约等于 1.5~2 个 token,一段 100 行的代码文件可能消耗数千 token。这意味着,在一个复杂任务的对话中,上下文窗口很容易被快速消耗。
当上下文接近上限时,LLM 提供商通常会采取以下策略之一:
截断早期消息:直接丢弃对话开头的内容,导致 AI "失忆"
返回错误:API 直接拒绝请求
OpenCode 的主动管理:在达到阈值前提示用户执行 /compact
无论哪种情况,都会影响 AI 的回答质量。最典型的表现是:AI 开始重复提问、忽略你之前的指令、或者给出与前半段对话矛盾的方案。
/compact 是 OpenCode 内置的上下文管理命令。它的核心思路是:用一次摘要替换掉整个对话历史。
执行 /compact 时,OpenCode 会做以下几件事:
生成对话摘要:将当前会话中的所有关键信息——你的需求、已完成的修改、待处理的问题、重要的文件引用——浓缩成一段结构化的摘要
重置对话历史:清空旧的完整消息记录
注入摘要:将摘要作为新的对话起点,让后续对话继续基于之前的上下文
关键点在于:/compact 不会丢失信息。它只是将冗长的原始对话换成了精炼的摘要,模型依然知道你做过什么、接下来要做什么。
以下场景强烈建议使用 /compact:
当你和 OpenCode 来回对话超过 30 轮时,上下文通常已经积累了大量内容。此时执行一次 compact,可以让后续对话更加流畅。
如果你在对话中让 OpenCode 读取了几十个文件、执行了一系列复杂的 bash 命令,这些操作的完整记录会占据大量空间。compact 后可以腾出空间进行新一轮密集操作。
你完成了功能 A,准备开始功能 B。虽然主题不同,但项目背景是相通的。compact 会保留关键项目信息,同时释放空间用于新任务的细节。
OpenCode 在上下文接近上限时会主动提示。不要忽视这个警告,立即执行 /compact 可以避免信息丢失。
在 OpenCode 终端界面中,直接输入 /compact 即可手动执行:
/compact
OpenCode 也支持自动 compact,你可以在 opencode.json 中配置阈值:
{
"context": {
"auto_compact_threshold": 0.8,
"auto_compact_trigger": "比例",
}
}
auto_compact_threshold:上下文占用比例达到多少时触发,0.8 表示 80%auto_compact_trigger:默认在上下文利用率达到阈值时自动执行 compact启用自动 compact 后,你不需要手动关注上下文占用,OpenCode 会在合适的时机自动压缩。
除了 /compact,多会话(Multi-session)也是管理上下文的利器。
如果你同时有多个独立任务,与其在一个会话中来回切换话题,不如创建多个并行会话:
# 新建第二个会话,右上角按 Ctrl+N # 或者使用 opencode run 启动独立任务 opencode run "检查并修复 src/api/auth.ts 中的所有类型错误" opencode run "为 src/utils/validator.ts 编写单元测试"
每个会话拥有独立的上下文,互不干扰。这样既避免了上下文混乱,又提升了并行处理能力。
对于大型项目,以下策略可以帮你更好地管理上下文:
不要在 prompt 中泛泛而谈,使用 @ 精确指定需要关注的文件:
@src/services/order.ts @src/types/order.d.ts 请分析 OrderService 的支付流程,找出可能的并发问题。
精确引用能避免 OpenCode 为了理解你的需求而去盲目读取大量无关文件。
将项目的关键背景信息写入 AGENTS.md(执行 /init 可自动生成),OpenCode 在每次对话启动时会自动加载这些信息,无需在对话中反复交代。
不要试图在一个对话中完成整个功能。将任务拆分为多个阶段,每个阶段结束执行一次 compact,保留关键进展后进入下一阶段。
# 阶段 1:分析现有代码,输出重构方案 分析 @src/legacy/ 目录下的代码,给出重构建议 # compact 后进入阶段 2 /compact # 阶段 2:根据方案执行重构 按照之前的重构方案,开始重构 @src/legacy/user_manager.ts
在 Plan 模式下,OpenCode 不会修改文件,只做分析和规划。这能减少大量工具调用的记录,节省上下文空间。确认方案可行后,再切回 Build 模式执行。
按 Tab 键即可在 Plan 和 Build 模式之间切换。
compact 之后,OpenCode 的首条回复会基于摘要给出当前状态确认。你可以用以下 prompt 快速验证:
请总结一下你当前已知的项目信息和待办事项。
如果发现摘要遗漏了关键信息,直接在对话中补充即可:
补充一下:之前我们还确定了 API 接口使用 RESTful 风格,响应格式统一为 { "code": 0, "data": ..., "msg": "" }。
AI 并没有忘记——它拥有浓缩后的摘要。只是丢失了原始对话中的细节描述。如果那些细节在后续工作中不再需要,compact 就达到了目的。
如果对话刚开始就 compact,摘要信息量太少,反而浪费一次上下文重建的机会。建议在上下文占用达到 60%~80% 时进行。
compact 无法解决"单次请求内容过多"的问题。如果你一次性贴了 10 万字的代码让 AI 分析,compact 也无能为力。控制每次输入的信息量才是根本。
/compact 是 OpenCode 中一个不起眼但至关重要的命令。掌握它的使用时机和策略,可以让你在长时间开发会话中始终保持高效的协作体验。
核心要点回顾:
/compact 用摘要替换完整对话历史,释放上下文空间auto_compact_threshold 可以实现自动化管理下一次当你发现 AI 开始"健忘"时,不妨键入 /compact——你会发现,对话质量和效率都会明显回升。