模型智能体开发之metagpt-多智能体实践

参考:

  1. metagpt环境配置参考
  2. 模型智能体开发之metagpt-单智能体实践

需求分析

  1. 之前有过单智能体的测试case,但是现实生活场景是很复杂的,所以单智能体远远不能满足我们的诉求,所以仍然还需要了解多智能体的实现。通过多个role对动作的关联、组合来构建一个工作流程,从而使智能体能够完成更加复杂的任务
  2. 基于单智能体测试case的扩展,我们的诉求在简单的输出code的基础上新增一条就是生成code并且立刻运行code。那么这个时候我们就需要两个action,一个负责生成code,一个负责执行code

实现

  1. 定义一个负责生成code的action ,参照单智能体的测试case
    模型智能体开发之metagpt-单智能体实践

  2. 定义一个负责运行code的action

    python 复制代码
    class SimpleRunCode(Action):
            name: str = "SimpleRunCode"
        
            async def run(self, code_text: str):
                result = subprocess.run(["python3", "-c", code_text], capture_output=True, text=True)
                code_result = result.stdout
                logger.info(f"{code_result=}")
                return code_result
    1. 运行code不需要调用llm,所以不涉及到prompt模版的设计
    2. 这里通过python的标准库 subprocess来fork一个子进程,运行一个外部程序
      1. subprocess:包内定义了多个可以创建子进程的函数,这些函数分别以不同的方法来创建子进程,所以按需使用即可
      2. 在本次的case里面通过subprocess.run在fork一个子进程执行传入的代码,那么在fork之后,存在两个进程,一个是python程序本身的进程,另一个就是subprocess.run创建的子进程,两个进程是互不干预的
      3. 在父进程中通过result.stdout来获取子进程的执行结果
  3. 定义 RunnableCoder 角色

    1. 完整的代码

      python 复制代码
      class RunnableCoder(Role):
          name: str = "Alice"
          profile: str = "RunnableCoder"
      
          def __init__(self, **kwargs):
              super().__init__(**kwargs)
              self.set_actions([SimpleWriteCode, SimpleRunCode])
              self._set_react_mode(react_mode=RoleReactMode.BY_ORDER.value)
      
          async def _act(self) -> Message:
              logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})")
              # By choosing the Action by order under the hood
              # todo will be first SimpleWriteCode() then SimpleRunCode()
              todo = self.rc.todo
      
              msg = self.get_memories(k=1)[0]  # find the most k recent messages
              result = await todo.run(msg.content)
      
              msg = Message(content=result, role=self.profile, cause_by=type(todo))
              self.rc.memory.add(msg)
              return msg
    2. 可以看到在重写init方法的时候,这里关联了两个actionSimpleWriteCode, SimpleRunCode

      1. react_mode 设置为 "by_order",这意味着 Role 将按照 self._init_actions 中指定的顺序执行其能够执行的 Action。在这种情况下,当 Role 执行 _act 时,self._rc.todo 将首先是 SimpleWriteCode,然后是 SimpleRunCode
      python 复制代码
      def __init__(self, **kwargs):
              super().__init__(**kwargs)
              self.set_actions([SimpleWriteCode, SimpleRunCode])
              self._set_react_mode(react_mode=RoleReactMode.BY_ORDER.value)
    3. 重写act方法

      1. 覆盖 _act 函数。Role 从上一轮的人类输入或动作输出中检索消息,用适当的 Message 内容提供当前的 Action (self._rc.todo),最后返回由当前 Action 输出组成的 Message
      python 复制代码
      async def _act(self) -> Message:
              logger.info(f"{self._setting}: to do {self.rc.todo}({self.rc.todo.name})")
              # By choosing the Action by order under the hood
              # todo will be first SimpleWriteCode() then SimpleRunCode()
              todo = self.rc.todo
      
              msg = self.get_memories(k=1)[0]  # find the most k recent messages
              result = await todo.run(msg.content)
      
              msg = Message(content=result, role=self.profile, cause_by=type(todo))
              self.rc.memory.add(msg)
              return msg
    4. 测试

      1. 代码

        python 复制代码
        async def main():
            msg = "write a function that calculates the sum of a list"
            role = RunnableCoder()
            logger.info(msg)
            result = await role.run(msg)
            logger.info(result)
        
        asyncio.run(main())
      2. 运行

demo如果想正常运行的话,需要调用llm的key,环境配置可以参照 metagpt环境配置参考

相关推荐
用户25191624271119 小时前
Python之语言特点
python
刘立军20 小时前
使用pyHugeGraph查询HugeGraph图数据
python·graphql
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
c8i1 天前
django中的FBV 和 CBV
python·django
c8i1 天前
python中的闭包和装饰器
python
这里有鱼汤1 天前
小白必看:QMT里的miniQMT入门教程
后端·python
TF男孩2 天前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
该用户已不存在2 天前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
站大爷IP2 天前
Java调用Python的5种实用方案:从简单到进阶的全场景解析
python