环境
早期的MetaGPT版本使用和metagpt/environment/base_env.py
中Environment
相同的实现来描述一个软件团队所处的环境。为了能够支持多智能体在不同环境(比如游戏、手机端等)中对接使用,我们扩展了环境的整体定义和功能,使其更好的支持不同场景的开发。
定义
ExtEnv
外部环境,定义为智能体与不同环境交互的载体。比如智能体待对接的游戏是一个远端引擎服务,对外提供的api接口集合,我们通过定义该外部环境来管理对接API,使得智能体具备和游戏交互的直接能力。又比如,智能体对接角色扮演狼人杀游戏,定义该外部环境用来实现狼人杀本身的游戏规则,从而智能体可以知道天黑、天亮后的角色当前状态。
XxxEnv
内部环境,定义为智能体与其所属团队直接使用的环境,类似软件开发中使用的Environment
,一般的,它直接继承ExtEnv
,并按需求额外添加自定义部分。
在ExtEnv
中,我们参考强化学习场景中gymnasium
的设计,引入了观察空间observation_space
和动作空间action_space
,分别用来表示从外部环境中获得的状态集合以及可以作用于环境的动作集合。通过2个空间的定义,可以简化不同环境下的抽象,使得环境提供者专注于环境逻辑的实现以及使用者专注于不同空间值的使用。
额外的,还提供了针对ExtEnv
提供的不同读写
接口的装饰器mark_as_readable
和mark_as_writeable
,方便将用于外部环境对接的方法接口进行统一管理,便于后续智能体将其作为一种工具能力,能够根据输入的自然语言直接进行不同外部环境对接接口的自动调用(这一部分功能待开放)。
观察空间、动作空间定义规范
在gymnasium
定义观察、动作空间时,一般是定义离散值或连续值。但在支持的这些场景环境中,由于更多是需要通过API或者接口访问游戏引擎服务或者外部模拟器。因此,对于动作空间(gymnasium.spaces.Dict
),其包含不同的动作类型及不同动作下的所需入参的子空间定义。对于搜索空间(gymnasium.spaces.Dict
),其包含可从环境中得到的环境信息,比如地图、屏幕截图等。
metagpt/environment/base_env_space.py
内的BaseEnvActionType
定义了动作类型,BaseEnvAction
定义了动作空间对应的一组取值,BaseEnvObsType
定义了观察类型。
一般的,gymnasium
内得到的观察空间值是一组完整的观察值,但在实际应用中,往往需要从环境中得到局部观察值(比如在斯坦福小镇中,需要获取智能体所处位置视野范围内的地图信息,而非完整地图)。我们添加了observe(self, obs_params: Optional[BaseEnvObsParams] = None)
方法来获取局部环境信息,BaseEnvObsParams
定义了获取观察值的所需参数,包括观察类型和其所需入参。
不同场景环境
目前,我们提供了几种场景环境并在MetaGPT/examples/
下提供了对应的场景使用入口。
- 待添加,Minecraft环境
- 已添加,狼人杀环境
- 已添加,斯坦福小镇环境
- 已添加,安卓模拟器环境
- 待添加,网页环境