标准回答
一、问题背景
百万 Token 上下文窗口看似充裕,但 Agent 实际运行中上下文消耗极快:一次工具调用可能返回数千 Token,多个子任务并行时上下文迅速膨胀。因此必须分层组织、主动管理。
二、系统层(System Layer)
存放不变的基础信息:
- 系统 Prompt:角色定义、行为约束、输出格式要求
- 工具定义:所有可用工具的 JSON Schema(名称、参数、描述)
- 全局知识:跨任务共享的领域规则、用户偏好
预算:约 5-10 万 Token,生命周期 = 会话全程,几乎不淘汰。
三、任务层(Task Layer)
当前任务的工作上下文:
- 子任务状态表:每个子任务的目标、进度、关键发现
- 工具调用结果:压缩后存入(见下文压缩策略)
- 中间推理链:Agent 的思考过程、决策依据
预算:约 20-50 万 Token,任务完成后摘要归档或淘汰。
四、记忆层(Memory Layer)
长期知识的按需检索:
- 向量库:历史对话、事实知识、经验教训
- 检索策略:语义相似度 + 时间衰减 + 重要性打分混合排序
- 加载时机:仅在需要时检索 top-K 片段注入任务层
五、工具结果压缩策略
不同类型的工具输出,压缩方式不同:
| 工具类型 | 压缩策略 | 压缩率 |
|---|---|---|
| JSON / API 响应 | 提取关键字段,丢弃冗余元数据 | 10-20% |
| 代码执行结果 | 只保留 stdout 最后 N 行 + 错误信息 | 5-15% |
| 文件读取 | 摘要而非全文,保留与任务相关的段落 | 10-30% |
| 网页抓取 | 提取正文 + 关键链接,丢弃导航/广告 | 5-10% |
六、关键原则
保留「可用于后续推理」的信息,丢弃「仅用于展示」的信息。
七、子任务上下文隔离与合并
每个子任务拥有独立上下文窗口,互不干扰。完成后生成「任务摘要」:
- 目标:子任务要解决什么问题
- 关键发现:最重要的 3-5 个结论
- 未解决问题:遗留的不确定性
- 对父任务的建议:下一步行动建议
父任务合并摘要时做冲突检测——如果两个子任务结论矛盾,触发冲突解决流程(让 LLM 基于原始证据判断哪个更可靠)。
八、记忆压缩与遗忘
- 重要性打分:被多次引用的记忆权重更高
- 时间衰减:长期未被检索的记忆逐步降低优先级
- 淘汰策略:低重要性 + 长时间未使用 → 从活跃记忆移至冷存储
常见误区
⚠️ 常见踩坑
误区一:把所有工具原始输出直接塞进上下文——一次网页抓取可能返回上万 Token,不压缩直接导致后续任务上下文溢出。误区二:子任务之间共享完整上下文——看似信息完整,实则互相干扰、Token 浪费严重,隔离 + 摘要合并才是正解。
追问
追问 1:工具调用结果如何压缩?不同类型的工具输出压缩策略有何差异?
按工具输出类型分策略:
- 结构化输出(JSON / API 响应):提取关键字段,丢弃冗余元数据和分页信息
- 代码执行结果:只保留 stdout 最后 N 行 + 完整错误堆栈
- 文件读取:做摘要而非全文,保留与当前任务语义相关的段落
- 网页抓取:提取正文 + 关键链接,丢弃导航栏、广告、页脚
压缩率目标:原始输出的 10-30%。关键:压缩时保留「可用于后续推理」的信息,丢弃「仅用于展示」的信息。
追问 2:子任务上下文隔离后,如何避免信息丢失导致子任务间冲突?
每个子任务完成后生成任务摘要(不是简单压缩),包含:
- 目标:子任务要解决什么问题
- 关键发现:最重要的 3-5 个结论
- 未解决问题:遗留的不确定性
- 对父任务的建议:下一步行动建议
父任务合并摘要时做冲突检测——如果两个子任务结论矛盾,触发冲突解决流程(让 LLM 基于原始证据判断)。关键:摘要是「面向父任务决策」的信息提取,不是无差别压缩。
🔗 相似问题
同一考点的不同问法,换着练更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习
