跳到主要内容

Agent模块

Agent模块用于处理来自视觉识别模块的符号,并且输出对应的动作(int)。MiniABL既支持Python,也支持Prolog

以MiniABL默认的MiniHack-KeyRoom-S5-v0环境为例子。Agent模块会接收来自视觉识别模块提取出来的符号numpy矩阵[21, 79], 然后执行Prolog/Python程序进行推理得到最终动作[int].

Agent模块的参数配置如下所示:(配置文件位于src/config_manager/conf.yaml)

# 智能体策略设置
agent_config:
type: "prolog" # python, prolog
name: "test_prolog_agent" # python/prolog文件名称(不需要加文件后缀与完整前置文件路径)

最终用于执行所有的Agent都是继承位于src/agent_manager/agent_interface.py的AgentInterface.并且重写了其act方法:

class AgentInterface(ABC):
def __init__(self):
pass

@abstractmethod
def act(self, obs: np.ndarray) -> int:
"""
:param obs: observation(此obs为符号化的而非原始像素,当然若rec为none的话,obs为原始像素)
:return: action
"""

基于Python的Agent​

对于想要使用Python进行Agent构建的用户,可以在src/agent_manager/python_agent下创建一个Python文件,同时创建一个叫做MyAgent的类.并设置其继承PythonAgent,如下所示:

class MyAgent(PythonAgent):
def __init__(self, conf:dict):
pass

def act(self, obs:np.ndarray)->int:
pass

随后将配置文件的type改成python, name改成刚刚创建的Python文件名.

然后再改成你想要执行的策略即可(一个完整的例子可以参考src/agent_manager/python_agent/test_python_agent.py)

VLM(Python)​

对于想要使用VLM作为Agent构建的用户,需要确保将视觉识别模块设置为none,这是因为VLM的输入是原始图像,不需要经过符号化处理 。此外,由于目前支持的VLM只有豆包,而豆包大模型需要通过api才能调用。因此需要注册字节出品的火山平台的api并且填入至配置文件才可以使用。

此外,调用豆包大模型接口并非Openai格式的,而是有其专门的Python包(尽管它们使用起来非常类似),所以在使用VLM作为Agent前,请确保你的环境中有火山引擎的包,否则请执行以下指令:

pip install --upgrade volcengine-python-sdk[ark]
pip install --upgrade arkitect

VLM在配置文件中的内容如下所示:

vlm_config: # 目前只支持豆包
api_key: 'dbxxxx'
model_name: "doubao-seed-1-6-vision-250815"
prompt: "给你一张minihack的游戏截图,这是一个比较复古的像素风游戏,地图由网格组成,player的任务是寻找到钥匙,开门,并到达目标点,黑色区域可能需要你走近之后才能看清,棕色的物体可能是门,但是你需要先找到钥匙才能开门,如果没有看到钥匙可能是因为钥匙在黑色的未探索区域中,请注意避让障碍物,例如未开锁的门以及墙壁,如果你发现你上一步执行移动行为之后,图片没有发生变化,那么说明你可能撞墙了,请你描述一下这个图片的内容,同时使用tool输出玩家下一步应该执行的动作"
tools: {
"type": "function",
"function": {
"name": "act", # 建议统一用字符串引号(单双引号均可,保持一致性)
"description": "用于控制 player 执行特定交互动作,包括四个方向移动、拾取物品、使用钥匙、开启门/宝箱",
"parameters": {
"type": "object",
"properties": {
"action": {
"type": "string",
"description": "player 需执行的具体动作,需从以下固定值中选择:\n- north/south/east/west:向对应方向移动(如 north 代表向北)\n- pickup:拾取当前位置的物品(如钥匙、道具)\n- apply:使用已拾取的物品(仅在持有钥匙等可交互道具时有效)\n- open:开启当前位置的门/宝箱(需先通过 apply 使用对应钥匙,否则无法打开)",
"enum": ["north", "south", "east", "west", "pickup", "apply", "open"] # 核心:限定仅允许的动作值
}
},
"required": ["action"] # 明确 action 为必选参数,模型必须返回该值
}
}
}
注意

经过测试,豆包VLM在MiniHack环境中的表现并不好,尽管它能给大致的描述出环境的内容,但对于一些细节的识别效果并不好(例如会把门与player弄混),因此VLM的代码本意其实是想要与ABL的方法作对照。(如果你可以改善VLM的代码并且使其表现提升,我们也欢迎你的贡献!)

a2RL(Python)​

a2RL是Lamda提出的一个可以不事先定义符号,仅通过课程学习即可完成minigrid这类延迟奖励环境的任务。a2RL的源代码点击跳转。本项目目前计划将其架构重构并融入至Agent模块

注意

在使用a2RL的时候,请注意将配置文件中的环境设置为minigrid,因为a2RL的方法不一定能在minihack中生效

信息

To_Do_List​

  1. a2RL论文中使用的环境为Minigrid,所以要将Minigrid的环境融入本项目。
  2. 将a2RL的代码重构至Agent模块。

基于Prolog的Agent​

对于想要使用Prolog进行Agent构建的用户, 可以在src/agent_manager/prolog_agent下创建一个Prolog文件.并且保证其中一定出现以下谓词:

process_observation(Obs, Action)

随后将配置文件的type改成prolog, name改成刚刚创建的prolog文件名.

然后改成你想要执行的策略即可(一个完整的例子可以参考src/agent_manager/prolog_agent/test_prolog_agent.pl)