Subagents的上下文传递与管理

子代理上下文的传递与管理

一、上下文的重要性

子代理需要足够的上下文才能正确完成任务。与人类工作者类似,子代理依赖背景信息来理解任务意图、做出正确判断并生成高质量的输出。当上下文不足时,子代理可能产生错误的假设、遗漏关键约束条件、甚至完全偏离任务目标,导致返工和资源浪费。

另一方面,过多不必要的上下文同样存在问题。大语言模型的上下文窗口是有限的资源,传递冗余信息会浪费大量 token,不仅增加 API 调用成本,还会降低模型的注意力集中度,稀释关键信息的影响力。过长的上下文还可能导致模型在处理时出现"迷失在中间"的问题,即关键信息被大量无关细节淹没。

因此,合理的上下文管理是子代理高效工作的核心能力之一。需要在信息充分性和简洁性之间找到平衡点,确保每个子代理只获得与其任务相关且足够的上下文信息,从而达到最佳的工作效率和质量。

二、上下文传递的方式

子代理的上下文可以通过多种方式进行传递,不同的传递方式适用于不同的场景和需求。合理选择和组合这些方式,可以显著提升子代理的工作效果。

通过 Agent prompt 参数传递初始上下文

这是最基础的上下文传递方式,适合传递全局性的项目信息和行为准则。在创建 Agent 时,通过 prompt 参数设定其角色定位、基本规则和通用能力描述。这种上下文的优势在于持久性——它伴随 Agent 的整个生命周期,成为子代理行为的底层指导。但需要注意,prompt 内容不宜过长,否则会影响后续任务的灵活性。

通过 TaskCreate 描述传递任务上下文

每个具体任务在创建时都可以附带详细的描述信息,这是传递任务级上下文的主要方式。TaskCreate 的描述通常包含任务目标、具体要求、输入数据格式和期望的输出形式。这种方式的优势是精确性——每个任务都可以获得量身定制的上下文,且不会与其他任务混淆。

通过共享文件提供项目信息

对于大型的、结构化的参考数据(如项目文档、API 规范、代码库等),将它们写入文件并通过文件引用传递给子代理是最有效的方式。子代理可以在需要时读取这些文件,而不必把所有内容塞入 prompt。文件共享方式减少了 prompt 中的 token 消耗,同时保持了信息的完整性和可访问性。

通过 SendMessage 传递动态上下文更新

在任务执行过程中,父 Agent 可以通过 SendMessage 实时向子代理补充新的上下文信息。这种方式的优势是时效性——当项目状态发生变化或出现新的需求时,可以立即将更新传递给正在工作的子代理。动态上下文更新是保持子代理信息同步的重要手段,特别适合需要频繁调整的多步骤任务。

三、上下文的内容组成

有效的上下文应该层次分明、内容精准,通常包含以下几个核心组成部分。合理组织和编排这些内容,可以帮助子代理快速定位和利用所需信息。

项目基本信息

包括项目名称、所使用的技术栈、整体架构设计、代码仓库地址等。这些信息帮助子代理理解自己所处的环境和上下文,避免因缺乏背景知识而做出不兼容的技术决策。

任务目标

具体说明子代理需要完成的工作内容和预期成果。清晰的任务目标应该包含可衡量的成功标准、优先级信息和截止时间。目标越具体,子代理的产出越符合预期。

约束条件

明确子代理不能做什么以及必须遵循的规则。例如,不能修改哪些文件、必须使用特定的代码风格、需要遵循的安全规范等。约束条件可以有效防止子代理做出不恰当的行为,是保证输出质量的重要防线。

参考信息

提供相关的文档链接、编码规范、API 接口说明、示例代码片段等。参考信息让子代理能够基于权威数据做出判断,而不是依赖模型训练数据中的通用知识。对于专业性较强的任务,良好的参考信息可以显著提升输出质量。

结果格式要求

规定子代理输出结果的格式和结构。例如,要求返回 JSON 格式的数据、按指定的 Markdown 模板书写文档、遵循特定的代码注释规范等。格式要求可以减少后处理的工作量,确保多个子代理的输出风格统一。

四、上下文的隔离和独立性

每个子代理拥有独立的上下文窗口,这是子代理架构的核心设计原则之一。这种隔离机制确保了并行任务之间不会相互干扰,为系统带来了可靠性和可预测性。

独立上下文的核心优势在于:一个子代理的上下文内容不会被其他子代理意外污染或篡改。即使某个子代理接收到了错误的指令或产生了幻觉,问题也被限制在单个子代理范围内,不会像多米诺骨牌一样波及整个系统。这种故障隔离机制对于构建可靠的 AI 应用至关重要。

独立上下文还意味着子代理可以专注于自己的任务,不需要了解全局的每一个细节。这种专注降低了每个子代理的信息处理负担,使其能够在有限的上下文窗口中更高效地工作。从认知负荷的角度看,限定范围的上下文有助于子代理保持清晰的思路和准确的方向感。

此外,通过 worktree 机制可以实现文件级别的上下文隔离。每个子代理可以在独立的文件系统分支中工作,拥有专属的工作目录和文件副本。这种隔离方式进一步减少了上下文冲突的可能性,让并行任务可以安全地操作同一组文件而不会产生版本冲突。

五、上下文优化策略

在子代理的上下文管理中,优化策略直接关系到系统的效率和经济性。以下是几种经过实践验证的有效优化方法。

传递必要的上下文,避免信息过载

遵循"最小必要知识"原则——只传递子代理完成任务所必需的信息。在向子代理传递上下文之前,先对信息进行筛选和精简,去除冗余和无关内容。每一条上下文都应该有明确的用途和存在的理由。

使用文件引用传递大型上下文

当需要传递大型代码文件、完整文档或数据库结构等大型上下文时,使用文件引用语法 {{FILE:path}} 是最佳实践。这种方式允许子代理在需要时按需加载文件内容,而不是将所有内容都塞入 prompt 中。文件引用既节省了 token 资源,又保持了信息的完整可访问性。

定期更新上下文,保持信息新鲜度

随着项目的推进,原有的上下文可能变得过时或不准确。定期审查和更新子代理的上下文信息,删除不再适用的约束条件,补充新的项目变化,可以确保子代理始终基于最新的信息做出决策。对于长时间运行的任务,上下文更新尤为重要。

任务完成后的上下文清理

当子代理完成其任务后,及时释放和清理其上下文资源可以减少系统整体的资源占用。在复杂的多步骤工作流中,合理管理上下文的生命周期——何时创建、何时更新、何时销毁——是保持系统健康运行的关键。

分层上下文设计

将全局上下文和任务特定上下文分层管理,可以进一步优化 token 使用效率。全局上下文(如项目规范和团队约定)在 Agent 创建时一次性注入,任务上下文则在每个任务实例化时动态追加。这种分层模式避免了重复传递相同信息,在大规模任务调度中能够显著降低总 token 消耗。