Agentic RL环境搭建与HGPO代码实战教程
1 前言
HGPO(Hierarchy-of-Groups Policy Optimization)通过 step-wise GRPO 做 Agentic RL,思路是将处于相同状态的 rollout step 聚合起来,对它们做 Group-wise 优势计算。这样一来,奖励分配变得更细粒度,能缓解那种只在 rollout 结束时才给奖励导致的稀疏问题。
论文在 ALFWorld 和 WebShop 上验证了效果。所以这篇文章就来拆解一下 ALFWorld 的环境是怎么构造的,以及如何在 verl 里把 HGPO 跑起来。
2 ALFWorld
2.1 ALFWorld 简介
ALFWorld 模拟的是家庭场景——厨房、浴室、卧室、客厅这些。Agent 需要根据文本指令跟环境交互,完成类似“把洗干净的苹果放进冰箱”这种任务。每一步,Agent 接收自然语言描述的当前状态,然后从候选动作列表里选一个执行,直到任务完成或者超出最大步数。
它包含六类环境:Pick & Place(拾取与放置)、Examine in Light(在光源下检查)、Clean & Place(清洁与放置)、Heat & Place(加热与放置)、Cool & Place(冷却与放置)、Pick Two & Place(拾取两个物体并放置)。
在 LLM Agentic RL 里,一般用纯文本模式,每个 step 的输入输出都是字符串。
2.2 ALFWorld 数据集格式
按 HGPO 项目提供的方式下载 ALFWorld 后,会得到这样的目录结构:
$ALFWORLD_DATA/json_2.1.1/
├── train/ # 2435 个任务场景(训练集)
├── valid_seen/ # 242 个(验证集,in-distribution,房间布局在训练集中间出现过)
├── valid_unseen/ # 85 个(验证集,out-of-distribution,房间布局未见过)
└── valid_train/ # 训练集的子集验证用
$ALFWORLD_DATA/verl_data/
├── train.parquet # 16 条 verl 格式训练数据(仅用于声明模态,实际任务由环境动态加载)
└── test.parquet # 128 条 verl 格式测试数据
同一个任务目录下通常会有 2–3 个 trial_T... 子目录,代表同一任务、同一房间、不同人类标注员的演示轨迹。区别在于:
- 物体摆放位置不同(同一类物体放在不同家具上)
- Agent 初始站位不同
- 任务描述语言不同(语义相同,措辞各异)
TextWorld 训练时会从这些 trial 中随机选一个作为实际游戏场景。
每个 trial 目录下包含:
trial_T.../
├── game.tw-pddl # TextWorld 游戏文件(环境实际加载此文件)
├── initial_state.pddl # PDDL 格式初始状态
└── traj_data.json # 任务元数据(任务类型、物体位置、人类标注描述等)
3 HGPO in VeRL
接下来看看如何在 VeRL 里使用 ALFWorld 环境。
3.1 交互逻辑
先看 multi-turn 交互是怎么实现的。单个 Episode 的交互循环如下:
reset()
→ 随机加载一个 game.tw-pddl 文件
→ 返回初始场景描述:
"You are in the middle of a room. Looking quickly around you, you see ..."
"Your task is to: put a hot apple in countertop."
for step in range(max_steps=50):
1. build_text_obs() 构造完整 Prompt(含历史 + 任务 + 可用动作列表)
2. LLM 生成响应: ...推理过程... go to fridge 1
3. alfworld_projection() 解析 标签内的动作文本
4. TextWorld.step(action) 执行动作,返回新观测 + reward + done
5. memory.store(obs, action) 写入历史记录
if done: break
reward: 0(中间步)或 10.0(任务完成,won=True)
上面这套逻辑通过 VeRL 的多轮交互 Loop 实现。
3.2 奖励设计
任务完成奖励:只在完成任务时给奖励,完成 +10 分,否则 0 分。为了让奖励能传递到历史 step 中,引入了折扣因子 0.95——越靠近最后一步,奖励越高。
无效惩罚:如果智能体生成了在当前环境中无效的动作(invalid action),就会施加一个小的负奖励:-0.1。无效动作包括下面几种情况:
| 条件 | 说明 |
|---|---|
输出中无 标签 | 格式错误 |
输出中无 标签 | 缺少推理过程 |
输出中含中文字符(u4e00-u9fff) | 语言错误 |
3.3 环境构造
在 Agentic RL 任务里,最重要的就是环境怎么构建。这里的环境包括文本解析与处理、环境交互与反馈、奖励打分等。它主要包含以下几个部分:
动作解析
模型被要求先做推理,再输出动作。token 在多轮交互 loop 被解码后传入 env。一条典型的 LLM 输出格式长这样:
I need to heat the apple. I'm currently holding it and standing near the microwa ve.
The admissible actions include 'heat apple 1 with microwa ve 1', which is exactly what I need.
heat apple 1 with microwa ve 1
这条输出会被送入 env 进行解析,提取出 和 的内容。
环境与奖励反馈
env 会判断是否有无效动作——如果是无效动作,奖励会施加惩罚,参考上面的奖励系统。同时 env 也会判断 LLM 是否完成了任务,如果最终完成了,就给 +10 分。
如果是无效动作,observation 返回 "Nothing happens."。如果是有效动作,env 会根据动作生成下一步的 observation,包括环境状态和可执行的动作。
并行环境
框架会为每一个 rollout 创建一个 env,并分配 num_cpus=0.1 的资源。
