Appearance
86. AI Agent 上下文窗口溢出如何解决?
难度 P1 高频 · 岗位 应用 · 频率 ★★★ · 预计阅读 6 min
本题阅读地图
- 💡 简要回答
- 📝 详细解析
- 🎯 面试总结
👔 面试官:Agent 执行长任务时,上下文窗口撑满了怎么办?
🙋 我:可以用滑动窗口,把最早的对话丢掉?
👔 面试官:只有滑动窗口?这个策略有什么缺陷?还有其他方案吗?
这道题考查你对上下文工程的系统性认知,不能只答一招。
💡 简要回答
上下文溢出有八种主流解决方案,从「舍弃」到「压缩」到「外化」到「多模型分工」,复杂度依次递增。没有一个银弹方案,实际系统通常是分层组合使用:轻量任务用滑动窗口,中等任务用摘要压缩,重型任务用外部记忆检索。
📝 详细解析
八种解决方案
方案一:滑动窗口(Sliding Window)
只保留最近 N 轮对话,超出窗口的内容直接丢弃。
优点:实现简单,对计算资源零额外消耗。 缺点:永久丢失早期信息,任务越长、丢的越多,可能导致 Agent 「忘记了最初的目标」。
适合:短到中等长度的任务,对历史一致性要求不高的场景。
方案二:摘要压缩(Summarization)
不直接丢弃早期对话,而是用 LLM 把它们压缩成摘要,摘要代替原始对话留在上下文里。
优点:保留了关键信息的语义,比滑动窗口「丢失少」。 缺点:摘要本身需要额外 LLM 调用(成本增加),且压缩有损失,细节无法还原。
方案三:语义压缩(Semantic Compression)
比摘要更精细:先对每段内容做重要性评分,只压缩低重要性内容,保留高重要性内容的完整原文。
优点:在压缩率和信息保留之间取得更好的平衡。 缺点:实现复杂度高,重要性评分本身需要额外推理。
方案四:选择性保留(Selective Retention)
预先定义哪些类型的内容「必须保留」(如:任务目标、关键决策点、工具调用错误),其余内容可以丢弃或压缩。
优点:对特定任务类型效果很好(因为你知道什么最重要)。 缺点:需要领域知识来设计保留规则,泛化性差。
方案五:内容修剪(Content Trimming)
对工具返回的内容(往往很长)做自动截断或提取关键字段,减少工具结果占用的 token。
优点:针对工具调用场景效果显著(工具返回的 JSON 往往有大量冗余字段)。 缺点:可能截掉模型需要的信息,需要精心设计截断策略。
方案六:层级记忆(Hierarchical Memory)
将信息按重要性分层:工作记忆(上下文窗口内)→ 会话摘要(压缩版中期记忆)→ 长期记忆(向量库),信息按层流转,需要时从下层检索。
优点:理论上信息不丢失,只是粒度变粗。 缺点:系统复杂度高,需要完整的记忆管理模块配合。
方案七:外部记忆检索(External Memory)
重要信息主动存入向量数据库,上下文只保留「索引」,需要时再检索。这是目前主流 Agent 框架推荐的主要方案之一。
优点:理论上信息容量无上限,检索灵活。 缺点:检索延迟(每次都要做向量搜索)+ 检索质量不稳定(相关的未必被检索到)。
方案八:多 Agent 协作(Multi-Agent Collaboration)
把长任务拆给多个 Agent 并行处理,每个 Agent 只负责一小段,上下文不超限。
优点:从根本上规避单 Agent 的上下文上限问题,还能提升效率。 缺点:多 Agent 的协调成本高,需要完善的任务分解和结果整合机制。
方案选型参考
| 任务长度 | 推荐方案 |
|---|---|
| 短任务(< 20 轮) | 滑动窗口就够了 |
| 中等任务(20-100 轮) | 摘要压缩 + 关键内容选择性保留 |
| 长任务(100+ 轮) | 层级记忆 + 外部向量检索 |
| 超长/复杂任务 | 多 Agent 协作 + 每个 Agent 用外部记忆 |
🎯 面试总结
答这道题展示「分层选型」思维,而不是只说一个方案。八种方案里,摘要压缩、外部记忆检索、多 Agent 协作是最重要的三个,其余是细粒度补充。最后说一句「实际系统通常组合使用,没有银弹」,展示工程成熟度。