Sub-agent(子智能体/多智能体协作)完全是 AI 客户端或 Agent 框架(Client / Framework)层面的工程能力
大模型本身只负责"根据输入的 Token 预测下一个 Token",它没有"分身乏术"去自己开辟一个独立的运行环境并指挥另一个自己的能力。Sub-agent 的架构,全靠工程代码在幕后进行任务拆解、上下文隔离与状态调度。
一、 什么是 Sub-agent 架构?
在处理复杂任务时(例如:"帮我重构整个项目的代码,顺便写单元测试并跑通"),如果把所有事情都塞给一个主 Agent,它往往会因为注意力分散、工具太多或上下文过载而导致任务失败。
Sub-agent 架构(主从分工模式 / Coordinator-Worker Pattern) 的核心思想是:
- 主 Agent(Coordinator / Master): 负责宏观规划、任务拆解和统筹调度。它自己不一定亲自写每一行代码,而是当起"项目经理"。
- 子 Agent(Sub-agent / Worker): 负责某个垂直领域的专精任务(例如一个专门写测试的 Agent、一个专门查数据库的 Agent)。它们拥有独立的系统提示词(Persona)和专属的工具集。
二、 Sub-agent 是具体是如何实现的?
在工程实现上,主流框架(如 LangGraph、CrewAI、AutoGen 或自定义客户端)主要通过以下四大核心机制来实现 Sub-agent:
1. "Agent 即工具"(Agent-as-a-Tool)模式
这是最经典也是最容易理解的实现方式:
- 框架把一个 Sub-agent 封装成一个标准的 Tool(工具) 注册给主 Agent。
- 主 Agent 看大纲时,会看到一个名为
call_testing_specialist_agent(task_description: str)的工具。 - 幕后原理: 当主 Agent 决定调用这个工具时,它实际上并不是在调用一个简单的函数,而是触发了一段框架代码。
2. 独立的上下文隔离(Context Isolation)
这是 Sub-agent 最核心的工程价值:
- 如果子 Agent 和主 Agent 共用同一个 Context Window,随着对话深入,主 Agent 的上下文会迅速被子 Agent 复杂的中间推理过程(比如大量的临时报错和调试日志)污染。
- 实现方式:
- 当主 Agent 唤起 Sub-agent 时,客户端框架会新开辟一个干净的、独立的对话上下文(Fresh Context Session)。
- 框架只把主 Agent 传过来的"任务目标"和必要的初始化参数喂给子 Agent。
- 子 Agent 在自己的独立沙箱循环(ReAct Loop)里反复思考、调用工具、调试、直到得出结论。
3. 专属工具与权限裁剪(Scoped Toolsets)
- 主 Agent 可能拥有高危的全局工具(如
delete_database、deploy_to_production)。 - 实现方式: 框架在初始化 Sub-agent 时,会对其进行权限裁剪。例如:编写文档的 Sub-agent 只被允许挂载
read_file和write_markdown工具,它根本"看"不到也无法调用危险工具,从而保证系统的安全性。
4. 结果提炼与回传(Result Aggregation)
- Sub-agent 在自己的独立循环中运行结束后,往往会产生一大堆中间调试信息。
- 实现方式: 客户端框架会拦截子 Agent 的输出,通过代码逻辑(或者让子 Agent 做最后一次总结)将其浓缩为结构化的精简结论(例如:"测试已全部通过,发现 2 处潜在边界漏洞:......"),然后作为这个 Tool Call 的
tool_result返回给主 Agent。主 Agent 拿到结果后继续往下执行。
三、 简易的代码逻辑示意
如果用伪代码来描述一个 Sub-agent 的底层实现,它长这样:
python
# 1. 定义一个专门的子智能体处理函数(被包装成 Tool)
def call_code_reviewer_subagent(task: str) -> str:
# 核心:开辟独立的上下文和独立的 ReAct 循环
sub_agent_context = [
{"role": "system", "content": "你是一个资深代码评审专家,请严格检查安全漏洞。"}
]
sub_agent_context.append({"role": "user", "content": task})
for step in range(5): # 最多循环 5 步
response = call_llm(sub_agent_context, tools=[git_diff_tool, linter_tool])
if response.is_final_answer:
return response.text # 将精简结果返回给主 Agent
elif response.is_tool_call:
# 子 Agent 自己调用工具并观察结果
tool_result = execute_tool(response.tool_name, response.args)
sub_agent_context.append(tool_result)
# 2. 将其注册为主 Agent 的一个工具
main_agent_tools = [
# ... 其他普通工具 ...
Tool(
name="call_code_reviewer_subagent",
func=call_code_reviewer_subagent,
description="当你需要对代码进行深度安全评审时调用此工具"
)
]
总结
Sub-agent 并不是大模型"长出来的分身",而是 AI 客户端或框架通过代码设计出的"套娃式"状态机与上下文隔离机制。它通过"把子任务打包成工具、隔离上下文、裁剪权限",完美解决了大模型处理复杂大任务时的注意力涣散和 Token 污染问题。