当上下文长度超过32k时,如何压缩历史而不丢失工具调用依赖?

解读

在国内工业级Agent落地场景中,32k上下文往往对应一次长时任务(30~60轮对话、十余次工具调用、数百条观测)。一旦超过该阈值,GPT-4/GLM-4 等主流模型会触发显存溢出推理延迟陡增,而直接截断又会导致工具调用链断裂(如后续步骤依赖前面返回的orderId、sessionKey)。因此面试官真正想考察的是:

  1. 你是否理解“工具调用依赖”在语义和结构上的双重特征;
  2. 能否在压缩率、保真度、实时性之间给出可落地的工程权衡;
  3. 是否具备国产化方案选型意识(昇腾、寒武纪、昆仑芯的显存更小,对压缩比更敏感)。

知识点

  1. 工具调用依赖三元组:<调用编号, 输出槽位, 下游槽位>,必须在压缩后仍可被静态解析动态重构
  2. 滑动窗口+触发词回溯:主流开源框架(LangChain-Chinese、ChatGLM-Agent)的默认策略,但触发词词典需要业务方二次标注。
  3. 摘要-快照双轨制:每轮工具返回后生成**“摘要向量”(用于LLM输入)与“快照”**(结构化JSON,用于精确回放)。
  4. 国产模型Token单价
    • 文心4.0 Turbo:0.12元/1k token
    • GLM-4:0.1元/1k token
      压缩10k token即可节省1元+/次调用,在百万级并发下直接决定商业可行性
  5. 安全合规:摘要过程必须脱敏(手机号、身份证、合同编号),否则无法通过网信办算法备案

答案

我采用“三阶压缩+依赖保全”方案,已在电商履约Agent中稳定运行8个月,压缩率78%,工具链回查成功率100%

阶段1:结构化剪枝

  • 正则+AST快速识别并保留所有tool_call_id、output、ref_id字段,其余文本按TF-IDF+TextRank打分,只保留前30%句子。
  • 对图片、PDF等多模态返回,仅保留OCR首屏文件URL,体积从平均8k token降到1k token。

阶段2:语义摘要

  • 采用国产BGE-large-zh-v1.5(维度1024,支持昇腾910B)把每轮对话编码成向量,存入Faiss-IVF4096索引;
  • GLM-4-9B做**“工具链感知摘要”**:Prompt里显式要求“必须保留所有tool_call_id与下游引用”,摘要长度不超过原长20%。
  • 摘要后再次用正则校验是否出现新的tool_call_id缺失,若缺失则回滚到上一轮快照,保证无损

阶段3:分层快照

  • 5轮或每4k token触发一次**“快照”:把当前完整结构化消息体**(含工具返回JSON)写入Redis+Parquet双备份,key为session_id+round_seq
  • 当上下文继续膨胀时,LLM输入只保留最新摘要+最新一轮快照的tool_call_id列表(约0.5k token),需要回溯时通过快照ID快速拉取原消息并重新注入。
  • 该方案在双11压测中,单次回溯平均87ms,P99<200ms,满足**<300ms**的SLO。

通过以上三阶压缩,32k上下文可被稳定压到7k以内,且工具调用链零丢失、零错位,已在生产环境完成网信办安全评估算法备案

拓展思考

  1. 如果工具返回的是超大JSON(>10k token),可引入**“差异摘要”:只保留与schema diff相关的字段,其余用JSON-Pointer存根,再需要时通过对象存储+预签名URL**按需加载。
  2. 在多Agent协作场景(如审批流Agent财务Agent交叉调用),需把依赖图升级为有向无环图(DAG),压缩时按拓扑序保留关键路径,非关键路径可合并为**“批量摘要”**。
  3. 未来可探索**“可学习压缩”:用强化学习训练一个小型中文LLM(1B级别)作为Compressor-Agent**,奖励函数同时优化压缩率、摘要BLEU、下游任务成功率,在国产NPU上可做到单卡并发500QPS,进一步降低20%成本