Skip to content

Suggestion: microcompact 应使用内存索引而非直接丢弃,以便 auto_compact 时能还原原始内容 #27

@BaqiF2

Description

@BaqiF2

问题背景

agents/v5_compression_agent.py 中,microcompact(L134-L172)和 auto_compact(L179-L220)的执行顺序会导致信息丢失:

# L799-L802 主循环
messages = CTX.microcompact(messages)        # 先清理旧 tool_result
if CTX.should_compact(messages):
    messages = CTX.auto_compact(messages)     # 再做摘要压缩

问题: microcompact 在 L170 直接原地覆盖了 tool_result 内容:

block["content"] = "[Old tool result content cleared]"  # L170 - 原始内容直接丢失

当随后触发 auto_compact 时,_messages_to_text(L197)读到的是占位符而非原始内容,导致摘要模型看不到这些工具输出的真实信息,生成的摘要质量会因此降低

建议

是否可以考虑将 [Old tool result content cleared] 占位符替换为内存索引(或磁盘索引),模拟"卸载到文件"的过程?

具体思路:

  1. microcompact 阶段:将大 tool_result 的原始内容保存到索引(内存 dict 或磁盘文件),用带索引 ID 的占位符替换:

    # 替代当前的直接覆盖
    ref_id = self._store_content(block["content"])  # 保存到索引
    block["content"] = f"[Content offloaded: ref={ref_id}]"  # 带索引的占位符
  2. auto_compact 阶段:在调用 _messages_to_text 生成摘要输入前,根据索引读取原始内容,让摘要模型能看到完整信息:

    # auto_compact 中,摘要前还原
    restored_messages = self._restore_from_index(messages)
    conversation_text = self._messages_to_text(restored_messages)
  3. 摘要完成后:索引中的内容可以安全清除,因为摘要已经包含了关键信息。

好处

  • microcompact 独立生效时(未触发 auto_compact):模型上下文中只有占位符,节省 token,与当前行为一致
  • auto_compact 触发时:能基于完整信息生成高质量摘要,不会因为 microcompact 的清理而丢失关键数据
  • 更贴近 Claude Code 的实际行为:Claude Code 的压缩策略是分层的,先清理工具输出、再做摘要,但摘要时应该是基于完整历史而非已经被清理过的内容
  • 教学价值更高:可以展示"内容卸载 + 按需加载"这一工程模式

当前行为 vs 建议行为

场景 当前行为 建议行为
仅 microcompact 占位符替换,节省 token 索引占位符替换,节省 token(一致)
microcompact + auto_compact 摘要基于占位符,丢失信息 摘要前还原原始内容,信息完整
save_transcript 保存的是带占位符的版本 可选择保存完整版本

想确认一下这是否符合作者的设计意图,以及是否值得在教学版本中展示这种"卸载-索引-按需加载"的模式?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions