learn claude code学习记录-S04

当 agent 连续做很多事时,messages 会越来越长。

如果这些中间过程都永久堆在父对话里,后面的问题会越来越难回答,因为上下文被大量局部任务的噪声填满了。

这就是子智能体要解决的问题:

把局部任务放进独立上下文里做,做完只把必要结果带回来。

1. 子代理

什么是"父智能体"

当前正在和用户对话、持有主 messages 的 agent,就是父智能体。

什么是"子智能体"

父智能体临时派生出来,专门处理某个子任务的 agent,就是子智能体。

什么叫"上下文隔离"

意思是:

  • 父智能体有自己的 messages
  • 子智能体也有自己的 messages
  • 子智能体的中间过程不会自动写回父智能体

1.1 最小心智模型

复制代码
Parent agent
  |
  | 1. 决定把一个局部任务外包出去
  v
Subagent
  |
  | 2. 在自己的上下文里读文件 / 搜索 / 执行工具
  v
Summary
  |
  | 3. 只把最终摘要或结果带回父智能体
  v
Parent agent continues

最重要的点只有一个:

子智能体的价值,不是"多一个模型实例"本身,而是"多一个干净上下文"。

1.2 最小实现

(1)给父智能体一个 task 工具(claude code中是Agent工具)

父智能体需要一个工具,让模型可以主动说:

"这个子任务我想交给一个独立上下文去做。"

最小 schema 可以非常简单:

python 复制代码
{
    "name": "task",
    "description": "Run a subtask in a clean context and return a summary.",
    "input_schema": {
        "type": "object",
        "properties": {
            "prompt": {"type": "string"}
        },
        "required": ["prompt"]
    }
}

(2)子智能体使用自己的消息列表

python 复制代码
def run_subagent(prompt: str) -> str:
    sub_messages = [{"role": "user", "content": prompt}]
    ...

(3)子智能体只拿必要工具

子智能体通常不需要拥有和父智能体完全一样的能力。

最小版本里,常见做法是:

  • 给它文件读取、搜索、bash 之类的基础工具
  • 不给它继续派生子智能体的能力

这样可以防止它无限递归。

(4)只把结果带回父智能体

子智能体做完事后,不把全部内部历史写回去,而是返回一段总结。

复制代码
return {
    "type": "tool_result",
    "tool_use_id": block.id,
    "content": summary_text,
}

(5)子智能体关键数据结构

python 复制代码
class SubagentContext:
    messages: list
    tools: list
    handlers: dict
    max_turns: int

解释一下:

  • messages:子智能体自己的上下文
  • tools:子智能体可以调用哪些工具
  • handlers:这些工具到底对应哪些 Python 函数
  • max_turns:防止子智能体无限跑

这就是最小子智能体的骨架。

(5)子智能体作用

用处 1:给父上下文减负

局部任务的中间噪声不会全都留在主对话里。

用处 2:让任务描述更清楚

一个子智能体接到的 prompt 可以非常聚焦:

  • "读完这几个文件,给我一句总结"
  • "检查这个目录里有没有测试"
  • "对这个函数写一个最小修复"
用处 3:让后面的多 agent 协作有基础

你可以把子智能体理解成多 agent 系统的最小起点。

先把一次性子任务外包做明白,后面再升级到长期 teammate、任务认领、团队协议,会顺很多。

1.3 从 0 到 1 的实现顺序

版本 1:空白上下文子智能体

先只实现:

  • 一个 task 工具
  • 一个 run_subagent(prompt) 函数
  • 子智能体自己的 messages
  • 子智能体最后返回摘要

这已经够了。

版本 2:限制工具集

给子智能体一个更小、更安全的工具集。

比如:

  • 允许 read_file
  • 允许 grep
  • 允许只读 bash
  • 不允许 task

版本 3:加入最大轮数和失败保护

至少补两个保护:

  • 最多跑多少轮
  • 工具出错时怎么退出

版本 4:再考虑 fork

只有当你已经稳定跑通前面三步,才考虑 fork。

1.4 Fork

前面的最小实现是:

  • 子智能体从空白上下文开始

这叫最朴素的子智能体。

但有时一个子任务必须知道父智能体之前在聊什么。

例如:

"基于我们刚才已经讨论出来的方案,去补测试。"

这时可以用 fork

  • 不是从空白 messages 开始
  • 而是先复制父智能体的已有上下文,再追加子任务 prompt
python 复制代码
sub_messages = list(parent_messages)
sub_messages.append({"role": "user", "content": prompt})

2. claude code实测

如下图是claude code中Agent工具的schema

下图为claude code调用Agent工具的情况,包括subagent_type, description, prompt

终端显示如下

相关推荐
Xpower 172 小时前
算法学习笔记 Day 1:迁移学习与域自适应(DANN/CORAL)
笔记·学习·算法
skywalk81632 小时前
https://www.voscreen.com/ 是一个非常好的学习英语的网站,请判断和总结它是怎样实现的?如果想复刻一个该网站,需要怎么做?
学习
后季暖2 小时前
agent学习笔记4
笔记·学习
凯尔萨厮2 小时前
Spring学习笔记(基于注解)
笔记·学习·spring
某风吾起3 小时前
通过mmwave studio配置TI毫米波雷达IWR1843的StaticConfig
嵌入式硬件·学习
EnglishJun3 小时前
ARM嵌入式学习(二十二)-- 操作系统的中断处理以及ioctl
学习
南無忘码至尊3 小时前
Unity学习90天-第3天-认识触屏输入(手游基础)并完成手机点击屏幕,物体向点击位置移动
学习·unity·c#·游戏引擎·游戏开发
青桔柠薯片3 小时前
从字符设备到平台驱动:IMX6ULL LED 与蜂鸣器驱动开发学习总结
驱动开发·学习·imx6ull
JACK的服务器笔记3 小时前
《服务器测试百日学习计划——Day19:PCIe自动检测脚本,用Python把lspci设备清点标准化》
服务器·python·学习