聊天记录越长越贵:我的上下文压缩分了七层

简介: Agent 对话越长 token 越贵、模型越迷糊,但压缩本身也有成本。本文附我开源项目 codeAgent 的真实源码:compress_if_needed 分层压缩总调度——从免费的时间清理、L1 裁中间、L2 单条折叠,到最贵的 L4 LLM 摘要,共七层流水线各管一档;L4 还带四套保命机制(9 段式结构化 prompt、PTL 重试、熔断器、预提取记忆替代),摘要请求本身还设计成能命中前缀缓存。

codeAgent 系列第 3 篇,每天一个真实技术点,全部附源码。
仓库:https://github.com/Harvil1/codeAgent

为什么分级?因为压缩本身也花钱

一动手就上"LLM 全量摘要"是新手最常见的错:摘要要调一次模型(花钱)、有信息损失(丢细节)、还慢。正确思路跟收拾房间一样——能揉废纸的别动吸尘器:轻度污染格式裁剪就够,堆成山才请钟点工。

七层流水线(源码)

总调度在 agent/context_pipeline.py,docstring 把流水线写得明明白白:

async def compress_if_needed(
    messages: list,
    *,
    llm_client,
    model: Optional[str],
    config: dict,
    session_state: CompressionSessionState,
    ...
) -> Tuple[list, bool, bool]:
    """分层压缩总调度(编排器)。返回 (新消息, 是否有改动, 是否发生了 LLM 摘要级压缩)。

    流水线顺序(从便宜到贵):时间清理 → L1 裁中间 → L2 单条折叠 →
    L2.5 按段聚合 → L2.6 总量预算 → L3.5 整段折叠 → L4 LLM 摘要。
    每层各自判断要不要出手,最后统一过一遍工具调用配对修复。

    「有改动」vs「LLM 级压缩」的区分:changed 表示任何
    一层动过消息(包括无损层)——调用方只需把消息同步回对话历史;compacted
    特指 L4 的有损摘要——要做重建 prompt / [COMPACT_BOUNDARY] /
    <post_compress_brief> 那一整套后续动作。
    """

两个设计点值得说:

  1. 返回值把「动了消息」和「有损压缩」分开。前六层基本无损(裁格式、折叠长文本),只有 L4 是真摘要——后者要触发一整套重活(边界标记、提示重建),前者只需要把消息同步回去。调用方拿两个布尔值就知道该走哪条路。

  2. 每层自己判断要不要出手。没有 if-else 大楼梯,每层是个独立插件,加一层(比如以后加向量去重)不动别的层。

L4 深度摘要的四套保命机制

最贵的 L4 也最容易出事,agent/context_compressor.py 给它配了四套保险:

    L4 压缩的核心动作,带四套保命机制:
    - **9 段式结构化 prompt**:强制逐字保留文件路径/错误消息/用户原话
    - **PTL 重试**:摘要请求自己报 prompt_too_long 时,丢掉一部分旧消息再试
      (最多 MAX_PTL_RETRIES 次)
    - **熔断器**:连续 MAX_CONSECUTIVE_FAILURES 次失败后不再调 LLM,直接走规则总结
    - **session_memory 替代**:有预提取的会话记忆就直接用,一次 LLM 都不调

翻译一下:摘要 prompt 分九个段(目标/决策/文件路径/报错/用户原话……),强制逐字保留关键信息;摘要请求自己超长就丢旧消息重试;连续失败就熔断降级成"不花钱的规则总结";已经有预提取记忆就一次 LLM 都不调。

彩蛋:摘要请求也蹭前缀缓存

最妙的一处(接上篇前缀缓存的话题):

    fork_prefix_messages:完整对话(含 system)。有值且没配 summary_model 时,
      摘要请求 = 完整对话前缀 + 追加一句摘要指令(tools 与主调用相同)——
      请求开头和主对话一模一样,能命中服务商的前缀缓存,省一次全量缓存写入;

摘要请求的开头和主对话逐字节一致——等于摘要这次调用蹭了主对话的复读折扣,缓存写入费都省了。

小结

  1. 压缩分级 = 按污染程度选最便宜的手段,七层流水线各管一档
  2. 「动了消息」和「有损压缩」是两个返回值,后续动作完全不同
  3. L4 四套保命:9 段式 prompt、PTL 重试、熔断、预提取替代——最贵的一层反而要最抗造

下一篇:每次请求都在为工具说明书付费——工具套餐化怎么省(附 toolsets.py 源码)。


仓库在这,注释全中文,欢迎 Star ⭐:https://github.com/Harvil1/codeAgent

目录
相关文章
|
1天前
|
缓存 NoSQL 区块链
0.8MB 跑通 Qwen|第 15-2 篇:推理引擎的 prefill 与 decode——两条路径为何分开
本篇详解Qwen推理引擎中prefill与decode双路径设计:prefill一次性处理整段prompt(如18 token),批量写入KV缓存;decode逐token循环生成,追加KV。通过RK3588真机gdb断点实证,明确二者独立入口、状态流转与性能动因,手搓零依赖纯C引擎的核心逻辑。(239字)
|
Java 关系型数据库 中间件
分库分表(3)——ShardingJDBC实践
分库分表(3)——ShardingJDBC实践
1759 0
分库分表(3)——ShardingJDBC实践
|
1天前
|
人工智能 自然语言处理 文字识别
盘点阿里云自研模型|Qwen、通义万相、HappyHorse 等AI模型清单
阿里云自研AI模型涵盖文本、图像、视频、语音及全模态,以通义千问Qwen系列为核心,包括Qwen3.8-Max、Qwen-VL-Plus、通义万相、CosyVoice等数十款专业模型,统一通过百炼平台提供API服务。(239字)
60 1
|
1天前
|
JSON API 数据格式
Python调用万能识别接口,英文数字、点选和问答
同一套接口做万能识别。英文数字、问答、点选分别对应三种 question。图片转成 base64 后 POST JSON,errCode 为 0 才算成功,文本或坐标在 msg。
|
1天前
|
缓存 C语言 C++
0.8MB 跑通 Qwen|第 9-3 篇:推理引擎的 q8 KV 精度对照——量化进注意力,输出差多少
本系列《0.8MB跑通Qwen》手搓零依赖纯C推理引擎,适配Qwen3-VL多尺寸模型,在RK3588上实测q8 KV量化:输出误差仅≈0.01,端到端PPL损失<1%,带宽降为52%,精度与效率达成教科书级平衡。(239字)
|
1天前
0.8MB 跑通 Qwen|第 13-1 篇:推理引擎的 decode 为什么慢——逐词、带宽、不可并行
本系列《0.8MB跑通Qwen》聚焦ARM端零依赖纯C推理引擎,适配Qwen3-VL多模态模型,在RK3588上实测decode瓶颈——逐词生成、内存带宽受限、无法并行。直击每词92ms硬地板,为推测解码(speculative decode)铺路,实现“一次前向多产出”。
|
1天前
|
缓存 安全 API
0.8MB 跑通 Qwen|第 11-2 篇:大模型推理的前缀缓存键——怎么知道"两轮一样"?
本系列《0.8MB跑通Qwen》聚焦ARM端零依赖纯C推理引擎,实测RK3588上高效运行Qwen3-VL多模态模型。本文详解前缀缓存核心机制:以token序列最长公共前缀(LCP)为键,实现KV复用;并揭示“完全相同反不复用”的安全设计——确保prefill刷新logits,杜绝空响应。
|
1天前
|
NoSQL 调度 C++
0.8MB 跑通 Qwen|第 14-3 篇:推理引擎的批处理正确性边界——margin 0.71 vs 0.032
本篇精读Qwen3-VL系列推理引擎的“位级一致性”本质:批量与串行输出大多逐字节一致,但因浮点累加顺序差异,在near-tie(近平局)场景下存在翻盘风险——margin(如0.71 vs 0.032)决定是否一致。这是工程结果,非数学承诺。
|
1天前
|
弹性计算 人工智能 安全
阿里云 ECS 上部署 HelloAGENTS:Node 版本、出网与多宿主接入
HelloAGENTS 是面向 AI 编程 CLI 的工作流增强工具,支持 Claude、Gemini 等主流引擎,提供技能管理、项目知识持久化、安全配置写入与可恢复执行。基于 Node.js 22 LTS,需 ECS 环境部署,强调快照回滚与严格安全管控。(239字)
20 0
|
1天前
|
弹性计算 人工智能 Java
2026年10月最新!阿里云10款热门服务器配置排行榜:含价格、带宽、适用场景全解析
2026年10月阿里云服务器最新排行榜,涵盖轻量应用、ECS及GPU机型,按预算分三梯队(百元入门至万元AI算力),详解10款高性价比配置,含价格、适用场景与避坑指南,助你精准选型。
45 0

热门文章

最新文章