claude code创建Subagent(子代理)的过程

  发布时间:2026-08-25 10:04:09   作者:LLHhaha   我要评论
在编程中,创建一个“Subagent”的概念可以有多种解释,这取决于你所使用的编程语言和上下文,本文介绍claude code创建Subagent(子代理)的过程,感兴趣的朋友一起看看吧

这里帮你把这段内容拆解成“是什么、为什么、怎么用”三个层次,方便理解记忆。

一、核心概念:Subagent 是什么?

你可以把 Subagent(子代理) 想象成你手下的一名临时专家员工

  • 独立办公室:它有自己的独立“办公室”(独立的上下文窗口),在里面干活不会弄乱你的办公桌(主对话上下文)。
  • 临时工性质:和它沟通只需一句话交代任务,它完成后只把“最终报告”拿回来给你,过程中的草稿、搜索记录、杂乱日志你都看不见。
  • 专业分工:你可以为反复做的同一类工作,定制一个专门的员工(自定义 Subagent),每次都用同样的指令,非常省事。

核心好处

  • 保留上下文:把繁杂的探索、搜索过程隔离在外,保持主对话清晰。
  • 强制执行约束:可以限制它只能用“眼睛”(只读工具),不能动手修改。
  • 复用配置:好的员工定义可以在所有项目里通用。
  • 控制成本:简单任务可以派给“实习生”(更快更便宜的模型,如 Haiku)。

二、什么时候用它?(使用时机)

遇到以下情况,就值得派一个 Subagent 出马:

  1. 任务会污染主对话:比如搜索一堆文件、分析大量日志,这些中间结果你事后根本不想再翻看。
  2. 有固定的重复工作:你总在重复“审查代码,然后给出改进建议”这种带固定指令的操作。

三、系统自带的“钦差大臣”(内置 Subagents)

Claude Code 有几个内置的“钦差大臣”,会自动启用。你可以先理解它们,再学怎么自定义。

内置 Agent角色比喻特点
Explore(探索者)侦察兵最常用。只读、快速,专门搜索分析代码库,不修改任何东西。工作时会跳过你的一些全局设置,以保证速度。
Plan(规划师)作战参谋同样只读、快速,用于规划任务,保持主对话干净。
General-purpose(通用)预备队继承主对话权限的通用代理,处理杂项任务。

四、如何创建自定义 Subagent?(快速上手版)

有两种方式,最简单的是用命令界面生成,就像填表招聘一样。

方法:使用/agents命令创建(类似填招聘表)

假设你要“招聘”一个专门审查代码的代理,步骤如下:

  1. 打开招聘界面:在 Claude Code 里运行命令 /agents
  2. 选择员工类型:切换到 Library(库) 标签,选 Create new agent -> Personal。这会把它存成你的“私人班底”,所有项目都能用。
  3. 口述职位描述:选 Generate with Claude,然后对它说:

    A code improvement agent that scans files and suggests improvements for readability, performance, and best practices. It should explain each issue, show the current code, and provide an improved version.
    (它会自动帮你生成这个代理的名字、描述和核心提示词。)

  4. 限定工作权限:在工具选择界面,只勾选只读工具(Read-only tools)。这样它就只能看,不能改。
  5. 指定能力级别:选择一个模型,比如 Sonnet,在分析能力和速度之间平衡。简单任务可选更快的 Haiku
  6. 选个工牌颜色:选个背景色,方便在界面上认出它。
  7. 决定是否记笔记User scope 选项是给它一个记事本(记忆目录),让它能在多次任务中积累经验。不需要就选 None
  8. 保存并上岗:按 s 保存。之后就可以直接派活:“用我新设的 code-improver 代理审查一下这个项目”。

这样,你就完成了一个自定义 Subagent 的全套创建和使用了。

扩展:ClaudeCode:子Agent的实现方式

ClaudeCode:子Agent的实现方式

模型在跑任务时,所有的上下文都保存在messages列表当中,当跑的任务数过多时,上下文会爆炸,虽然有上下文压缩机制,但是这种方式会将许多关键的信息丢失,导致模型忘记一些信息。而Claude Code使用subagent的方式,指派子agent干活,而不污染主对象。

核心思想

模型会分化子Agent, 主Agent只负责决策和派发任务到子Agent, 而子Agent将会在同一个全新的对话窗口中执行主Agent派发的任务,执行完毕后,主Agent负责接受子Agent的任务结果。通过这种方式,子Agent的上下文不会污染主Agent。

核心创新点

使用task,派生子Agent完成任务,而主Agent只负责决策和收集任务结果。

流程分析

那么Claude Code是怎么进行子Agent的分发的呢?我们一起来看下具体实现。

首先,Claude Code通过绑定派生子Agent工具来实现子Agent派生。

在这里,PARENT_TOOLS绑定的是主Agent的工具,而CHILD_TOOLS绑定的是子Agent的工具。

其中PARENT_TOOLSCHILD_TOOLS多了一个task工具:

PARENT_TOOLS = CHILD_TOOLS + [
    {"name": "task", "description": "Spawn a subagent with fresh context. It shares the filesystem but not conversation history.",
     "input_schema": {"type": "object", "properties": {"prompt": {"type": "string"}, "description": {"type": "string", "description": "Short description of the task"}}, "required": ["prompt"]}},
]

当大模型需要将任务派发给子Agent的时候,会返回tool_calls为task的任务,此时简短的prompt将会作为参数传递给子Agent, 触发以下代码片段:

# 代码片段:父代理的工具分发逻辑
if tool_name == "task":
    desc = tool_args.get("description", "subtask")
    prompt = tool_args.get("prompt", "")
    # 关键:在这里发生了控制权的转移
    output = run_subagent(prompt) 

其中run_subagent里面的代码和主agent的代码是相似的,简而言之,subagent就是主agent的拷贝。

sub_messages = [
        {"role": "system", "content": SUBAGENT_SYSTEM},
        {"role": "user", "content": prompt}
    ]  # fresh context with system message
for _ in range(30):  # safety limit
    chat_messages = convert_messages_to_chat_messages(sub_messages)
    response = child_client.invoke(chat_messages)
    assistant_dict = {
        "role": "assistant",
        "content": response.content,
        "tool_calls": response.tool_calls
    }
    sub_messages.append(assistant_dict)
    if not response.tool_calls:
        break
    for tool_call in response.tool_calls:
        tool_name = tool_call.get("name")
        tool_args = tool_call.get("args", {})
        tool_id = tool_call.get("id")
        handler = TOOL_HANDLERS.get(tool_name)
        output = handler(**tool_args) if handler else f"Unknown tool: {tool_name}"
        sub_messages.append({
            "role": "tool", 
            "content": str(output)[:50000],
            "tool_call_id": tool_id
        })
return response.content or "(no summary)"

不同的是,如果子agent如果达到最大30次调用后,会强制其返回。

到此这篇关于claude code创建Subagent(子代理)的过程的文章就介绍到这了,更多相关claude code创建Subagent内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

相关文章

最新评论