[ PROMPT_NODE_22854 ]
custom-rewards
[ SKILL_DOCUMENTATION ]
# 自定义奖励函数
在 OpenRLHF 中实现自定义奖励函数和智能体 RLHF 的完整指南。
## 概述
OpenRLHF 支持两种自定义奖励范式:
1. **强化微调 (RFT)** - 针对单步生成的自定义奖励函数
2. **智能体 RLHF** - 带有反馈循环的多步环境交互
## 强化微调 (RFT)
### 基本概念
无需使用预训练的奖励模型,而是定义自己的奖励逻辑来评估模型输出。
**启用 RFT**:
bash
--remote_rm_url ./reward_func.py # 自定义奖励函数路径
--label_key answers # 传递额外信息(例如:真值)
### 奖励函数 API
**模板** (`reward_func.py`):
python
import torch
def reward_func(queries, prompts, labels):
"""
参数:
queries: List[str] - 完整提示词 + 生成的回复
prompts: List[str] - 仅原始提示词
labels: List[str] - 真值答案 (来自 --label_key)
返回:
字典包含:
"rewards": torch.Tensor - 用于优势计算的奖励
"scores": torch.Tensor - 用于动态过滤的分数 (0-1)
"extra_logs": dict - 用于 W&B 日志记录的额外指标
"""
# 在此处编写奖励计算逻辑
rewards = torch.tensor([...])
return {
"rewards": rewards,
"scores": rewards,
"extra_logs": {"custom_metric": rewards}
}
### 示例 1:代码生成奖励
**通过执行评估代码正确性**:
python
# reward_func_code_gen.py
import torch
import subprocess
import tempfile
import os
def reward_func(queries, prompts, labels):
"""基于代码执行和测试通过情况的奖励。"""
rewards = []
for query, prompt, label in zip(queries, prompts, labels):
# 提取生成的代码 (提示词之后)
generated_code = query.split(prompt)[-1].strip()
try:
# 将代码写入临时文件
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
f.write(generated_code)
temp_file = f.name
# 执行代码并运行测试
result = subprocess.run(
["python", "-m", "pytest", temp_file],
capture_output=True,
text=True,
timeout=5
)
# 基于测试结果给予奖励
if "passed" in result.stdout:
rewards.append(1.0)