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)工作流:

  • 通过prevs和nexts属性定义节点间依赖关系
  • 支持并行执行和条件分支逻辑
  • 结合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 dictstr, ActionNode 子节点字典
prevs/nexts listActionNode 前置/后置节点
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等)
  • 集成可视化工具展示节点执行流程
  • 增强异常处理和重试机制
  • 提供更多内置模板和填充策略

参考资源

相关推荐
2501_938140075 小时前
做内容很省心,2026好用AI笔记,支持抖音小红书视频无水印保存
人工智能
sell-cloud7 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国9 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI9 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区9 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris11 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy11 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V12 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI12 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技12 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人