ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepSeek-Agent-Harness-2026终极指南-第12章第55节-子Agent与编排-agent-as-tool:子智能体模式实现

DeepSeek-Agent-Harness-2026终极指南-第12章第55节-子Agent与编排-agent-as-tool:子智能体模式实现 DeepSeek Agent Harness 2026终极指南 - 第12章第55节 agent-as-tool子智能体模式实现第11章上下文工程收官了。现在 Agent 是单兵作战——所有任务自己扛。但有些大任务单兵效率低既要查资料、又要写代码、还要审查一个上下文里角色太多会打架。这节进入第12章子Agent与编排先做 agent-as-tool把整个 Agent 包装成一个工具让父 Agent 能派子 Agent 去干活。这是从单人到团队的关键一跃。本文导航为什么单兵不够用agent-as-tool 的核心思想子 Agent 的独立上下文与工具子集结果摘要回传父级完整实现sub_agent.py实测父 Agent 派子 Agent 干活小结为什么单兵不够用单兵 Agent 有个天然问题一个上下文里角色太多会打架。比如一个复杂任务优化这个项目先要分析代码研究员角色再要改代码工程师角色最后要审查改动审查员角色如果全在一个 Agent 里做上下文会混入三种角色的思考模型容易精神分裂——一会儿分析、一会儿改、一会儿审查互相干扰。而且还有上下文污染问题研究员读代码时吐出的几千 token会一直留在上下文里干扰后续的改代码和审查。子 Agent 解决这个问题把不同任务拆给不同子 Agent各自独立上下文互不干扰。agent-as-tool 的核心思想核心思想把整个 Agent 包装成一个工具。父 Agent 像调用普通工具一样调用一个子 Agent 工具传给它一个任务拿回结果。工具/模型子Agent父Agent用户工具/模型子Agent父Agent用户优化这个项目分析需要代码审查调用子Agent(审查代码)独立上下文读代码、分析调用模型审查结果返回摘要综合结果 优化建议关键点子 Agent 有自己的独立上下文父 Agent 只看得到子 Agent 返回的摘要看不到子 Agent 内部的完整过程。子 Agent 的独立上下文与工具子集子 Agent 不是一个全新的东西——它复用了我们已经写好的 Agent Loop只是独立上下文自己的 messages 列表工具子集只给它必要的工具比如审查 Agent 只需要 read_file、grep不需要 write_file# deep_pilot/sub_agent.py —— 子Agent v0.7from__future__importannotationsfromtypingimportAnyfromdeep_pilot.clientimportclientfromdeep_pilot.loggerimportget_loggerfromdeep_pilot.tool_registryimportregistryfromdeep_pilot.tool_executorimportget_executor loggerget_logger(__name__)executorget_executor(registry)classSubAgent:子 Agent——独立上下文、工具子集、结果摘要def__init__(self,name:str,system_prompt:str,tool_names:list[str]|NoneNone):self.namename self.system_promptsystem_prompt self.tool_namestool_names# 允许使用的工具名列表None 表示全部defrun(self,task:str,max_iters:int8)-str: 运行子 Agent执行任务返回摘要结果。 使用独立上下文不复用父 Agent 的 messages。 # 独立上下文messages[{role:system,content:self.system_prompt},{role:user,content:task},]# 工具子集toolsself._get_tool_subset()foriterationinrange(1,max_iters1):logger.info(f[子Agent:{self.name}] 第{iteration}轮)respclient.chat(messages,toolstools)ifnotresp.tool_calls:returnresp.contentormessages.append({role:assistant,content:resp.content,tool_calls:resp.tool_calls,})importjsonfortcinresp.tool_calls:func_nametc[function][name]func_argsjson.loads(tc[function][arguments])resultexecutor.execute(func_name,func_args)messages.append({role:tool,tool_call_id:tc[id],content:result,})return[子Agent] 达到最大迭代次数def_get_tool_subset(self)-list[dict]:获取工具子集all_toolsregistry.to_openai_tools()ifself.tool_namesisNone:returnall_tools# 只保留允许的工具return[tfortinall_toolsift[function][name]inself.tool_names]结果摘要回传父级子 Agent 干完活返回的不是完整过程而是摘要。父 Agent 把摘要当作工具结果纳入自己的决策# 把子 Agent 包装成工具fromdeep_pilot.tool_registryimporttool# 创建子 Agentcode_reviewerSubAgent(namecode_reviewer,system_prompt你是资深代码审查员专注发现代码问题。审查时关注正确性、可读性、安全性、性能。输出格式列出每个问题的严重程度、位置、建议。,tool_names[read_file,grep,glob],# 只读工具)tooldefreview_code(path:str)-str: 审查指定路径的代码。返回审查结果摘要。 何时使用需要代码质量审查时。 参数path - 要审查的文件或目录路径 resultcode_reviewer.run(f请审查{path}的代码发现潜在问题并给出建议)returnresult这样父 Agent 就有了一个review_code工具——它内部其实是一个完整的子 Agent有自己的上下文用只读工具审查代码最后返回摘要。完整实现sub_agent.py# deep_pilot/sub_agent.py —— 完整版from__future__importannotationsimportjsonfromtypingimportAnyfromdeep_pilot.clientimportclientfromdeep_pilot.loggerimportget_loggerfromdeep_pilot.tool_registryimportregistryfromdeep_pilot.tool_executorimportget_executor loggerget_logger(__name__)executorget_executor(registry)classSubAgent:def__init__(self,name:str,system_prompt:str,tool_names:list[str]|NoneNone):self.namename self.system_promptsystem_prompt self.tool_namestool_namesdefrun(self,task:str,max_iters:int8)-str:messages[{role:system,content:self.system_prompt},{role:user,content:task},]toolsself._get_tool_subset()foriterationinrange(1,max_iters1):logger.info(f[子Agent:{self.name}] 第{iteration}轮)respclient.chat(messages,toolstools)ifnotresp.tool_calls:returnresp.contentormessages.append({role:assistant,content:resp.content,tool_calls:resp.tool_calls,})fortcinresp.tool_calls:func_nametc[function][name]func_argsjson.loads(tc[function][arguments])resultexecutor.execute(func_name,func_args)messages.append({role:tool,tool_call_id:tc[id],content:result,})return[子Agent] 达到最大迭代次数def_get_tool_subset(self)-list[dict]:all_toolsregistry.to_openai_tools()ifself.tool_namesisNone:returnall_toolsreturn[tfortinall_toolsift[function][name]inself.tool_names]实测父 Agent 派子 Agent 干活uv run python-c import deep_pilot.tools # 触发工具注册 from deep_pilot.sub_agent import SubAgent # 创建代码审查子Agent reviewer SubAgent( namecode_reviewer, system_prompt你是资深代码审查员发现代码问题并给建议。输出格式每个问题标注[严重程度]、位置、建议。, tool_names[read_file, grep, glob], ) # 子Agent审查代码 result reviewer.run(请审查 test_math.py 的代码质量) print(f审查结果: {result}) 控制台输出精简2026-09-13 17:00:01 | INFO | sub_agent | [子Agent:code_reviewer] 第 1 轮 2026-09-13 17:00:01 | INFO | sub_agent | [子Agent:code_reviewer] 第 2 轮 审查结果: [建议] test_math.py:1-3 - add 函数缺少类型注解建议加上参数和返回类型 [建议] test_math.py:5-8 - 测试用例未覆盖边界情况如 add(0,0)、add(-1,1)子 Agent 独立完成了审查读文件、分析问题、给出建议整个过程在它自己的上下文里没有污染父 Agent。小结单兵的问题一个上下文里角色打架、上下文污染大任务效率低。agent-as-tool把整个 Agent 包装成工具父 Agent 像调工具一样派子 Agent 干活。独立上下文子 Agent 用自己的 messages不复用父 Agent 的避免污染。工具子集子 Agent 只给必要的工具审查员只读不给 write_file最小权限。结果摘要回传父 Agent 只看子 Agent 的摘要看不到内部完整过程。复用 Agent Loop子 Agent 不是新代码复用第8章的 whiletool_calls 循环。DeepPilot v0.7 子 Agent 模式完成——从单人到团队大任务可以分工了。下节预告子 Agent 能干活了但现在是串行——一个接着一个。如果三个子 Agent审查、测试、优化能同时跑效率翻倍。下一节做并行子 Agent用 asyncio 并发执行多个子 Agent控制并发数、聚合部分失败的结果。三个 Agent 并行审查代码实测耗时对比。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中关注不迷路~
返回列表