当前位置:首页 > 技术 > 正文内容

上下文压缩机制设计:Agent长期运行中的分层记忆管理策略

访客 技术 2026年6月22日 1

上下文压缩机制设计:Agent长期运行中的分层记忆管理策略

开发智能体系统时,开发者往往优先关注模型性能和工具集完备性。但随着任务周期延长,实际运行中最先暴露的问题往往不是能力不足,而是信息过载导致的效率下降。

在agents/s06_context_compact.py模块中,设计者突破了传统token限制的思维框架,将上下文管理视为长期运行系统的记忆优化问题。这本质上是在回答一个核心命题:

智能体要持续运作,必须建立主动遗忘机制而非单纯依赖存储容量。

链接: s06_context_compact.py

核心理念解析

该实现的核心创新在于构建了三级记忆管理体系:

  • 初级清理:将早期工具输出转化为简要标记
  • 中级压缩:超过阈值时进行完整历史归档与摘要
  • 高级调控:允许模型自主触发压缩流程

用更通俗的类比理解,上下文应视为工作台而非硬盘,当工作台杂乱时,及时整理能提升后续操作效率。

长时会话中的性能瓶颈

短周期任务中,上下文主要包含用户交互和模型响应,问题不明显。但当智能体执行文件读取、命令执行、文档编辑等操作时,工具输出会快速占据大量上下文空间。

典型场景包括:

  • 大文件加载产生数千token
  • 多次命令执行累积日志
  • 多轮工具结果回写导致消息膨胀

值得注意的是,对智能体而言,上下文窗口本质是工作内存,其核心特性是动态调整有效信息的可见性。已完成任务的冗余数据若持续占用空间,反而会降低后续决策效率。

三级记忆架构详解

虽然代码表面仅增加了一个压缩函数,但实际构建了完整的三层记忆系统。关键差异在于每层处理对象和触发机制的不同:

该架构的核心价值在于避免一次性激进压缩,通过分层策略实现渐进式优化。

初级清理:工具输出的轻量化处理

micro_compact(messages)在每次模型调用前执行,专注于处理旧工具结果。关键逻辑如下:

if len(tool_results) <= MAX_RECENT_ENTRIES:
    return messages

to_clear = tool_results[:-MAX_RECENT_ENTRIES]
for _, _, result in to_clear:
    if isinstance(result.get("content"), str) and len(result["content"]) > 100:
        tool_id = result.get("tool_use_id", "")
        tool_name = tool_name_map.get(tool_id, "unknown")
        result["content"] = f"[Previously used {tool_name}]"

该设计包含三个关键考量:

  1. 优先处理工具输出而非完整对话
  2. 用工具名称占位符替代原始内容
  3. 保留最近3个完整结果

这种处理方式将原始数据转化为操作轨迹,既节省空间又保留关键上下文。

工具映射机制的价值

代码通过扫描助手消息建立tool_use_id到工具名的映射:

tool_name_map = {}
for msg in messages:
    if msg["role"] == "assistant":
        content = msg.get("content", [])
        if isinstance(content, list):
            for block in content:
                if hasattr(block, "type") and block.type == "tool_use":
                    tool_name_map[block.id] = block.name

这种映射机制使压缩内容保留可解释性,相比简单省略更有利于后续推理。

中级压缩:历史归档与摘要

当上下文达到阈值时,系统会触发auto_compact流程:

if estimate_tokens(messages) > COMPRESSION_THRESHOLD:
    print("[auto_compact triggered]")
    messages[:] = auto_compact(messages)

核心创新在于:

  1. 先将完整对话保存至transcripts目录
  2. 生成包含关键信息的摘要
  3. 保持活跃上下文轻量化

这种分层存储机制类似办公场景中的文件归档,确保重要数据持久化的同时保持工作区整洁。

摘要内容的结构化设计

摘要提示词明确要求包含:

  1. 已完成的工作
  2. 当前状态
  3. 关键决策

这种设计确保摘要能作为后续推理的可靠依据,而非简单的信息删减。

列表原地更新的重要性

代码中特别注意:

messages[:] = auto_compact(messages)

相比messages = auto_compact(messages),前者保持列表引用一致性,确保主循环的上下文同步更新。

高级调控:模型自主压缩机制

通过引入compact工具,允许模型主动触发压缩:

{
    "name": "compact",
    "description": "Trigger manual conversation compression.",
    "input_schema": {
        "type": "object",
        "properties": {
            "focus": {
                "type": "string",
                "description": "What to preserve in the summary",
            }
        },
    },
}

这种设计使智能体能根据当前状态自主决定压缩时机,形成更灵活的管理机制。

三层压缩的时序特性

从执行流程看:

  • 初级压缩发生在模型调用前
  • 中级压缩由阈值触发
  • 高级压缩由模型主动发起

这种分层策略构建了完整的记忆调度体系。

系统设计的演进逻辑

本节与前序章节形成完整闭环:

  • 前序章节解决信息注入问题
  • 本节处理信息退出机制
  • 整体形成信息流动的闭环管理

这种设计使上下文管理从简单存储演进为动态调节系统。

核心设计原则

  1. 优先处理工具输出而非整体对话
  2. 保留操作轨迹而非原始数据
  3. 压缩前建立完整归档
  4. 支持自动与手动双重压缩
  5. 摘要服务于任务连续性而非记录需求

设计哲学总结

该实现表明,真正可持续的智能体系统需要将记忆管理转化为系统机制而非临时方案。通过分层策略,既保持关键信息的持久性,又确保活跃上下文的高效性。

最终设计目标是使智能体具备:

  • 选择性保留原始数据的能力
  • 结构化信息的持久化能力
  • 历史数据的归档管理能力

这种设计使智能体能像人类一样,在持续工作中保持信息处理的效率与准确性。

致谢

本设计思路受益于shareAI-lab/learn-claude-code项目的研究成果

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。