AI的未来 – AI Agent系列MetaGPT4.1 细说我在ActionNode实战中踩的那些坑

文章目录

    • 1. MetaGPT = 0.5.2 版本的坑
      • 1.1 坑一:cannot import name "ActionNode" from "metagpt.actions.action"
      • 1.2 坑二:simple_fill 没有参数 schema
      • 1.3 坑三:ActionNode一直在循环执行,
    • 2. 升级成 MetaGPT GitHub最新源码(2024-01-16)之后的坑
      • 2.1 坑一:no attribute '_rc'
      • 2.2 坑二:no attribute '_states'
      • 2.3 坑三:'gpt-4-1106-preview' does not exist or you do not have access to it
      • 2.4 坑四:A non-annotated attribute was detected: 'input_num = 0'

上篇文章 【AI的未来 - AI Agent系列】【MetaGPT】4. ActionNode从理论到实战 中我们学习了MetaGPT中ActionNode的理论和基本用法,跑通了一个简单程序。

原理和代码实现都很简单,但是谁知道当时我遇到了多少坑… 本文带你看看我在上文中遇到的坑,希望能帮到你!

下面说下我遇到的坑:

1. MetaGPT = 0.5.2 版本的坑

听信了官方教程中的MetaGPT版本推荐,我之前的学习和实战都使用了0.5.2版本,所以一开始,ActionNode的学习也使用的此版本。
在这里插入图片描述

1.1 坑一:cannot import name “ActionNode” from “metagpt.actions.action”

在这里插入图片描述

  • 不知道为什么0.5.2版本无法从"metagpt.actions.action"导入ActionNode,看源码中,action_nodes.py是存在的

在这里插入图片描述

  • 解决方案:改为从 metagpt.actions.action_node 导入 ActionNode
# from metagpt.actions.action import Action, ActionNode
from metagpt.actions.action import Action
from metagpt.actions.action_node import ActionNode

1.2 坑二:simple_fill 没有参数 schema

  • 查看0.5.2版本的源码,simple_fill 的输入参数还叫 ‘to’,不叫 ‘schema’

在这里插入图片描述

  • 解决方案:schema 改为 to
# child = await i.simple_fill(schema=schema, mode=mode)
child = await i.simple_fill(to=schema, mode=mode)

1.3 坑三:ActionNode一直在循环执行,

如下图:一直在输出,这个都是ActionNode内的打印。
在这里插入图片描述

这个坑,是在ActionNode中循环,退不到我的代码中,所以我无从下手解决。促使了我升级到最新github代码… 后来我在高版本中遇到类似问题,好像是因为结果校验不通过,触发了重试。

2. 升级成 MetaGPT GitHub最新源码(2024-01-16)之后的坑

2.1 坑一:no attribute ‘_rc’

在这里插入图片描述

  • 从0.6版本开始,_rc这种成员变量都换成了不带下划线的:‘rc’
  • 解决方案:将 ‘_rc’ 全部换成 ‘rc’

2.2 坑二:no attribute ‘_states’

在这里插入图片描述

  • 解决方法同’rc’,将’_states’ 改为 ‘states’

2.3 坑三:‘gpt-4-1106-preview’ does not exist or you do not have access to it

在这里插入图片描述

  • 原因:前面讲过,MetaGPT读取配置的顺序:key.yaml > config.yaml > 环境变量。当我升级到github最新代码,源码编译后,源码中存在了config.yaml文件,里面默认的配置是gpt4。MetaGPT默认使用了config.yaml,我的环境变量便被忽略了。
  • 解决方案:在config.yaml中设置自己的配置。或者新建一个key.yaml来写自己的配置

2.4 坑四:A non-annotated attribute was detected: ‘input_num = 0’

在这里插入图片描述
这个是因为升级0.6版本后,0.6版本的校验更加严格,这类内的成员变量必须显式声明类型,否则会报错。

  • 解决方案
class SimplePrint(Action):
    input_num: int = 0 ######## <------ 加上这一句,显式声明变量类型

    def __init__(self, name="SimplePrint", input_num:int=0):
        super().__init__()

        self.input_num = input_num

还有几个坑忘记截图了… 不过上面也基本够了,应该能帮你省不少事儿~~~