前言
学习metagpt框架的个人学习笔记,总是不熟悉常用的Action类和Role类中的东西,方便自己查阅包括加深记忆做的总结,大佬可以绕步,小白或者新手可以翻一下,希望帮到你们(版本基于0.5.2,更高的0.6及其以上的版本会有改动)
正文
几个重写的方法
Action类中重写的方法
__init__()
初始化函数
传入参数:name
:Action类的名称,context
:前置知识,llm
:LLM语言模型
没什么好说的,初始化,只是context
和llm
暂时不知道怎么用的,暂时都是把他们默认设置为None,后续更深入的了解了之后再补上
_aask()
调用你设置好的语言模型(如chatgpt)api,对他们进行提问
传入参数:prompt()
:当前想要提问的问题,system_msgs()
:历史提问的消息
run()
不用多说,懂的都懂,运行的逻辑全在这个方法的重写
__str__()
方法和__repr__()
方法
为什么要把这两个放在一起,大家看一下这个两个函数的代码就知道了
def __str__(self):
return self.__class__.__name__
def __repr__(self):
return self.__str__()
所以现在来说,这两个的功能都是一样的,都是查看类名
set_prefix()
不知道有啥用,也不知道重不重要
传入参数:prefix
和profile
Role类中重写的方法
__init__()
初始化,不用多说,只是参数让人有段琢磨不透
role类的初始化就相当于你凭空创造了一个人,给他起一个姓名,创造一个身份
传入参数:name
:人物姓名,profile
:人设,goal
:目标,constraints
:约束,desc
:暂时还不清楚是什么,留个坑,is_human
:是否是人类
大家是不是很不理解profile
和constraints
存在的意义是什么,咱们看一下role类的源码就知道了
PREFIX_TEMPLATE = """You are a {profile}, named {name}, your goal is {goal}, and the constraint is {constraints}. """
所以说只要传入这几个参数,智能体的人设就可以立好,十分的标准
_react()
决定我们思考和行动之间的关系,原本我不是很理解这幅图,当我整理完这个方法的时候瞬间就明白了我觉得这个方法我得好好讲一下
首先咱们先看一下再role类中,原本的_react()
方法是什么样子
async def _react(self) -> Message:
"""Think first, then act, until the Role _think it is time to stop and requires no more todo.
This is the standard think-act loop in the ReAct paper, which alternates thinking and acting in task solving, i.e. _think -> _act -> _think -> _act -> ...
Use llm to select actions in _think dynamically
"""
actions_taken = 0
rsp = Message("No actions taken yet") # will be overwritten after Role _act
while actions_taken < self._rc.max_react_loop:
# think
await self._think()
if self._rc.todo is None:
break
# act
logger.debug(f"{self._setting}: {self._rc.state=}, will do {self._rc.todo}")
rsp = await self._act() # 这个rsp是否需要publish_message?
actions_taken += 1
return rsp # return output from the last action
首先先根据max_react_loop
这个参数来决定循环次数,有些人一个Role类中加载了几个或更多的action类,但是这些action类只运行了一次,但是却设置了max_react_loop
这个参数之后便可以运行更多次,原因就是这个, _react()
方法是决定思考和行动之间的逻辑关系的,所以这个方法是比较重要的,同样很重要的就是_think()
方法
_think()
_think()
方法则是用来进行思考,根据当前的情况做出不同的事情,因为role类中的_think()
方法有些长,所以我用我自己重写的一个来进行说明
再我们的role类中有一个列表,储存我们下面可以调用的action类的列表,叫做_action
列表,我们调用_set_state(ordinal)
方法就可以将_action
列表第ordinal位的action行为准备作为下一个行为进行
async def _think(self) -> None:
self._set_state(self.state)
self.state -= 1
正常情况下,也就是不是我们重写的方法中,_action
列表中的行为是从第0位开始,不断地往后面进行发生,可是在这个自己重写的方法中,我们根据事先设置好的第state位的行为,不断的往前进行发生,当然,之后我们需要用到更复杂的逻辑的时候,肯定不是一种按序号为顺序的方式进行发生
_act
这个重写的方法不用多说,是我们编写role方法中的运行逻辑
_init_actions()
这个是把我们的action类放到我们的_action
列表当中准备运行
用法如self._init_actions([printf1, printf2, printf3]),就是将printf1, printf2, printf3三个action类放入_action
列表中
结尾
本来想把所有的方法都整理一便的,可是在整理的时候发现大多都是基本上用不到的,或者说现在没太多用得上的,如果以后发现哪个方法常用,会再补上的