附录:自适应奖励payload数据格式说明
本附录面向需要编写复杂奖励脚本的用户,完整说明payload中所有可用字段。
对于大多数奖励脚本,您只需要关注以下字段即可:
- reference_output
- trajectory.root.output
- trajectory.steps(及其中的 type、name、input、output、status)
训练时系统注入到{{payload}}中的数据为JSON字符串,解析后的完整结构如下:
payload
├── input: str # Agent接收到的用户输入,与数据集中的input字段一致
├── reference_output: str # 数据集中的期望输出(标准答案)
└── trajectory: object # Agent本次运行的完整轨迹数据
├── meta: 轨迹元信息 # 通常在奖励计算中不直接使用
│ ├── trajectory_id: str # 轨迹唯一标识ID,以traj_开头后跟32位十六进制字符
│ ├── session_id: str? # 所属会话ID,以sess_开头。同一会话下的多条轨迹共享此ID。可不填
│ ├── trace_ids: list<str> # 关联的分布式追踪ID列表,可在"调用链分析"中定位原始日志
│ ├── trajectory_type: enum # 轨迹类型:single | multi_agent | async | human_in_loop
│ ├── parent_trajectory_id: str? # 父轨迹ID,多Agent协作场景下关联父轨迹。可不填
│ ├── task_hash: str? # 任务输入的哈希值,同一任务的不同采样轨迹共享此哈希。可不填
│ ├── created_at: int # 创建时间戳
│ ├── updated_at: int # 最后更新时间戳
│ └── tags: dict<str, str> # 标签字典,常见标签:rollout_id(推演ID)、attempt_seq(重试序号)、mode(数据划分)
│
├── root: Agent任务汇总 # 奖励代码中最常用的字段,记录本次运行的最终结果汇总
│ ├── step_id: str # 本次运行的唯一标识ID
│ ├── name: str # 智能体或工作流名称
│ ├── description: str? # 智能体或工作流描述信息。可不填
│ ├── input: str # 用户发送的原始问题文本
│ ├── output: str # Agent最终返回给用户的回复文本,奖励脚本中最核心的字段
│ ├── status: enum # 运行最终状态:success | failed | cancelled
│ ├── timestamp: int # 开始处理时间戳(毫秒)
│ ├── duration: int # 总耗时(毫秒)
│ ├── success: bool # 运行是否成功完成
│ ├── error: ErrorInfo? # 运行失败时的错误信息。可不填
│ ├── final_reward: float? # 最终奖励值,所有步骤即时奖励的累加和。可不填
│ └── summary: ExecutionSummary # 执行统计汇总,提供快速访问的统计数字,无需遍历steps
│ ├── llm_stats: LLMStats # LLM调用统计
│ │ ├── call_count: int # LLM调用总次数
│ │ ├── total_input_tokens: int # 总输入Token数
│ │ ├── total_output_tokens: int # 总输出Token数
│ │ ├── total_tokens: int # 总Token数
│ │ ├── total_duration: int # 总LLM耗时(毫秒)
│ │ └── models_used: list<str> # 使用的模型列表
│ ├── tool_stats: ToolStats # 工具调用统计
│ │ ├── call_count: int # 工具调用总次数
│ │ ├── success_count: int # 工具调用成功次数
│ │ └── tools_used: list<str> # 使用的工具名称列表
│ └── step_count: int # 总步骤数
│
└── steps: list<Step> # 执行步骤列表,按执行顺序排列
├── step_id: str # 当前步骤的唯一标识ID
├── parent_id: str? # 父步骤ID,直接归属于root时为root的step_id
├── name: str # 步骤名称(工作流节点名称或工具名称)
├── type: enum # 步骤类型:llm | tool | agent | retrieval | memory | planning | handoff | checkpoint
├── status: enum # 步骤状态:pending | running | success | failed | skipped
├── timestamp: int # 开始执行时间戳(毫秒)
├── duration: int # 步骤执行耗时(毫秒)
├── input: str? # 步骤输入内容(LLM提示词或工具参数,字符串格式)
├── output: str? # 步骤输出结果(字符串格式)
├── reward: float? # 该步骤的即时奖励值。可不填
├── cumulative_reward: float? # 从第一步到当前步骤的累计奖励值。可不填
├── episode_done: bool? # 是否结束当前episode,多轮交互中间步骤为false、最后一步为true。可不填
├── error: ErrorInfo? # 步骤执行失败时的错误信息。可不填
├── metadata: dict # 扩展元数据字典
│
├── llm_call: LLMCall? # LLM调用详情(仅type="llm"时存在)
│ ├── call_id: str # 本次LLM调用的唯一ID
│ ├── model: str # 实际调用的模型名称
│ ├── messages: list<Message> # 发送给模型的完整消息列表
│ │ └── Message # 每条消息
│ │ ├── role: enum # 消息角色:system | user | assistant | tool
│ │ ├── content: str # 消息文本内容
│ │ ├── tool_calls: list<LLMToolCall>? # 模型发起的工具调用请求,仅role=assistant时存在。可不填
│ │ │ └── LLMToolCall # 每项工具调用请求
│ │ │ ├── call_id: str # 工具调用唯一ID
│ │ │ ├── tool_name: str # 请求调用的工具名称
│ │ │ └── parameters: dict # 调用参数字典
│ │ ├── tool_call_id: str? # 工具调用结果对应的调用ID,仅role=tool时生效,关联assistant消息中tool_calls的call_id。可不填
│ │ ├── token_ids: list<int>? # Token ID列表,用于RL训练,奖励脚本一般不需要。可不填
│ │ └── logprobs: list<TokenLogProb>? # Token对数概率列表,用于RL训练,奖励脚本一般不需要。可不填
│ ├── tool_definitions: list<ToolDefinition>? # 本次调用可使用的工具定义列表。可不填
│ │ └── ToolDefinition # 每项工具定义
│ │ ├── type: str # 工具类型,当前固定为"function"
│ │ └── function: FunctionDefinition # 函数定义
│ │ ├── name: str # 工具/函数名称
│ │ ├── description: str? # 工具功能描述。可不填
│ │ └── parameters: dict? # JSON Schema格式的参数定义。可不填
│ ├── input_tokens: int # 输入Token数量
│ ├── output_tokens: int # 输出Token数量
│ ├── duration: int # LLM调用耗时(毫秒)
│ ├── ttft: float? # 首Token响应时间(秒)。可不填
│ ├── finish_reason: str? # 停止生成原因,如"stop"正常结束、"length"达到长度限制。可不填
│ └── params: LLMCallParams? # 模型调用参数。可不填
│ ├── temperature: float? # 可不填
│ ├── top_p: float? # 可不填
│ └── max_tokens: int? # 可不填
│
└── tool_call: ToolCall? # 工具调用详情(仅type="tool"时存在)
├── call_id: str # 本次工具调用的唯一ID,可关联LLM消息中tool_calls的call_id
├── tool_name: str # 调用的工具名称
├── tool_description: str? # 工具功能描述。可不填
├── parameters: dict # 调用参数字典(结构化格式,可直接按字段读取)
├── result: Any? # 工具执行返回的结果(保留原始数据类型)。可不填
├── duration: int # 工具调用耗时(毫秒)
└── success: bool # 工具调用是否执行成功,奖励脚本判断工具执行结果的关键字段 | 想做什么 | 代码写法 |
|---|---|
| 获取标准答案 | data["reference_output"] |
| 获取Agent最终回复 | data["trajectory"]["root"]["output"] |
| 判断任务是否成功 | data["trajectory"]["root"]["success"] |
| 遍历所有步骤 | for step in data["trajectory"]["steps"] |
| 筛选工具调用步骤 | if step["type"] == "tool" |
| 获取工具调用名称 | step["name"] 或 step["tool_call"]["tool_name"] |
| 获取工具调用参数 | step["tool_call"]["parameters"](dict,直接读字段)或 json.loads(step["input"])(str,需解析) |
| 判断工具是否执行成功 | step["tool_call"]["success"] |
| 筛选LLM调用步骤 | if step["type"] == "llm" |
| 获取LLM可用的工具列表 | step["llm_call"]["tool_definitions"] |
| 获取LLM请求调用的工具 | step["llm_call"]["messages"]中role=assistant的tool_calls |
| 获取Token总消耗 | data["trajectory"]["root"]["summary"]["llm_stats"]["total_tokens"] |
| 获取已使用的工具列表 | data["trajectory"]["root"]["summary"]["tool_stats"]["tools_used"] |
| 易混淆项 | 区别说明 |
|---|---|
| step.input vs tool_call.parameters | step.input是字符串(需json.loads解析),tool_call.parameters是字典(直接读字段)。 |
| step.output vs tool_call.result | step.output是字符串,tool_call.result保留原始数据类型(dict/list等)。 |
| step.duration vs tool_call.duration | step.duration是步骤级耗时,tool_call.duration是工具调用级耗时,通常数值相同。 |
| step.name vs tool_call.tool_name | 大致对应,但step.name语义更泛(工作流节点名称),tool_call.tool_name明确是工具名称。 |
| messages[].tool_calls vs tool_call | tool_calls是LLM请求调用的工具(输入侧),tool_call是实际执行的工具调用结果(输出侧)。 |
| root.output vs steps[-1].output | root.output是Agent最终回复,steps[-1].output是最后一步的输出,多数情况一致但语义不同。 |