资讯动态

Axl上下文压缩原理解析:如何总结超长会话又不破坏工具调用组的完整性

发布时间:2026/10/13 22:43:04 来源:尧图企业网站定制
【免费下载链接】Axl项目地址https://gitcode.com/gh_mirrors/axl/Axl点击查看免费下载Axl 是一款面向开发者的开源 AI 编码助手终端 Web 双端其**上下文压缩Context Compaction**机制专门解决超长会话撑爆模型上下文窗口的问题在保留完整会话日志的前提下把较早的对话历史总结成一份续写摘要并保证工具调用与工具结果的配对组永不被拆散。本文带你完整理解 Axl 上下文压缩的触发时机、切分规则与可靠性设计。一、为什么 AI 助手离不开上下文压缩AI 助手每发出一轮请求都要把系统提示 历史对话 工具声明全部塞进模型的上下文窗口。当你在 Axl 里连续调试、反复读写文件历史消息会快速逼近模型窗口上限。此时有两种选择❌ 粗暴截断直接丢弃旧消息。如果恰好丢掉模型发起工具调用而留下工具执行结果大多数模型 API 会直接报错对话从此无法继续。✅ 智能压缩把旧历史总结成一段结构化的摘要只替换模型可见的前缀完整会话仍保存在日志里随时可查。Axl 选择了后者并且把不拆散工具调用组设计成一条硬性不变量甚至在重放日志时都会校验它是否被违反。二、Axl 上下文压缩的 3 种触发方式1. 阈值自动压缩每次模型请求前检查守护进程daemon在每次向模型发起请求前都会估算输入 token 数包括工具执行之后的追加请求。满足以下条件即自动压缩estimatedInputTokens contextWindow - reserveTokens即剩余空间不足以容纳模型输出时提前出手。这个判断逻辑非常简洁见 shouldCompact主循环中的检查点见 agent-session.ts。2. 上下文溢出兜底出错后压缩并重试一次如果估算乐观、模型提供商仍然在输出任何内容之前报出context_limit错误Axl 会以overflow理由执行至多一次压缩然后把原请求原样重试一次。见 agent-session.ts官方文档说明见 docs/compaction.md。3. 手动 /compact 命令想压就压任何客户端终端或 Web都可以输入/compact—— 使用默认策略压缩/compact instructions—— 附上你的关注点让摘要聚焦在这些指令上如果此时 AI 正在回答请求会被排队等当前回合及后续跟进完成后再执行压缩进行中新输入的消息则作为下一个提示词排队不会污染已冻结的压缩输入。排队逻辑见 session-manager.ts命令注册见 command-catalog.ts。三、核心机制如何切分又不破坏工具调用组这是 Axl 上下文压缩最有意思的部分全部实现集中在 packages/kernel/src/compaction.ts。1. 第一步把会话投影成消息组Axl 先把规范事件日志投影成模型可见的消息组见 projectContext事件归入的消息组用户消息、shell 命令独立的 user 组助手消息 其发出的全部tool.call合并为同一个 assistant 组每条tool.result独立的 tool 组关键设计是一次助手发言携带的多个工具调用与它前面的发言被合并为一个整体。这样调用和结果的配对关系在数据结构层面就可见了。2. 切分点回退规则宁可少压不可拆散自动压缩时算法从最新的历史往前累加 token直到达到keepRecentTokens默认 20000以此确定保留区和待压缩区的边界prepareCompaction。随后执行两条保护规则compaction.ts回退到 assistant如果保留区的第一个组恰好是一条tool.result边界会一路向前回退到发出该调用的 assistant 组——绝不把调用和结果分到摘要和保留区两边。跨回合单独总结如果回退后的边界落在一个带工具调用的 assistant 组上且该组属于较新的用户回合Axl 不会把整个回合硬塞进摘要而是把该回合的前缀单独做一次简短前缀总结turnPrefixPrompt只写清理解后文所需的最少信息。3. 重放校验完整性是硬性不变量压缩结果会以context.compacted事件落盘记录replacedEventIds被摘要替换掉的事件 ID。任何后续读取历史时Axl 会重新投影上下文并校验一个消息组要么完整隐藏、要么完整可见绝不允许部分隐藏被隐藏的组必须构成历史的前缀。任何违反都会抛出ReplayError如 splits a model message group见 compaction.ts。换句话说工具调用组完整性不是口头承诺而是被程序强制验证的协议级保证。四、总结摘要长什么样摘要由模型生成但 Axl 对它有严格约束固定章节结构Goal、Constraints Preferences、ProgressDone / In Progress / Blocked、Key Decisions、Next Steps、Critical Context见 summaryPrompt必须精确保留继续工作所需的确切文件路径、函数名、命令和错误信息超长工具结果截断送入摘要提示的工具结果超过 2000 字符会被截断compaction.ts避免摘要请求本身再次溢出累计文件清单压缩后摘要末尾自动附加read-files和modified-files两个区块是从历史工具调用中统计出的已读/已改文件清单并与上一次压缩的清单累加合并withFileSections——这样模型压缩后无需重新读文件就知道自己动过哪些文件禁止摘要模型调工具摘要请求强制toolChoice: none模型一旦试图发工具调用会直接报错见 summarizeText滚动压缩多次压缩时旧摘要会作为previous-summary输入新一轮总结摘要链持续收敛而不是无限膨胀。五、持久化与可靠性设计Axl 的完整会话保存在规范 JSONL 日志中压缩只替换模型可见的前缀原始消息一条都不删。压缩全生命周期都会被记录为事件compaction.queued→compaction.started→context.compacted成功/compaction.failed失败或取消一个很克制的细节守护进程重启后排队中或进行中的压缩会被直接记为失败而不是假装中断的摘要已续上docs/compaction.md。失败的回合保留了压缩失败事件和原始提供商错误用户随时可以手动/compact重试。六、如何配置上下文压缩参数在~/.axl/settings.json中配置修改后需重启 daemon默认值为reserveTokens: 16384、keepRecentTokens: 20000protocol/src/compaction.ts{ version: 1, compaction: { enabled: true, reserveTokens: 16384, keepRecentTokens: 20000, modelOverrides: { anthropic/claude-sonnet-4-6: { reserveTokens: 32768, keepRecentTokens: 30000 } } } }三个参数的心智模型reserveTokens给模型输出预留的 token越大越早压缩keepRecentTokens压缩后原样保留的近期历史大小越大摘要越失忆少modelOverrides按provider/model身份为特定模型单独调参。另外自动压缩非手动还会做一个自适应收窄实际保留量取keepRecentTokens与contextWindow - reserveTokens的较小值防止在小窗口模型上保留区本身就把窗口撑爆见 agent-session.ts。七、一句话总结Axl 的上下文压缩 阈值预估 溢出兜底 手动命令三种触发配合消息组投影、切分点回退、前缀独立总结三招保住工具调用组完整性再用固定章节摘要、累计文件清单、事件级持久化让长会话压缩后依然无缝续写。理解了这套机制你就能明白为什么 Axl 的超长会话既不报工具配对错误也不会丢失我读过、改过哪些文件的关键记忆。赞分享【免费下载链接】Axl项目地址https://gitcode.com/gh_mirrors/axl/Axl点击查看免费下载相关推荐OpenClaw 如何理解并调整会话压缩 Compaction让长对话不超上下文OpenClaw 如何理解并调整会话压缩 Compaction让长对话不超上下文 每个模型都有上下文窗口context window即一次能处理的最大AI 应用AI Agent交互助手后端即时通讯网关Claude Code 会话总结提示词解析上下文压缩如何保持开发上下文不丢失Claude Code 会话总结提示词解析上下文压缩如何保持开发上下文不丢失 在 Claude Code 中当对话历史超过上下文窗口限制时系统会自动触发文档提示工程人工智能ok-ww 鸣潮后台自动战斗指南一键日常声骸刷取简单教程实现后台挂机ok ww 鸣潮后台自动战斗指南一键日常声骸刷取简单教程实现后台挂机 ok wwok wuthering waves是一个基于图像识别的开源鸣潮自动化GUI 自动化计算机视觉RPA人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑