二、架构核心:Fork 与 Isolated 双模式原理对比

1. Isolated 模式(物理隔离)

  • 特点:子智能体拥有全新的空白上下文窗口,仅接收主控传递给它的任务描述(Task Description)。
  • 流程图示
  [Supervisor (带丰富上下文)]
         │ (只传递 Task Prompt)
         ▼
  [Subagent (空白 Context)] ──> 缺少背景,反复调用工具探索 ──> 输出结果
  • 优缺点
  • ✅ 优点:绝对无偏见,上下文完全干净。
  • ❌ 缺点:必须自行重新建立上下文认知,大量消耗探索性工具调用轮次。

2. Fork 模式(分支继承)

  • 特点:子智能体直接克隆主控截至当前的完整对话历史,但在其分支完成任务后,结果会被压缩折叠(Unwind)回主控。
  • 流程图示
  [Supervisor (历史上下文 A + B + C)]
         │ (克隆全部上下文,剥离末尾工具调用)
         ▼
  [Subagent (完整上下文 A + B + C)]
         │ 100% 命中底层 Prompt Caching (KV Cache)
         │ 直接在断点处执行代码修改与验证
         ▼
  [最终结论] ──(折叠 Unwind 为单条 Tool Result)──> 返回给 Supervisor 主干
  • 反直觉的性能红利

很多同学以为“传更多上下文肯定更贵更慢”。其实大错特错!

现代大模型(Claude、GPT-4o、DeepSeek 等)全部支持 Prompt Caching。因为 Fork 模式下的前缀与主控刚才调用的请求 100% 相同,大模型直接复用 GPU 显存中的 KV Cache:

  • 输入 Token 费用直降 80% ~ 90%
  • 首字响应时间(TTFT)大幅缩短;
  • 子 Agent 不需要反复调用工具读取文件,端到端执行步骤减少了一半以上!

三、四大典型角色选型决策表

那么在实际项目中,到底该怎么给子 Agent 配置模式呢?直接参考下表:

| 子 Agent 角色类型 | 典型应用场景 | 推荐上下文模式 | 关键选型理由 |

| :--- | :--- | :---: | :--- |

| Worker (实施工作者) | 顺着排查结果写代码、改配置、补单测 | fork | 必须无缝承接主控摸排到的证据,消除探索浪费,享受 KV Cache 减免。 |

| Verifier (独立审查者) | 检查代码 Diff、安全审计、向后兼容性检查 | isolated | 必须斩断主控的主观推断,杜绝“先入为主”的偏见,保证客观裁决。 |

| Researcher (并发调研员) | 并发调研多个生僻类库、新版 API 差异 | isolated | 各任务自包含,防止多路并发克隆导致内存与上下文无意义膨胀。 |

| Memory (长期记忆体) | 从交互中抽取用户偏好、长期架构约束 | fork | 对话历史本身就是待分析的原始数据,无需主控二道转述。 |


四、工程实操:在项目中快速落地 Context Mode

下面我们给出一套轻量化的上下文模式编排参考实现:

"""
Multi-Agent Context Mode 编排参考示例
展示如何基于任务属性动态分流 fork 与 isolated
"""
from typing import Dict, Any, List
import copy

class AgentHarness:
    def __init__(self, supervisor_context: List[Dict[str, Any]]):
        self.supervisor_history = supervisor_context

    def spawn_subagent(
        self, 
        role_name: str, 
        task_instruction: str, 
        mode: str = "isolated"
    ) -> Dict[str, Any]:
        """
        根据指定模式派生子智能体
        :param role_name: 角色名称 (worker, verifier, etc.)
        :param task_instruction: 核心任务指令
        :param mode: 'fork' 或 'isolated'
        """
        if mode == "fork":
            # 1. 继承主控上下文副本
            subagent_history = copy.deepcopy(self.supervisor_history)
            
            # 2. 剥离末尾的 Tool Call (如果有)
            if subagent_history and subagent_history[-1].get("role") == "assistant":
                subagent_history[-1].pop("tool_calls", None)
            
            # 3. 注入明确的垂直角色前置提示与任务
            subagent_history.append({
                "role": "user",
                "content": f"[Subagent Role: {role_name}]\nDirective: {task_instruction}"
            })
            
            print(f"[{role_name}] 采用 Fork 模式启动,继承上下文 Token 数: 充足 (享 Prompt Caching)")
            # 执行子智能体多轮自闭环推理与工具交互...
            subagent_final_output = self._run_agent_loop(subagent_history)
            
            # 4. 关键:折叠 (Unwind) 结果,仅作为单次结果返回
            return {
                "role": "tool",
                "tool_call_id": "spawn_" + role_name,
                "content": subagent_final_output
            }

        elif mode == "isolated":
            # 纯净启动,仅注入当前任务与严格的无偏 Prompt
            subagent_history = [
                {
                    "role": "system",
                    "content": f"You are an independent {role_name}. Evaluate strictly based on facts without prior assumptions."
                },
                {
                    "role": "user",
                    "content": task_instruction
                }
            ]
            print(f"[{role_name}] 采用 Isolated 模式启动,零上下文偏见")
            subagent_final_output = self._run_agent_loop(subagent_history)
            
            return {
                "role": "tool",
                "tool_call_id": "spawn_" + role_name,
                "content": subagent_final_output
            }
        else:
            raise ValueError(f"Unknown context mode: {mode}")

    def _run_agent_loop(self, messages: List[Dict[str, Any]]) -> str:
        # 模拟执行子智能体
        return "执行完毕,已达成预期产出。"

五、实战总结与最佳避坑指南

  1. 别做“两个乐观主义者互相点头”的假审查

凡是负责 Lint、测试用例通过率、代码质量检查的 Subagent,严禁使用 Fork 模式!一旦审查者知道了编写者的思路,就会默认顺水推舟,漏掉核心边界 Bug。

  1. 利用 Fork 终结代码探查内耗

让 Worker 去修改代码时,大胆开启 Fork 模式,现代大模型的 KV Cache 机制会帮你把成本压到最低,同时直接将前序推导作为前缀,开发效率立竿见影。

  1. 终局一定要折叠(Unwind)

无论子 Agent 跑了多少轮,回到主控时必须只留一条纯粹的结果,杜绝把子任务推演过程反向污染主干。


结语:在多智能体系统开发中,架构的核心不是堆砌 Prompt,而是对上下文流向与状态机进行精细编排。希望本篇拆解能为大家在构建自己的 Agent 调度器时带来实质启发!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐