-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Open
Description
问题背景
在 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] 占位符替换为内存索引(或磁盘索引),模拟"卸载到文件"的过程?
具体思路:
-
microcompact 阶段:将大 tool_result 的原始内容保存到索引(内存 dict 或磁盘文件),用带索引 ID 的占位符替换:
# 替代当前的直接覆盖 ref_id = self._store_content(block["content"]) # 保存到索引 block["content"] = f"[Content offloaded: ref={ref_id}]" # 带索引的占位符
-
auto_compact 阶段:在调用
_messages_to_text生成摘要输入前,根据索引读取原始内容,让摘要模型能看到完整信息:# auto_compact 中,摘要前还原 restored_messages = self._restore_from_index(messages) conversation_text = self._messages_to_text(restored_messages)
-
摘要完成后:索引中的内容可以安全清除,因为摘要已经包含了关键信息。
好处
- microcompact 独立生效时(未触发 auto_compact):模型上下文中只有占位符,节省 token,与当前行为一致
- auto_compact 触发时:能基于完整信息生成高质量摘要,不会因为 microcompact 的清理而丢失关键数据
- 更贴近 Claude Code 的实际行为:Claude Code 的压缩策略是分层的,先清理工具输出、再做摘要,但摘要时应该是基于完整历史而非已经被清理过的内容
- 教学价值更高:可以展示"内容卸载 + 按需加载"这一工程模式
当前行为 vs 建议行为
| 场景 | 当前行为 | 建议行为 |
|---|---|---|
| 仅 microcompact | 占位符替换,节省 token | 索引占位符替换,节省 token(一致) |
| microcompact + auto_compact | 摘要基于占位符,丢失信息 | 摘要前还原原始内容,信息完整 |
| save_transcript | 保存的是带占位符的版本 | 可选择保存完整版本 |
想确认一下这是否符合作者的设计意图,以及是否值得在教学版本中展示这种"卸载-索引-按需加载"的模式?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels