会话上下文压缩
上下文压缩只针对当前这一会话:把早先轮次压成摘要,让后面模型调用时带的活跃窗口小一点。
这和改记忆库里存的长记忆不是一码事。要动存储条目,看 长期记忆。
现在默认就开着,零配置
新建的机器人自动压缩默认启用,阈值、比例、摘要模型一个都不用配——Memoh 全按聊天模型的 context_window 比例来:
- 会话可压缩历史超过窗口约 50%:本轮结束后后台压。
- 后台没追上、涨过约 75%:下一轮发送前同步压。
- 两条路都把原始历史压回窗口约 40%。
唯一的真前提:聊天模型必须在模型设置里声明 context_window。没有它,自动策略没有预算基准,永远不会触发。见 提供方与模型。
默认值变更之前建的机器人保留原有设置、按原语义跑(见下面的 legacy 模式)。
配置项
要调也还是可以调:
| 字段 | 说明 |
|---|---|
| Compaction Enabled | 默认开。关掉即禁用本机器人的自动压缩。 |
| Compaction Threshold | 输入 token 阈值。0(默认)= 上面的自动比例策略;大于 0 切到 legacy 绝对阈值模式。 |
| Compaction Ratio | 压多狠。只在 legacy 模式下生效——阈值为 0 时这个字段直接隐藏。 |
| Compaction Model | 可选的专用摘要模型。默认继承聊天模型;设过 override 也可以清回 Use chat model (default)。 |
摘要模型怎么选
启用的 chat 模型基本都行,唯一限制:provider 必须尊重输出 token 上限。OpenAI Codex 系模型当不了摘要模型——下拉框里直接筛掉了。
要注意的场景:机器人主聊天模型本身就是 Codex 时,自动压缩因为没有可继承的合法模型会静默不跑。这种情况显式配一个 Compaction Model。
立刻压
两路:
状态区
- 打开当前对话。
- 打开会话状态区。
- 点 Compact Now。
上面也有上下文占用、缓存、技能等,方便你判断要不要现在压。
斜杠命令
/compact或
/compact run手动压缩会尽量全量压(不止压到自动目标线),并且绕过自动压缩失败后的短冷却。
压缩保真度
摘要器现在按类型化的会话记录工作,几个对质量有实际影响的行为:
- 工具调用和结果永不拆开——一次 tool 交互要么整体留在原始历史、要么整体进摘要。
- 媒体降级为
[image]/[file]标记,不塞原始数据。 - 空的、被截断的、压完不比原文小的摘要直接拒收,不会存成结果。
- 跨多个 workspace 的会话里,摘要保留"哪段话在哪台机器上发生"的信息。
普通 chat、discuss、pipeline 类对话现在都会压。
记录
机器人详情 Compaction tab 可看各次:成功/失败、摘要或预览、涉多少条消息、起止时间、若有的模型与用量。用来确认自动有没有在跑、失败原因等。
常见失败原因
跑不了时报 compaction.model_unavailable 并带具体原因:摘要模型未配置、不是 chat 模型、被禁用、provider 被禁用、provider 不支持输出上限(Codex)、模型没有已知 context window。/compact 在聊天里报同样的状态。
和 context_window
Memoh 拿当前 chat 模型的 context_window 对照本会话,网页状态区、/status 都能看到离上限多近。注意 token 是粗估(约 4 字符/token),百分比当参考就好,别当精确值。
和「记忆压缩」的区别
| 作用范围 | 怎么触发 | 结果 | |
|---|---|---|---|
| 上下文压缩 | 当前活跃会话 | 自动 / 状态区 / /compact | 本会话里较早内容变摘要,方便后面几轮继续聊 |
| 记忆压缩 | 长期记忆提供方 | Memory tab | 改库里记忆条目,不是单会话 prompt |
一路聊太长了 → 上下文压缩。
存下来的记忆又脏又重 → 去 Memory 里做那类维护。