1.概述
为了执行复杂多步任务,深度智能体可以创建专业的子智能体,并把相关任务委派给子智能体执行,一方面可以给子智能体设置专门的提示词,另一方面通过上下文隔离保持了主智能体上下文整洁性,从而解决上下文的膨胀问题。
在如下场景下应该使用子智能体:
1)复杂的多步任务生成很多的中间结果污染智能体的上下文
2)特定的业务领域,需要与该领域匹配的工具和提示词
3)需要根据实际需要选择使用不同的大模型
4)使主智能体专注于高层的沟通和协调工具
深度智能体自带一个通用子智能体。通用子智能体直接继承了深度智能体的大模型、工具和提示词。通用子智能体适合用于没有专业要求情况的上下文隔离,主智能体可以把一个复杂的多步任务委托给通用子智能体,并得到精简的应答,从而避免中间结果引起主智能体上下文的膨胀。
2.配置子智能体
在创建深度智能体时使用subagents配置子智能体。子智能体有两种形式,一种是字典格式定义,一种是用CompiledSubAgent,后者用于使用langgraph中的Graph。
2.1字典格式
使用字典格式定义子智能体时,有5个必选键,3个可选键。5个必选键如下:
1)name (str): 用于唯一标识子智能体。主智能体通过这个名字去调用task()
2)description (str): 说明子智能体能做什么,主智能体基于描述选择子智能体
3)system_prompt (str): 子智能体系统提示词,包括工具使用指南和输出格式说明
4)tools (List[Callable]): 子智能体可用工具列表。注意保持该表的最小化,仅保留子智能体必须使用的工具
3个可选键如下:
1)model (str | BaseChatModel): 用户指定子智能体使用的大模型。如果不指定,则使用主智能体的大模型
2)middleware (List[Middleware]): 子智能体中的中间件
3)interrupt_on (Dict[str, bool]): 针对针对特定的工具配置人机回环
以下示例用字典格式创建一个研究历史问题的子智能体,然后在创建深度智能体时传入。
首先创建搜索工具和大模型:
import os
from tavily import TavilyClient
from typing import Literalfrom langchain_openai import ChatOpenAI
os.environ["TAVILY_API_KEY"] = "tvly-*"
tavily_client = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])
from langchain.tools import tool
@tool
def internet_search(
query: str,
max_results: int = 5,
topic: Literal["general", "news", "finance"] = "general",
include_raw_content: bool = False,
):
"""Run a web search"""
return tavily_client.search(
query,
max_results=max_results,
include_raw_content=include_raw_content,
topic=topic,
)
llm = ChatOpenAI(
model = 'qwen-plus',
api_key = "sk-*",
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1")
第二,创建子智能体:
research_subagent = {
"name": "research-agent",
"description": "Used to research more in depth in history questions",
"system_prompt": "你是一位史学研究专家。你的工作是进行对历史问题进行透彻的研究,然后写一份专业的报告。您可以借助搜索工具从互联网收集信息作为你的研究素材.",
"tools": [internet_search],
}
subagents = [research_subagent,]
第三,创建深度智能体,并配置子智能体:
from deepagents import create_deep_agent
agent = create_deep_agent(
model=llm,
subagents=subagents
)
2.2 使用CompiledSubAgent
为了重用已经存在的实现了特定业务功能的工作流Graph或者智能体,则需要使用CompiledSubAgent对图进行封装,然后再创建深度智能体时传入。如下示例代码重用了一个现有的图:
from deepagents import create_deep_agent, CompiledSubAgent
your_subagent = CompiledSubAgent(
name="history-analyzer",
description="Specialized agent for complex history question analysis tasks",
runnable=your_graph
)subagents = [your_subagent]
agent = create_deep_agent(
model=llm,
subagents=subagents
)
3.子智能体实践
使用子智能体时需要遵循如下原则:
1)保证子智能体描述清晰准确。因为主智能体根据子智能体描述去选择使用哪一个子智能体,模糊的说明导致子智能体选择错误,甚至找不到。比如:
Used to research more in depth in history questions"
2)保证系统提示词详细。必须包括如何使用工具以及输出的格式要求。比如:
research_subagent = {
"name": "research-agent",
"description": "Conducts in-depth research using web search and synthesizes findings",
"system_prompt": """You are a thorough researcher. Your job is to:1. Break down the research question into searchable queries
2. Use internet_search to find relevant information
3. Synthesize findings into a comprehensive but concise summary
4. Cite sources when making claimsOutput format:
- Summary (2-3 paragraphs)
- Key findings (bullet points)
- Sources (with URLs)Keep your response under 500 words to maintain clean context.""",
"tools": [internet_search],
}
3)最小化可用工具集。仅保留必须使用的工具
4)根据需要为子智能体配置最合适的大模型
5)指示智能体返回汇总后的结果,不要返回原始数据。比如:
data_analyst = {
"system_prompt": """Analyze the data and return:
1. Key opinions (3-5)
2. With concise descrption
3. Recommended next actionsDo NOT include:
- Raw data
- Intermediate calculations
- Detailed tool outputsKeep response under 300 words."""
}
4.问题排查
下面是一些在使用子智能体过程中的常见问题及解决办法。
问题1:未调用子智能体
原因分析:因为子智能体的描述步清晰,所以主智能找不到能够委托的智能体,所以努力自己去处理任务
解决办法:
1)把子智能体的描述写清晰和准确
2)在深度智能体的提示词中明确要求智能体去把任务委托给子智能体,比如:
agent = create_deep_agent(
system_prompt="""...your instructions...IMPORTANT: For complex tasks, delegate to your subagents using the task() tool.
This keeps your context clean and improves results.""",
subagents=[...]
)
问题2:上下文持续膨胀
原因分析:子智能体返回结果过多
解决办法:
1)如果子智能体中间结果无用,则明确要求子智能体返回简洁、紧凑的结果。比如:
system_prompt="""...
IMPORTANT: Return only the essential summary.
Do NOT include raw data, intermediate search results, or detailed tool outputs.
Your response should be under 200words."""
2)如果子智能体中间结果用有,则需要使用持久化保存中间结果,比如:
system_prompt="""When you gather large amounts of data:
1. Save raw data to /data/interim_result.txt
2. Process and analyze the data
3. Return only the analysis summaryThis keeps context clean."""
问题3:子智能体选择错误,导致所托非人,不能完成预期的任务。
原因分析:多个子智能体描述类似,子智能体不能区分
解决办法:在保证子智能描述清晰的前提下,保证不同子智能体描述的差异最大化
1404

被折叠的 条评论
为什么被折叠?



