配套代码合集(GRPO / OPD / ReTool / Search-R1)
GRPO 配套代码
代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 01-grpo 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。
本目录对应正文 8.1 节,以 GSM8K 为例实现完整的 PyTRIO GRPO 训练链路。同步版与异步版使用相同的 prompt、规则奖励、组内相对优势、Datum 对齐和 loss。
文件说明
| 文件 | 作用 | 正文定位 |
|---|---|---|
01-demo-sync.py | 按 prompt 顺序完成 rollout 和训练 | 逐段讲解 |
02-demo-async.py | 使用 asyncio.gather() 并发执行 batch 内 rollout | 提供完整代码,只说明接口差异 |
运行前准备
从 Happy-LLM 仓库根目录创建 Python 3.13 环境并安装第八章公共依赖:
uv venv --python 3.13source .venv/bin/activateuv pip install -r docs/chapter8/requirements.txttrio login需要在线记录实验时,再执行 swanlab login。
运行同步版
python docs/chapter8/grpo/01-demo-sync.py \ --steps 1 \ --batch-size 1 \ --group-size 4 \ --max-tokens 512 \ --loss-fn importance_sampling \ --swanlab-mode disabled训练第一次启动时会下载 GSM8K。正式实验应增大 steps、batch-size 和 group-size,并固定其余配置后再比较 importance_sampling 与 ppo。
运行异步版
python docs/chapter8/grpo/02-demo-async.py \ --steps 1 \ --batch-size 4 \ --group-size 4 \ --max-tokens 512 \ --loss-fn importance_sampling \ --swanlab-mode disabled异步版会并发处理同一 batch 中不同 prompt 的 rollout。reward、advantage、Datum 和 loss 与同步版保持一致。
同步版代码阅读顺序
parse_args()与RolloutSample:定义训练配置和一条 rollout 的数据。grade_answer():抽取\boxed{}并计算规则奖励。run_rollout_group():对同一道题采样一组回答并计算相对优势。build_grpo_datum():完成自回归右移和 prompt mask。main():选择内置 loss,并串联 sampler 刷新、rollout、策略更新、日志和权重保存。
异步版在对应函数中使用 sample_async()、forward_backward_async()、optim_step_async() 和 asyncio.gather()。
OPD 配套代码
代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 02-opd 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。
本目录对应正文 8.2 节,以 DeepMath-103K prompt 为例实现完整的 On-Policy Distillation。Student 生成回答,Teacher 对同一条 Student 轨迹计算逐 token logprob,再由 reverse KL 构造训练信号。
文件说明
| 文件 | 作用 | 正文定位 |
|---|---|---|
01-demo-sync.py | 顺序执行 Student rollout、Teacher 打分和 Student 更新 | 逐段讲解 |
02-demo-async.py | 并发执行 batch 内 rollout 与 Teacher logprob 请求 | 提供完整代码,只说明接口差异 |
运行前准备
uv venv --python 3.13source .venv/bin/activateuv pip install -r docs/chapter8/requirements.txttrio login需要在线记录实验时,再执行 swanlab login。
运行同步版
python docs/chapter8/opd/01-demo-sync.py \ --steps 1 \ --batch-size 1 \ --group-size 1 \ --max-tokens 512 \ --sample-size 20 \ --num-shards 1 \ --swanlab-mode disabled脚本会从 ModelScope 下载 DeepMath-103K parquet。--num-shards 1 适合小成本试跑,--num-shards 10 会使用全部分片。
运行异步版
python docs/chapter8/opd/02-demo-async.py \ --steps 1 \ --batch-size 4 \ --group-size 2 \ --max-tokens 512 \ --sample-size 20 \ --num-shards 1 \ --swanlab-mode disabled异步版在 batch 内并发执行 Student rollout,并在同一 prompt 内并发提交 Teacher logprob 请求。token 对齐、reverse KL 与 importance_sampling Datum 保持不变。
同步版代码阅读顺序
parse_args()与load_deepmath():准备训练参数和 prompt-only 数据。build_prompt():把问题渲染成 Student 输入。completion_teacher_logprobs():让 Teacher 对 Student completion 打分。build_opd_datum():把逐 token reverse KL 写入 advantage。main():刷新 Student sampler,更新 Student,记录指标并保存权重。
Teacher 默认使用 Qwen/Qwen3.6-27B。实际可用模型以 PyTRIO 服务返回结果为准,也可以通过 --teacher-base-model 或 --teacher-model-path 指定其他 Teacher。Teacher 与 Student 的 token id 必须兼容。
ReTool 配套代码
代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 05-retool 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。
本目录对应正文 8.4 节。代码实现数学题上的多轮代码解释器 rollout、结果奖励、observation mask、PPO 更新和统一评测。
安全提示:
sandbox.py通过独立 subprocess、超时和资源限制控制意外消耗,但不能提供可信安全隔离。模型生成的代码仍可能访问本机文件、网络和继承的环境变量。处理不可信代码时,请使用一次性容器、低权限虚拟机或专用沙箱服务,并移除所有凭证。
运行前准备
uv venv --python 3.13source .venv/bin/activateuv pip install -r docs/chapter8/requirements.txttrio login需要在线记录实验时,再执行 swanlab login。
准备数据
python docs/chapter8/retool/prepare_data.py最小试跑
请先在隔离环境中确认执行器权限,再运行:
python docs/chapter8/retool/train.py \ --max-steps 1 \ --questions-per-batch 1 \ --group-size 4 \ --max-code-calls 2 \ --sandbox-workers 2 \ --swanlab-mode disabled文件说明
| 文件 | 作用 |
|---|---|
protocol.py | 定义 code_interpreter 工具和消息拼接规则 |
sandbox.py | 执行 Python 代码并限制时间、进程和输出大小 |
rollout.py | 执行多轮“生成—运行代码—观察—继续生成”状态机 |
reward.py | 抽取最后一个 \boxed{} 并判断数学等价性 |
train.py | 构造 observation mask、PyTRIO Datum 并执行 PPO 更新 |
eval.py | 统一评测 text-only 与 ReTool 模式 |
analysis.py | 汇总不同 checkpoint 的指标 |
Search-R1 配套代码
代码来源: 本目录代码引用并整理自本章作者维护的 agentic-rl-lab 中的 03-search-r1 实现,当前版本适配 Happy-LLM 第八章与 PyTRIO 0.2.6。
本目录对应正文 8.3 节。代码保留数据、工具协议、搜索环境、多轮 rollout、reward、训练和评测的边界,便于观察 Agentic RL 如何在普通 GRPO 训练循环上增加环境交互。
运行前准备
uv venv --python 3.13source .venv/bin/activateuv pip install -r docs/chapter8/requirements.txttrio login需要在线记录实验时,再执行 swanlab login。
准备数据
python docs/chapter8/search-r1/prepare_data.py该命令会准备 NQ 与 HotpotQA 训练、开发和测试数据。Wikipedia 后端免费且不需要 API Key,适合先验证流程。
最小试跑
python docs/chapter8/search-r1/train.py \ --max-steps 1 \ --questions-per-batch 1 \ --group-size 4 \ --max-search-calls 2 \ --search-backend wikipedia \ --search-concurrency 3 \ --swanlab-mode disabled在线搜索结果会随时间变化。比较 Base Model 与 checkpoint 时,必须保持题集、搜索后端、最大搜索次数和 sampling 参数一致。
文件说明
| 文件 | 作用 |
|---|---|
protocol.py | 定义工具协议,解析搜索动作和最终答案 |
search.py | 封装 DeepSeek Search、Wikipedia 和知乎搜索后端 |
rollout.py | 执行多轮“生成—搜索—观察—继续生成”状态机 |
reward.py | 计算格式奖励和答案精确匹配奖励 |
train.py | 构造 observation mask、PyTRIO Datum 并更新策略 |
eval.py | 使用相同环境评测 Base Model 或 checkpoint |
analyse.py | 汇总评测结果 |
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!


