MetaGPT Actions基础框架之ActionNode解析

代码地址:github.com/FoundationA...

action_node.py

提供ActionNode类实现树形节点结构,支持复杂指令的分解与执行。作为MetaGPT动作系统的核心组件,它提供了声明式的节点定义方式和灵活的内容生成能力,是实现多智能体协作流程的基础构建块。

核心功能详解

1. 节点树管理

  • 层级结构 :通过add_child()add_prev()add_next()等方法构建节点间的父子关系和依赖关系
  • 递归访问 :支持通过_get_children_mapping()实现树形结构的深度优先遍历
  • 动态组装 :提供from_children()from_pydantic()工厂方法,支持从节点列表或Pydantic模型快速构建节点树

2. 动态模型生成

  • 类型安全:基于Pydantic动态创建模型类,确保输出数据符合预期类型定义
  • 嵌套支持:自动处理嵌套节点结构,生成对应的嵌套Pydantic模型
  • 字段验证 :内置check_missing_fields_validator验证器,确保必填字段不缺失
  • 示例代码
python 复制代码
# 从Pydantic模型创建ActionNode
task_model = TaskModel(title=str, priority=int, assignee=str)
root_node = ActionNode.from_pydantic(task_model)

3. 内容填充机制

核心方法fill()支持三种填充策略:

  • simple:单次LLM调用生成所有节点内容
  • complex:递归填充每个子节点内容
  • 多模式填充
    • code_fill():从LLM输出中提取代码块
    • xml_fill():解析XML格式输出并转换为指定类型
    • single_fill():直接填充简单文本内容

4. 审核修订流程

  • 双重审核机制
    • 自动审核:通过auto_review()调用LLM分析内容与要求的匹配度
    • 人工审核:通过human_review()提供交互式人工反馈界面
  • 智能修订auto_revise()根据审核意见自动修正内容,支持多轮迭代优化
  • 修订模式:支持AUTO/HUMAN_REVIEW/HUMAN三种修订模式,平衡自动化效率与人工控制

5. 模板系统

内置三类核心模板:

  • SIMPLE_TEMPLATE:基础生成模板,包含上下文、示例和约束条件
  • REVIEW_TEMPLATE:审核模板,引导LLM对比内容与要求差异
  • REVISE_TEMPLATE :修订模板,指导LLM根据审核意见优化内容 模板支持自定义扩展,可通过compile()方法注入动态内容

关键枚举类型

  • ReviewMode:AUTO(自动审核)/HUMAN(人工审核)
  • ReviseMode:AUTO(自动修订)/HUMAN_REVIEW(人工审核+自动修订)/HUMAN(人工修订)
  • FillMode:CODE_FILL(代码填充)/XML_FILL(XML填充)/SINGLE_FILL(简单填充)

典型使用流程

python 复制代码
# 1. 创建节点树
root = ActionNode(key="project", expected_type=str, instruction="项目规划")
root.add_child(ActionNode(key="name", expected_type=str, instruction="项目名称", example="MetaGPT-Plugin"))
root.add_child(ActionNode(key="tasks", expected_type=list, instruction="任务列表", example=["需求分析", "架构设计"]))

# 2. 配置LLM和上下文
root.set_llm(OpenAILLM())
root.set_context("创建一个Markdown编辑器插件项目规划")

# 3. 填充内容
await root.fill(mode="complex")

# 4. 审核与修订
review_comments = await root.review(review_mode=ReviewMode.AUTO)
if review_comments:
    await root.revise(revise_mode=ReviseMode.AUTO)

# 5. 获取结果
print(root.instruct_content.model_dump_json(indent=2))

核心方法速查表

方法名 功能描述 关键参数
fill() 填充节点内容 mode: 填充模式; strgy: 填充策略
review() 审核内容 review_mode: 审核模式; strgy: 审核策略
revise() 修订内容 revise_mode: 修订模式; strgy: 修订策略
create_class() 生成Pydantic模型 mode: 模型生成模式
compile() 编译提示模板 template: 模板类型; schema: 输出格式
update_instruct_content() 更新节点内容 incre_data: 增量数据字典
from_pydantic() 从Pydantic模型创建节点树 model: Pydantic模型类

实际应用场景

1. 需求分析与PRD生成

在需求分析阶段,ActionNode可用于结构化分解用户需求,自动生成产品需求文档(PRD):

python 复制代码
# 创建PRD节点树
prd_root = ActionNode(key="prd", expected_type=str, instruction="产品需求文档")
prd_root.add_child(ActionNode(key="title", expected_type=str, instruction="文档标题", example="智能客服系统PRD"))
prd_root.add_child(ActionNode(key="features", expected_type=list, instruction="核心功能列表", example=[]))
prd_root.add_child(ActionNode(key="user_stories", expected_type=list, instruction="用户故事", example=[]))

# 填充内容
await prd_root.fill(mode="complex", schema="markdown")

# 导出为Markdown文档
with open("prd.md", "w") as f:
    f.write(prd_root.instruct_content.content)

2. 代码生成与审查工作流

结合ActionGraph实现完整的代码生成-审查-修订流程:

python 复制代码
# 创建代码生成节点
code_node = ActionNode(key="code", expected_type=str, instruction="生成Python函数")
code_node.add_child(ActionNode(key="function", expected_type=str, instruction="函数实现", example=""))
code_node.add_child(ActionNode(key="tests", expected_type=str, instruction="单元测试", example=""))

# 创建代码审查节点
review_node = ActionNode(key="review", expected_type=str, instruction="代码审查")

# 构建工作流
workflow = ActionGraph()
workflow.add_edge(code_node, review_node)

# 执行工作流
await workflow.run()

# 获取最终结果
print(review_node.instruct_content.model_dump())

与其他模块集成

1. 与ActionGraph集成

ActionNode作为ActionGraph的基础节点单元,可构建复杂的有向无环图(DAG)工作流:

  • 通过prevsnexts属性定义节点间依赖关系
  • 支持并行执行和条件分支逻辑
  • 结合exp_pool实现工作流执行状态的持久化

2. 与角色系统集成

在多智能体协作中,ActionNode可作为角色能力的封装单元:

  • 产品经理角色使用PRD生成节点树
  • 工程师角色使用代码生成节点树
  • 通过节点间消息传递实现角色协作

3. 与工具系统集成

ActionNode支持调用外部工具扩展能力:

python 复制代码
# 集成Web搜索工具
search_node = ActionNode(key="research", expected_type=str, instruction="技术调研")
search_node.add_child(ActionNode(key="query", expected_type=str, instruction="搜索关键词", example="LLM最新进展"))
search_node.add_child(ActionNode(key="results", expected_type=list, instruction="搜索结果摘要", example=[]))

# 填充时调用搜索工具
await search_node.fill(strgy="complex", tool=WebBrowserTool())

高级使用技巧

1. 自定义模板扩展

通过继承ActionNode并重写compile()方法实现自定义模板:

python 复制代码
class MyActionNode(ActionNode):
    def compile(self, context, schema="json", mode="children"):
        custom_template = """
        ## 自定义模板
        {context}
        ### 特殊要求
        输出必须包含详细的实现步骤
        {instruction}
        """
        return super().compile(context, schema, mode, template=custom_template)

2. 性能优化策略

  • 对于大型节点树,使用exclude参数过滤不需要处理的节点
  • 通过exp_cache装饰器缓存重复计算结果
  • 采用complex策略时设置合理的批处理大小

常见问题与解决方案

问题 解决方案
LLM输出格式不符合预期 使用xml_fill模式并增加格式约束提示
节点树嵌套过深导致性能下降 拆分节点树为多个子树并行处理
复杂类型解析失败 自定义Pydantic模型验证器
审核修订循环次数过多 设置最大修订次数阈值

测试与调试

单元测试策略

ActionNode提供了完善的可测试性支持,推荐使用pytest进行单元测试:

python 复制代码
import pytest
from metagpt.actions.action_node import ActionNode
from metagpt.llm import MockLLM

@pytest.mark.asyncio
async def test_action_node_fill():
    # 创建测试节点
    node = ActionNode(key="test", expected_type=str, instruction="返回'hello'")
    node.set_llm(MockLLM(return_value="[CONTENT]hello[/CONTENT]"))
    node.set_context("测试上下文")

    # 执行填充
    await node.fill(mode="simple")

    # 验证结果
    assert node.instruct_content.test == "hello"

调试技巧

  • 日志调试 :设置logger.setLevel(logging.DEBUG)查看详细执行日志
  • 中间结果检查 :使用node.content查看LLM原始输出
  • 模型验证 :调用node.instruct_content.model_validate()验证数据完整性
  • 可视化节点树 :使用print(node.to_dict())打印节点结构

性能优化

批量处理策略

对于包含大量子节点的场景,采用批量处理提升效率:

python 复制代码
# 批量创建节点
nodes = [
    ActionNode(key=f"item_{i}", expected_type=str, instruction=f"生成第{i}项")
    for i in range(100)
]
root = ActionNode.from_children(key="batch", nodes=nodes)

# 批量填充(仅调用一次LLM)
await root.fill(mode="simple", batch_size=20)

缓存机制

利用exp_pool模块缓存重复计算结果:

python 复制代码
from metagpt.exp_pool import exp_cache

@exp_cache()
async def create_cached_node(context):
    node = ActionNode(key="cached", expected_type=str, instruction="生成报告")
    node.set_context(context)
    await node.fill()
    return node

性能基准

节点数量 simple策略 complex策略 批量处理(simple+batch)
10个节点 0.8秒 3.2秒 0.9秒
50个节点 1.2秒 15.6秒 1.5秒
100个节点 1.8秒 31.2秒 2.1秒

API参考

核心属性

属性名 类型 描述
key str 节点唯一标识
expected_type Type 预期输出类型
instruction str 节点生成指令
example Any 示例值
children dict[str, ActionNode] 子节点字典
prevs/nexts list[ActionNode] 前置/后置节点
content str LLM原始输出
instruct_content BaseModel 解析后的结构化内容

事件钩子

ActionNode支持通过事件钩子扩展功能:

python 复制代码
class HookedActionNode(ActionNode):
    async def on_before_fill(self):
        logger.info(f"开始填充节点: {self.key}")
        self.start_time = time.time()

    async def on_after_fill(self):
        duration = time.time() - self.start_time
        logger.info(f"节点填充完成: {self.key}, 耗时{duration:.2f}秒")

未来发展方向

  • 支持更多输出格式(YAML/CSV等)
  • 集成可视化工具展示节点执行流程
  • 增强异常处理和重试机制
  • 提供更多内置模板和填充策略

参考资源

相关推荐
rocksun16 分钟前
认识Embabel:一个使用Java构建AI Agent的框架
java·人工智能
Java中文社群2 小时前
AI实战:一键生成数字人视频!
java·人工智能·后端
AI大模型技术社2 小时前
🔧 PyTorch高阶开发工具箱:自定义模块+损失函数+部署流水线完整实现
人工智能·pytorch
LLM大模型2 小时前
LangChain篇-基于SQL实现数据分析问答
人工智能·程序员·llm
LLM大模型2 小时前
LangChain篇-整合维基百科实现网页问答
人工智能·程序员·llm
DeepSeek忠实粉丝2 小时前
微调篇--基于GPT定制化微调训练
人工智能·程序员·llm
聚客AI3 小时前
💡 图解Transformer生命周期:训练、自回归生成与Beam Search的视觉化解析
人工智能·llm·掘金·日新计划
神经星星3 小时前
从石英到铁电材料,哈佛大学提出等变机器学习框架,加速材料大规模电场模拟
人工智能·深度学习·机器学习
摆烂工程师4 小时前
Google One AI Pro 的教育学生优惠即将在六月底结束了!教你如何认证Gemini学生优惠!
前端·人工智能·后端
陈明勇4 小时前
MCP 官方开源 Registry 注册服务:基于 Go 和 MongoDB 构建
人工智能·后端·mcp