跳转到主要内容
每个模型都有上下文窗口,长任务迟早会把它撑满:一整天的代码审阅、一串排队的任务、要走几百步的一次迁移。想继续做下去,agent 就得一次又一次地压缩前面的对话。这一页讲 Vibey 是怎么做的,以及为什么这样设计。效果如何,见记忆评测。

问题在哪

常见的做法是每次都让模型把到目前为止的一切重新写成一份摘要。每次重写丢一点,重写多了,损失就累积起来:
  • 长期目标逐渐变淡。 每次重写都要重新判断什么还重要。开头定下、最近没再提的目标,先是越写越短,然后就消失了。
  • 子任务被当成”目标”。 摘要抓住的是最近发生的事。眼前这个子任务一做完,摘要就写”任务已完成”,而它所属的那件大事其实还有好几项没做。
  • 你的话被转述走样。 你提的约束先被转述一遍,转述又被再转述。限制变松,授权被放大或丢掉;后台消息里一句”用户要求……”,也可能被当成你说的话。
一个典型的例子:你让 agent 把一串 PR 从旧到新挨个处理,只有需要你拍板时才来找你。压缩几轮之后,重写出来的摘要只记得眼前正在审的那个 PR,却忘了整个队列、处理到了哪里,也忘了你说过什么时候才来打扰你。

心智、备忘和现场

Vibey 的压缩叫作检查点(checkpoint)。它是整理,不是记账:就像人在睡眠中整理一天的经历,Vibey 回顾做过的事,逐层修订自己的理解,放下细节。原始对话一直保存着,放下的细节需要时可以查回来。 一个检查点分三部分,各有各的变法:

心智

心智分四段,越往前越稳定:
  1. 我在这里: 这件事为谁做、为什么做,Vibey 对什么负责、边界在哪,以及和你的约定:怎么汇报、什么时候问、什么可以自己决定、授权到什么范围。
  2. 目标: 使命(Mission),用 Vibey 自己的话写这段对话的最终目的;以及为使命服务的各条工作线(Workstreams),每条写明状态,有队列的写明处理到哪、下一个是什么。
  3. 关键决策, 每条附上理由。
  4. 经验, 写成以后也用得上的原则。
每次压缩时,Vibey 回顾上一个检查点之后发生的事,用 edit 修订心智:只改有变化的地方,其余保持原样。这个文件只能修改,不能整个覆盖。记忆会不断收拢:做完的工作线收成一行,反复出现的经验合并成一条原则,被推翻的决策并进取代它的那条。如果 Vibey 对某一层的理解从根上变了,比如意识到你真正要的和它原来以为的不一样,它就重写那一段。 使命是锚。使命条目永远不会被删除:做完了、被你撤回或被替换时,就在条目本身标注状态。Avibe 会检查这一点:使命条目比之前少的心智会被拒绝。只有你明确改变时,使命才会变。眼下这一步做完,下一步回到它所属的工作线;工作线做完,回到使命,或者来问你。 每段都有篇幅上限:我在这里 1,000 token,目标 2,000,关键决策 1,500,经验 1,500。上下文窗口在 192,000 token 及以上的模型按这个上限,更小的窗口按比例缩小。

备忘

检查点要移出上下文的每一条你本人发的消息,都会成为候选。Vibey 看到的是一张清单:每行一条消息,带复选框、编号和一小段预览。它要做的只有勾选:
  • 带上定方向或改方向、提出约束或禁令、表达偏好、给出授权的消息。
  • 放下已被撤回、取代或已经完成的旧条目,或者含义已完整写进心智的条目。
  • 不勾只用于推进工作的指令(比如”继续”),以及单独看不懂的简短答复。
除了复选框,Avibe 不接受任何改动。随后它按勾选结果,从记录里把每条消息的原文复制进检查点。模型从不重新抄写你的话,所以它们不会走样。每条消息最多保留 300 token,更长的会被截短,并注明全文是第几条消息。勾选的消息合计最多 3,000 token;窗口小于 192,000 token 的模型按比例缩小。 没被勾选的消息下次不会再列出,但它仍以原编号留在记录里。

现场

现场是工作状态,每个检查点都重新写:
  • 眼下这一步,以及它属于哪条工作线
  • 进展:已完成、进行中、阻塞或待决
  • 在等什么:后台命令、Watch、定时任务、委派出去的运行、在等你回答的问题,附上 id
  • 下一步:紧扣你最近的明确请求,引用你的原话
  • 踩过的坑:犯过的错、被证伪的假设、走不通的路,附上错误原文
  • 精确引用:继续工作所需的路径、id、命令、链接和数值

一次检查点怎么走

当下一次请求将超过模型上下文窗口的约 90% 时,检查点开始。如果给回复预留的空间和安全余量需要更多位置,或者模型在某个上下文长度以上单价变高,检查点会更早开始。 首先,Avibe 往会话的临时目录里写两个文件:上一份心智(第一次是空模板)和备忘清单。接着,检查点回合暂停手头的工作,在同一个模型上、基于当前的对话进行。Vibey 可以读文件,但只能修改这两个文件,最多五轮工具调用。请求会告诉 Vibey:这条请求来自 Avibe,不是你,不能被记成你说的话。 检查点之后,每次请求带着:
  1. 系统提示词,每个回合重新生成:Vibey 的身份、规则、Skill 目录,以及你的 AGENTS.md 文件。检查点从不压缩它。
  2. 检查点,以 Vibey 自己的回忆的口吻呈现,而不是新的指令。其中你的原话和约定仍然有效。
  3. 最近的消息,原样保留,最多 20,000 token。在小模型上,上限是检查点阈值的四分之一。
如果检查点落在正在进行的回合中间,你在这个回合里发的消息保持原样。检查点会写明它们就是当前的请求,两者不一致时以你的消息为准。

谁说的话

并不是每条输入都来自你。Watch、定时任务、回调和其他 Agent 会话,也会往会话里发消息。每条不是人发的输入,开头都有一行来源标记,比如:
这一行由 Avibe 根据输入的投递方式写入,从不依据消息文字,所以一条写着”用户要求……”的后台消息,读起来仍是后台消息。如果你发的消息本身以 [Harness: 开头,Avibe 会在前面加上你的名字,所以这个标记无法伪造。来源标记对所有 Agent 后端生效,不只是 Vibey。 检查点两处都用到了它。压缩指令告诉 Vibey:只有你本人发的消息才是你的话。备忘更进一步:它的候选按记录里的消息类型来取,所以 Watch、定时任务、回调或其他会话的消息,不管写了什么,都不可能进入备忘。

检查点还带着什么

  • 按最近使用放回的 Skill。 加载过的内容即将离开上下文的 Skill,会按它现在的版本放回来。最近加载的排在前面,每个最多 5,000 token;合计不超过 25,000 token 和模型窗口十分之一中较小的那个,最多 20 个。放回不算重新加载,所以一直没再加载的 Skill 会逐渐被淘汰。被截短的 Skill 会注明怎样用 vibe skill load 加载全文。
  • 一份简短的文件清单。 只列路径:最近修改过的 10 个文件、最近读过的 5 个,更早的被挤出时会注明。重要的文件会写进现场的精确引用里。
  • 完整记录在哪。 较早的消息,也就是各条输入和 Vibey 的回复,保存在 Avibe 的数据库里。检查点会告诉 Vibey 它们在哪,以及怎样按时间顺序查你本人的消息。备忘条目的编号就指向那条消息。工具输出不保存在那里;需要时,Vibey 会重新运行工具。
你也可以自己查同一份记录:

校验与兜底

每个检查点在使用前都要经过 Avibe 的校验:
  • 现场: 恰好一个检查点块,且达到最低长度。
  • 心智: 每个标题都完整、顺序不变,使命条目不比之前少,每段都在上限以内。
  • 备忘: 除了复选框什么都没改,勾选的消息在预算以内。
Avibe 会发一次修复请求,把发现的问题一次列全。修复之后仍不合格的,按兜底规则处理,宁可多留,不少留: 检查点失败不会改动任何东西:还放得下的请求照常发出,后面的请求会再试。如果对话大到放不进一个检查点回合,Vibey 会改为只对较早的一部分(最多约一半)做检查点,最多尝试两次。请求已经放不下、又做不成检查点时,Vibey 会不调用模型,直接把最早的约一半移出去。放得下的话,这一步会保留上一个检查点:它的心智、现场和 Skill,以及一份带上所有被移出的、你本人发的消息的备忘。同一次运行里有两次检查点失败或腾出的空间太少之后,这次运行不再做检查点,只靠这一步腾出空间。如果单是最新的工具输出就放不下,它会被截短,并注明这一点。

你会看到什么

什么都不会打断你。没有提示,也没有 /compact:Vibey 在回合中间做完检查点,接着做同一件事。这个回合会稍慢一点,因为检查点要向同一个模型多发几次请求,和其他请求一样消耗 token。检查点失败也是静默的,原因记在 Avibe 的日志里。 只有在已经没有东西可以移出时,你才会听到和上下文有关的消息。这时 Vibey 会停下,并说明是什么太大,比如:本次对话已经太长,无法可靠地继续。请发送 /new 开始一个新会话。

限制

  • 压缩不等于完整。 不在心智、备忘、现场或最近消息里的内容,就不在上下文里了。Vibey 需要到记录里去查;想再看某个工具的输出,要重新运行它。
  • 心智和现场由模型来写。 检查点的质量取决于写它的模型,不同模型的结果有差别,见评测。
  • 预算有上限。 很长的消息在备忘里会被截短,用编号指向全文。窗口小于 192,000 token 的模型,心智和备忘的预算按比例缩小。
  • 只属于一个会话。 检查点是它所在会话的记忆。
  • 只用于 Vibey。 Claude Code、Codex、OpenCode 在 Avibe 里照原样运行,用它们自己的方式压缩上下文。后台输入的来源标记对它们同样生效。