天工DeepResearchAgent 多步智能体类分析

类概述

MultiStepAgent是一个抽象基类,实现了基于ReAct框架的多步骤智能体核心逻辑。该类负责任务规划、工具调用、状态管理和结果生成的完整流程,支持流式输出、内存管理和代理协作等高级功能。

架构概览

managed_agents
0..*
«abstract»
MultiStepAgent
+model: Model
+tools: dict<str, Tool>
+memory: AgentMemory
+max_steps: int
+planning_interval: int
+managed_agents: dict<str, MultiStepAgent>
+run()
+_run_stream()
+_generate_planning_step()
+provide_final_answer()
#initialize_system_prompt()
#_step_stream()
ToolCallingAgent
CodeAgent
DeepResearcherAgent
AgentMemory
Model
Tool

核心属性

  • model: 语言模型实例,用于生成决策和规划
  • tools: 工具集合,以字典形式存储(名称->工具实例)
  • memory: 智能体内存系统,存储对话历史和执行步骤
  • max_steps: 最大执行步数限制(默认20步)
  • planning_interval: 规划步骤执行间隔
  • managed_agents: 可调用的子代理集合
  • prompt_templates: 各类提示模板(系统提示、规划提示、最终答案提示等)

主要方法解析

初始化方法 (__init__)

def __init__(self, tools: list[Tool], model: Model, prompt_templates: PromptTemplates | None = None, ...)
  • 初始化提示模板、工具和子代理
  • 设置内存系统和日志监控
  • 验证工具和代理名称唯一性
  • 配置回调函数和执行参数

运行流程 (run)

def run(self, task: str, stream: bool = False, reset: bool = True, ...)
  • 核心执行入口,支持流式/非流式输出
  • 初始化任务状态和内存
  • 根据stream参数选择同步执行或生成器模式
  • 返回最终结果或RunResult对象(包含详细执行信息)

流式执行 (_run_stream)

生成器方法,实现主要执行循环:

是
否
是
否
是
否
开始
达到最大步数?
生成最终答案
需要规划?
执行规划步骤
执行行动步骤
处理工具输出
是否最终答案?
步数+1
结束

执行流程详解:

  1. 按规划间隔执行规划步骤(初始步骤或间隔步骤)
  2. 执行行动步骤:思考→行动→观察的完整循环
  3. 处理工具输出和错误情况
  4. 检查终止条件(达到最大步数或获得最终答案)
  5. 生成最终答案并结束循环

规划机制 (_generate_planning_step)

  • 初始规划:基于任务和可用工具生成初始行动计划
  • 规划更新:根据执行历史动态调整计划
  • 支持流式规划输出和可视化

工具调用流程

  1. 行动生成:通过_step_stream(抽象方法)生成工具调用指令
  2. 参数解析:通过extract_action解析模型输出的行动指令
  3. 工具执行:调用对应工具并获取结果
  4. 结果处理:将工具输出存入内存并决定下一步行动

状态管理

  • memory属性存储完整执行历史(系统提示、任务、规划、行动、观察)
  • state字典维护运行时变量
  • step_number跟踪当前执行步数

结果生成 (provide_final_answer)

基于执行历史生成最终答案:

def provide_final_answer(self, task: str, images: list["PIL.Image.Image"] | None = None) -> ChatMessage
  • 构建最终答案生成提示
  • 调用模型生成格式化回答
  • 支持多模态输入(图像)

扩展能力

高级功能详解

流式输出机制

支持实时返回执行过程中的中间结果,通过生成器模式实现:

  • 规划步骤流式输出:实时返回规划思考过程
  • 工具调用流式输出:实时返回工具执行结果
  • 错误处理流式反馈:即时报告执行异常
内存管理策略

采用分层内存结构,优化长对话性能:

  • 短期记忆:存储最近执行步骤
  • 长期记忆:通过摘要机制压缩历史对话
  • 工具记忆:缓存工具调用结果避免重复计算

代理协作

代理协作

通过managed_agents属性支持子代理调用,实现能力组合:

def _setup_managed_agents(self, managed_agents: list | None = None) -> None
  • 子代理注册和验证
  • 自动生成子代理调用接口
  • 支持代理间参数传递

持久化与部署

  • save方法:将代理配置、工具和提示模板保存为可部署格式
  • push_to_hub:直接部署到Hugging Face Space
  • from_hub/from_folder:从Hub或本地文件夹加载代理
Hugging Face Hub 集成
  • 加载代理:使用 from_hub 方法从 Hub 加载预训练代理
    agent = MultiStepAgent.from_hub(
        repo_id="username/agent-repo",
        filename="agent.json"
    )
    
  • 上传代理:使用 push_to_hub 方法分享代理到 Hub
    agent.push_to_hub(
        repo_id="username/agent-repo",
        commit_message="Add financial analysis agent"
    )
    
配置文件说明

代理行为可通过TOML配置文件自定义(如configs/config_general.toml):

[agent]
max_steps = 20
stream_output = true

[model]
type = "openai"
name = "gpt-4"
temperature = 0.7

[tools]
enabled = ["python_interpreter", "web_search"]

关键参数说明:

  • max_steps: 最大执行步骤数
  • stream_output: 是否启用流式输出
  • temperature: 模型采样温度(0-1)

性能优化建议

  1. 工具缓存机制:对频繁调用的无状态工具(如Web搜索)实现结果缓存,减少重复API调用
  2. 异步执行:结合 async_multistep_agent.py 实现工具调用并行化,提升多步骤任务效率
  3. 内存优化:对长对话历史实现滑动窗口机制,只保留最近N步关键信息

测试策略

单元测试

针对核心组件进行独立测试:

# 测试工具调用解析
def test_extract_action():
    agent = MultiStepAgent(tools=[PythonInterpreterTool()])
    llm_output = "<|FunctionCallBegin|>[{"name":"python_interpreter","parameters":{"code":"1+1"}}]<|FunctionCallEnd|>"
    action = agent.extract_action(llm_output)
    assert action.name == "python_interpreter"

集成测试

验证完整任务执行流程:

def test_agent_run():
    agent = MultiStepAgent.from_folder("./agents/research_agent")
    result = agent.run("分析2023年AI领域研究热点")
    assert "最终答案" in result.content

异常处理

主要异常类型:

  • ToolNotFoundError: 工具未找到时抛出
  • InvalidActionError: 解析动作失败时抛出
  • MaxStepsReachedError: 达到最大步骤限制时抛出
  • LLMAPIError: 大语言模型调用失败时抛出

异常处理示例:

try:
    result = agent.run(task)
except MaxStepsReachedError:
    # 处理步骤超限情况
    result = agent.provide_final_answer("任务复杂,已尽力分析主要结果...")

扩展机制

自定义提示模板

通过继承PromptTemplates类修改系统提示:

class CustomPromptTemplates(PromptTemplates):
    planning = "自定义规划提示模板..."
    managed_agent = "自定义托管代理提示..."

agent = MultiStepAgent(prompt_templates=CustomPromptTemplates())

多代理协作

使用_setup_managed_agents方法配置子代理网络,实现复杂任务分工协作:

agent = MultiStepAgent(
    managed_agents=[
        ResearchAgent(),
        WritingAgent(),
        EditingAgent()
    ]
)

关键数据结构

  • RunResult:封装执行结果、状态、内存和性能指标
  • ActionStep/PlanningStep:记录执行步骤详情
  • PromptTemplates:结构化提示模板定义
  • TokenUsage/Timing:性能监控指标

使用示例

agent = MultiStepAgent(tools=[CalculatorTool()], model=MyModel())
result = agent.run("计算3.14的平方")
print(result)

继承关系

作为抽象基类,需要子类实现:

  • initialize_system_prompt:系统提示初始化
  • _step_stream:行动步骤生成逻辑

常见子类:ToolCallingAgent、CodeAgent等

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐