这道题其实是在问,当[[Agent]]系统做多轮对话时,标准Transformer的注意力机制在长序列下会遇到哪些瓶颈。说白了,就是效率、记忆和推理能力之间的平衡问题。
先说最直观的,计算复杂度是O(n²)。Agent多轮对话上下文长度轻松上万,每轮新输入都要跟全部历史做Attention,延迟线性增长,到第几十轮时基本没法实时交互。举个例子,一个客服退款Agent,用户来回几轮问订单状态、商品问题、退款流程,中间可能还调了库存API、查了物流,上下文堆到一万多token,每轮回复等好几秒,用户早没耐心了。
再一个,[[KV Cache]]显存是硬伤。多轮对话每层都要缓存K和V矩阵,长度随轮次累积,如果Agent还调工具返回结果或[[RAG]]检索的文档,缓存会进一步膨胀。显存占用公式就是层数乘head数乘head_dim乘序列长度乘batch_size再乘2,算下来很容易撑爆。比如部署8个并发用户,上下文10K,显存直接上百G,不优化根本跑不动。
还有位置编码的外推失效。模型训练时固定长度比如4K,推理时远超这个数。绝对位置编码会出现注意力分散,相对编码比如[[RoPE]]外推性也不足,长距离历史信息会被遗忘或注意力权重异常。比如Agent在早期推理步骤里做了关键决策,到后面几轮这步就找不回来了,导致规划出错。
那怎么优化呢?落地时很少只用单一方案,常常是组合拳。先说稀疏Attention,比如[[Sliding Window]]加Global Attention,让关键步骤全局可见,其他只关注窗口内,复杂度降到O(n)。再一个压缩历史,用摘要模型把多轮对话压缩成固定token,比如每五轮压缩一次,保留核心信息。还有动态KV Cache,像H2O保留重头token,StreamingLLM丢弃中间token,显存能省不少。最后是长度外推,比如NTK-aware插值或YaRN,训练后适配更长序列。
这里有几个落地风险。前提是场景允许精度损失。比如客服Agent,压缩历史可能丢掉用户情绪或细节,导致回复不准确。常见失败场景是稀疏Attention的窗口设太小,跨窗口依赖被切断,比如用户说“像之前那样处理”,Agent找不到上下文。上线我会特别关注窗口大小和压缩策略对任务成功率的影响,用一批历史对话回放,对比优化前后的召回率和延迟。
其实还有一个方向是让Agent主动管理记忆,比如用[[Reflexion]]或[[Self-Refine]],让模型在推理过程中自己判断哪些历史需要保留或丢弃,而不是靠固定的窗口或压缩。
所以我会把这个问题看成效率与记忆的工程取舍,没有银弹。我更倾向根据业务场景组合方案:对延迟敏感用稀疏Attention加动态KV Cache,对长程依赖要求高用压缩历史加长度外推。核心是上线前做充分压测和回放验证,确保精度和效率都在可接受范围。