本页目录
Context EngineeringNote 20

04 Context compression:自动压缩与手动 compact

它是什么

它是什么

Context compression 是 Deep Agents 控制长任务上下文膨胀的内置机制。大工具输入或输出会被 offload 到虚拟文件系统,消息历史逼近上下文限制时会触发 summarization。需要主动清理上下文时,可以额外给 Agent 加 compact_conversation 工具。

最小代码

文件:deepagent_src/context_engineering_teach/04_context_compression.py

model = get_real_model()
compaction_middleware = create_summarization_tool_middleware(model, StateBackend)
agent = create_deep_agent(model=model, middleware=[compaction_middleware])

运行

uv run python deepagent_src/context_engineering_teach/04_context_compression.py

预期输出:

context compression real agent ok

验证方式

脚本断言 middleware 暴露了 compact_conversation 工具,并真实调用一次 Agent。自动 offloading 和阈值 summarization 需要真实长对话才会触发,所以这里不伪造大上下文。

常见误区

别以为加了手动 compact 就关闭了自动压缩。Deep Agents 默认仍会在上下文接近限制时自动总结。

相关资源

  • 查看示例代码:deepagent_src/context_engineering_teach/04_context_compression.py
    from __future__ import annotations
    
    from deepagents import create_deep_agent
    from deepagents.backends import StateBackend
    from deepagents.middleware.summarization import create_summarization_tool_middleware
    
    from _model import get_real_model
    from deepagent_src.agent_output import invoke_and_pretty_print
    
    
    def main() -> None:
        model = get_real_model()
        compaction_middleware = create_summarization_tool_middleware(model, StateBackend)
        agent = create_deep_agent(model=model, middleware=[compaction_middleware])
    
        tool_names = [tool.name for tool in compaction_middleware.tools]
        result = invoke_and_pretty_print(
            agent,
            {
                "messages": [
                    {
                        "role": "user",
                        "content": "用一句中文回答:compact_conversation 工具什么时候适合使用?",
                    }
                ]
            }
        )
    
        assert agent is not None
        assert "compact_conversation" in tool_names
        assert result["messages"][-1].content
        print("context compression real agent ok")
    
    
    if __name__ == "__main__":
        main()