一、上下文窗口概述
上下文窗口(Context Window)是子代理运行时的核心概念,它决定了子代理在一次交互中能够"看到"和"记住"的信息范围。每个子代理拥有独立的上下文窗口,这意味着不同子代理之间的上下文互不干扰,各自维护自己的状态和记忆。
上下文窗口的大小是有限的,其容量取决于底层模型的具体规格。当前主流大语言模型的上下文窗口从数万到数十万token不等,但无论多大,合理管理上下文窗口都是子代理高效工作的关键。如果超出上下文窗口限制,最直接的后果就是历史信息丢失——早期对话内容或工具执行结果会被截断,导致子代理"失忆"。
在实际应用中,上下文窗口管理的好坏直接决定了子代理的工作质量。窗口过小会导致关键信息丢失,窗口过大则会带来不必要的token消耗和响应延迟。因此,掌握上下文窗口的管理策略是每个子代理开发者必须掌握的技能。
二、上下文窗口的组成
子代理的上下文窗口由多个不同来源的内容共同构成,理解这些组成部分有助于我们精准地管理上下文资源。
- 系统提示:系统提示是赋予子代理角色定位和行为指令的核心部分。它定义了子代理的身份、任务目标、行为规范、输出格式等元信息。系统提示通常位于上下文窗口的最前端,在整个对话过程中持续生效,因此应当尽量精炼,避免包含冗余信息。
- 对话历史:对话历史记录了用户和子代理之间的完整交互过程,包括用户的每一次提问和子代理的每一次回复。这是上下文窗口中动态增长最快的部分,也是管理难度最大的部分。随着对话轮数的增加,对话历史会持续占用上下文空间。
- 工具结果:子代理在调用工具(如文件读取、代码执行、网络请求等)时,工具的返回结果会被写入上下文窗口。某些工具可能返回大量数据(如读取一个大文件、执行数据库查询返回海量结果),这会急剧消耗上下文空间。
- 文件内容:子代理在运行过程中读取的文件数据同样会占用上下文。例如,读取源代码文件、配置文件、数据文件等。这些文件内容会直接进入上下文窗口,成为子代理推理的依据。
三、上下文压缩策略
上下文压缩是应对上下文窗口限制的最常用手段,其核心思想是在保留关键信息的前提下,最大程度地减少上下文占用的token数量。
- 对话历史摘要:将长时间的对话历史压缩为简短的摘要,用几句话概括之前的对话要点,而不是保留完整的对话记录。摘要技术可以是简单的截断策略,也可以使用专门的摘要模型生成高质量摘要。
- 代码截断:当子代理需要读取代码文件时,只保留与当前任务相关的函数或代码段,而不是将整个文件全部读入上下文。例如,调试一个特定函数时,只需读取该函数的实现,无需加载整个模块。
- 移除冗余的中间输出:工具调用产生的中间输出往往包含大量冗余信息。例如,编译日志中的成功信息、API响应中的默认字段等。这些内容可以在写入上下文之前进行过滤和精简。
- 保留最新的N轮对话:采用滑动窗口策略,只保留最近N轮对话内容,丢弃早期的对话记录。这种方法实现简单,在大多数场景下效果良好,因为最新的对话通常包含最相关的上下文信息。
四、分段处理策略
分段处理是一种从任务设计层面规避上下文窗口限制的策略,它通过改变任务的执行方式来降低单个子代理对上下文的需求。
- 将长任务分为多个短阶段处理:将一个复杂的长期任务分解为多个独立的短期阶段,每个阶段聚焦于一个具体的子目标。例如,代码审查任务可以分解为"语法检查阶段"、"逻辑审查阶段"和"安全审计阶段"。
- 每个阶段使用新的上下文:在每个阶段开始时创建一个全新的上下文窗口,避免前一阶段积累的上下文干扰当前阶段。这种方式保证了每个阶段都能以"最清晰的视野"处理当前任务。
- 阶段之间共享关键信息而非全部上下文:阶段之间只传递必要的关键信息(如中间结果、决策依据),而非传递完整的上下文。这可以通过结构化的数据格式(如JSON)来实现信息交换,大幅降低信息传递成本。
- 子代理只关注当前阶段所需上下文:每个子代理实例只需加载当前阶段所需的最小上下文集合,无需了解全部历史。这种"按需加载"的方式极大提高了上下文利用效率。
核心要点:分段处理的核心哲学是"分而治之"——将大问题拆解为小问题,用多个独立的子代理分别解决,每个子代理只关注自己的一亩三分地,从而从根本上避免上下文窗口过载的问题。
五、实践建议
基于上述理论知识,以下是在实际开发和部署子代理时应当遵循的最佳实践建议。
- 给子代理的prompt保持精炼:系统提示是每次请求都会发送的固定开销,应当尽量精简。只包含必要的行为指令和角色定义,避免在系统提示中塞入冗长的示例或背景知识。
- 使用文件引用而非内嵌大量内容:当子代理需要参考大量背景资料时,使用文件路径引用而非直接将内容内嵌到上下文中。子代理可以在需要时通过工具调用读取具体文件,避免上下文被大量静态内容占用。
- 定期清理不再需要的上下文:在长时间运行的任务中,定期检查并清理不再需要的上下文内容。例如,已完成任务的中间结果、已处理的旧日志等,都应当及时从上下文中移除。
- 监控token使用量避免超限:在关键任务中,应当实时监控上下文窗口的token使用量,建立预警机制。当接近上限时,自动触发压缩策略或分段切换,防止因超出限制导致数据丢失。