更新时间:2026-09-17 GMT+08:00
分享

附录:自适应奖励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              # 工具调用是否执行成功,奖励脚本判断工具执行结果的关键字段

表1 常用访问路径速查表

想做什么

代码写法

获取标准答案

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"]

表2 易混淆字段区分

易混淆项

区别说明

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是最后一步的输出,多数情况一致但语义不同。

相关文档