当上下文长度超过32k时,如何压缩历史而不丢失工具调用依赖?
解读
在国内工业级Agent落地场景中,32k上下文往往对应一次长时任务(30~60轮对话、十余次工具调用、数百条观测)。一旦超过该阈值,GPT-4/GLM-4 等主流模型会触发显存溢出或推理延迟陡增,而直接截断又会导致工具调用链断裂(如后续步骤依赖前面返回的orderId、sessionKey)。因此面试官真正想考察的是:
- 你是否理解“工具调用依赖”在语义和结构上的双重特征;
- 能否在压缩率、保真度、实时性之间给出可落地的工程权衡;
- 是否具备国产化方案选型意识(昇腾、寒武纪、昆仑芯的显存更小,对压缩比更敏感)。
知识点
- 工具调用依赖三元组:<调用编号, 输出槽位, 下游槽位>,必须在压缩后仍可被静态解析或动态重构。
- 滑动窗口+触发词回溯:主流开源框架(LangChain-Chinese、ChatGLM-Agent)的默认策略,但触发词词典需要业务方二次标注。
- 摘要-快照双轨制:每轮工具返回后生成**“摘要向量”(用于LLM输入)与“快照”**(结构化JSON,用于精确回放)。
- 国产模型Token单价:
- 文心4.0 Turbo:0.12元/1k token
- GLM-4:0.1元/1k token
压缩10k token即可节省1元+/次调用,在百万级并发下直接决定商业可行性。
- 安全合规:摘要过程必须脱敏(手机号、身份证、合同编号),否则无法通过网信办算法备案。
答案
我采用“三阶压缩+依赖保全”方案,已在电商履约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以内,且工具调用链零丢失、零错位,已在生产环境完成网信办安全评估与算法备案。
拓展思考
- 如果工具返回的是超大JSON(>10k token),可引入**“差异摘要”:只保留与schema diff相关的字段,其余用JSON-Pointer存根,再需要时通过对象存储+预签名URL**按需加载。
- 在多Agent协作场景(如审批流Agent与财务Agent交叉调用),需把依赖图升级为有向无环图(DAG),压缩时按拓扑序保留关键路径,非关键路径可合并为**“批量摘要”**。
- 未来可探索**“可学习压缩”:用强化学习训练一个小型中文LLM(1B级别)作为Compressor-Agent**,奖励函数同时优化压缩率、摘要BLEU、下游任务成功率,在国产NPU上可做到单卡并发500QPS,进一步降低20%成本。