← AI Agent

Agent 如何管理上下文窗口?

高频 中等 Observation 与上下文管理 · 第 2 / 2 问 更新于 2026/09/29
AI Agent上下文窗口轨迹压缩状态管理
本题落地项目AI Agent智能教务排课与教学质量分析系统

简化版

Agent 不能把每轮思考、完整工具响应和全部历史一直追加到 Prompt。应把上下文分为稳定指令、当前任务状态、近期轨迹和按需证据:稳定指令固定保留,任务状态结构化维护,旧轨迹压缩成带来源的摘要,大工具结果存到外部并只注入引用或相关片段。每轮装配前精确计数,给输出留预算;被压缩的关键信息必须能按 ID 回取。

详细版

Agent 上下文比普通聊天多了计划、工具 Schema、工具观察、中间产物和错误轨迹,膨胀更快。治理时要区分“状态”和“记录”:当前目标、约束、已完成节点属于状态,必须准确;历史推理和旧工具输出属于记录,可以摘要或外置。

[稳定区] system + policy
[状态区] goal + constraints + plan + completed/blocked
[工作区] recent actions + latest observations
[证据区] 按当前步骤检索出的片段
[预留区] next action / final answer

每轮由上下文装配器按优先级打包,而不是让模型自己复制历史。超限时先移除无关工具定义与重复观察,再压缩已完成阶段,保留未解决错误和当前步骤证据。评测要覆盖长轨迹中的约束保持、引用回溯、工具选择准确率、压缩后任务成功率与成本延迟。

完整版教学

一、Agent 为什么比聊天更容易爆窗

聊天主要累积用户和助手消息,Agent 还会积累工具定义、计划、每次调用参数、原始返回、重试错误和中间文件。一个网页抓取工具可能一次返回 20 KB;连续调用十次,即使模型只说了几句话,上下文也会迅速膨胀。

长上下文不仅会触碰硬上限,还会提高 prefill 延迟,让重要约束被大量旧观察稀释。真正的问题不是“装不下”才处理,而是从设计之初控制每类信息的生命周期。

记忆钩子:状态回答“现在必须知道什么”,日志回答“以前发生过什么”;Agent 每轮需要状态,不一定需要整本日志。

二、把上下文分成不同保真等级

系统安全规则、用户当前目标和不可违反的约束属于高保真区,不能由自由摘要替代。已完成步骤的细节可以压缩,但要保留产物 ID 和验证结果。原始工具响应通常外置,只注入当前决策相关的字段。

信息保留方式淘汰条件
系统与权限规则原文或受控模板本次请求不淘汰
目标与硬约束结构化状态用户明确修改
当前步骤证据原文相关片段步骤完成且已归档
已完成轨迹摘要 + 产物引用任务结束
调试日志外部 Trace不进入正常 Prompt

这种分区避免一个统一的“截掉最旧消息”策略误删仍然有效的约束。

三、结构化状态优于反复摘要

若只让模型总结历史,“预算不超过 500 元”可能在多次摘要后变成“预算约 500 元”,语义已经变化。目标、数值约束、实体 ID、计划状态和待确认项应放进有 Schema 的状态对象,并由控制器更新。

{
  "goal": "预订周五上海到北京的高铁",
  "constraints": {"depart_after": "14:00", "max_price": 500},
  "completed": ["search_trains"],
  "pending": ["user_select_train"]
}

模型可以提出状态更新候选,但写入前要做类型、范围和权限校验。这样压缩对话时,不会把任务骨架一起压没。

四、工具结果采用“外置 + 投影”

数据库查询的 1000 行、网页全文和编译日志不应永久放进上下文。工具层把原始结果存入对象存储或任务附件,返回 artifact_id、摘要、关键字段和可分页引用;上下文装配器根据下一步需要选择投影。

例如原始日志有 50,000 token,而定位错误只需最后 200 行和首个异常栈,投影后可能仅 1,500 token,减少 97%。如果模型需要上文,可用 artifact ID 再请求局部范围,而不是重新执行工具。

投影必须保留证据定位,如页码、行号、记录主键和内容哈希。否则摘要一旦出错,后续无法回到真值核对。

五、轨迹压缩要按阶段做

每轮都总结全部历史会额外花费模型调用,并产生逐次失真。更合适的是在子任务完成、上下文达到水位或阶段切换时压缩:保留目标、关键决策、产物、失败原因和未完成项,删除可重建的过程性表达。

搜索阶段 18 条消息
  -> 阶段摘要:查过哪些源、选中哪些证据、哪些问题未解决
  -> 原始轨迹保存在 trace://task/123/search

摘要应带版本和覆盖范围。若后续发现结论矛盾,可以展开对应轨迹重新核查,而不是继续在错误摘要上推理。

六、每轮动态装配而非固定拼接

当前执行“查询价格”时,需要价格工具 Schema 和商品 ID,不需要发布工具及三轮前的排版讨论。装配器可先根据当前计划节点选择工具,再检索与该节点相关的记忆和证据,最后按预算排序装箱。

假设窗口 16K,输出预留 2K,安全余量 500,系统与状态占 3K,那么工作区和证据区共有 16000-2000-500-3000=10500 token。若候选证据超限,应按任务相关性与不可替代性裁剪,而不是平均砍半。

动态装配还要防止不可信工具文本进入系统区。网页中的“忽略之前指令”只能作为数据片段,不能改变权限和工具策略。

七、压缩失败有可观测信号

压缩后 Agent 重复调用已经成功的工具,说明完成状态丢失;违反用户早期约束,说明状态抽取有误;引用不存在的 artifact,说明索引生命周期失配。这些都应成为自动评测用例。

可记录每轮各分区 token、压缩次数、召回的 artifact、重复动作率、约束违反率和最终任务成功率。只看平均 token 下降会鼓励过度压缩;质量必须与成本一起比较。

在 200 条长任务上,若压缩使平均输入减少 40%,但成功率从 88% 降到 80%,通常不可接受。应定位是哪个状态字段或证据类型被删,而不是简单扩大摘要。

八、不同失败采用不同降级

接近窗口上限时,可以删除未使用工具、压缩旧阶段、分离子任务,或换长窗口模型。若仍无法容纳不可丢内容,应明确停止并要求缩小任务,而不能静默截断。

摘要服务失败时可以回退到最近检查点和结构化状态;artifact 存储不可用时,不应假装已经读取证据;输出空间不足时应缩短响应计划,而不是侵占安全指令。

设计降级顺序的原则是先牺牲便利与细节,再牺牲覆盖范围,绝不牺牲权限边界和任务硬约束。

九、常见误区与追问

  • 误区:模型窗口足够长就无需管理。 工具轨迹会持续增长,长输入仍有成本、延迟和注意力稀释问题。
  • 误区:保留最近 N 条消息最简单可靠。 消息长度差异大,早期硬约束可能仍然有效。
  • 误区:把所有工具结果总结一次即可。 摘要有损,原始结果必须外置并可按引用回取。
  • 误区:思考轨迹越完整,Agent 越聪明。 大量过程文本会制造噪声,任务状态和证据更重要。
  • 误区:压缩率越高越好。 应以任务成功率、约束保持率和成本的联合指标评价。
  • 追问:哪些信息绝不能摘要? 安全规则、权限、精确数值约束和当前未解决条件应原文或结构化保存。
  • 追问:何时触发轨迹压缩? 阶段完成、达到 token 水位或切换子任务时,而不是机械地每轮执行。
  • 追问:怎样验证摘要没有遗漏? 用结构化必填字段、来源引用和长任务回归集检查,并允许展开原始 artifact。

十、加强记忆

Agent 上下文管理记住“分区、状态、外置、装配”:安全规则和硬约束高保真保留,目标与进度写成结构化状态,大型工具结果外置并留下可回取引用,旧轨迹按阶段压缩;每轮只为当前节点动态装配相关工具与证据。优化目标不是单纯减少 token,而是在任务成功、约束保持和可追溯的前提下,降低成本与延迟。

项目实战落地

项目里怎么做的

《AI Agent智能教务排课与教学质量分析系统》的排课 Agent 一次任务要调七八十次工具,上下文管理从指令本身做起:

  • 指令只放稳定内容:buildAgentPrompt 只写三块:Prompt 模板正文(角色和排课口径)、管理员填的任务配置(任务 ID、学期、目标、课程范围、班级范围、规则策略)、把 8 个工具的调用顺序写成的执行步骤;
  • 数据一律现查:指令里没有具体的课程名、教师名、教室号,也没有规则原文和知识库内容,都由模型调工具从数据库里查,所以指令长度是固定的,不随基础数据变多而膨胀;
  • 最终回复不重复数据:要求模型只说明排了多少节、覆盖哪些班级课程、哪些没排上、需要人工确认什么,「不要在最终回复里罗列每一节课的明细,明细已经在数据库里了」。

《AI Agent岗位匹配与求职规划系统》在 Agent 之后生成求职报告时按段截断参考数据:Agent 结论截到 3500 字,计划参考 1800 字,项目包装 1600 字;如果模型因为输出长度上限被截断,就改用精简提示词再调一次,少传计划参考,字数上限从 1800 降到 1000,章节从七个减到五个,Agent 结论降到 1800 字,其余参考各 600 字。

为什么这样取舍

  • 数据不进指令:规则、工具清单、知识库一股脑塞进指令,Prompt 会越拼越长、越长越容易超出上下文;让模型调工具查,查到的还是数据库里的实时数据。
  • 报告按段截断、超长换短提示词:三处截断是为了控制提示词总长度;输出被截断时不是原样重试,而是换一份更短、字数要求更低的提示词,开头就告诉模型上一次生成过长被截断。

面试官还会追问

  • 排课 Agent 的最终回复写进 ai_plan 之前,为什么还要清洗一遍?清洗掉的是什么?
  • 教师或教室没有登记某个时间点的可用记录时,指令里要求模型把它当成可用还是不可用?

学完《AI Agent智能教务排课与教学质量分析系统》,上面这些追问你都会迎刃而解。

本题落地项目地狱锤炼AI Agent智能教务排课与教学质量分析系统基于 SpringAI Agent、Function Calling 和教务知识库检索,实现教师、班级、课程、教室等资源管理,支持排课规则维护、智能排课、冲突检测、课表发布、教学评价和质量分析,覆盖教务排课与质量管理核心闭环。SpringbootSpringAIAgentFunction CallingRAG源码+SQL喂饭学习教程配套面试文档环境安装文档项目运行文档 学习这个项目 也可以学AI Agent岗位匹配与求职规划系统地狱锤炼 查看项目