跳转至

single_turn_agent_loop.py — 实现了最简单的 Agent 循环——单轮对话(Single Turn)

文件路径: verl/experimental/agent_loop/single_turn_agent_loop.py

文件概述

实现了最简单的 Agent 循环——单轮对话(Single Turn)。不涉及工具调用或多轮交互,只执行一次"输入提示 -> LLM 生成响应"的流程。适用于简单的问答、文本生成等场景。

关键代码讲解

类定义与注册

@register("single_turn_agent")
class SingleTurnAgentLoop(AgentLoopBase):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.prompt_length = self.rollout_config.prompt_length
        self.response_length = self.rollout_config.response_length

@register("single_turn_agent") 将该类注册为名为 "single_turn_agent" 的 Agent 循环实现。训练配置中指定 agent_name: single_turn_agent 即可使用此实现。

run 方法 - 核心逻辑

async def run(self, sampling_params: dict[str, Any], **kwargs) -> AgentLoopOutput:
    messages = list(kwargs["raw_prompt"])

    # 1. 提取多模态数据(图片、视频)
    multi_modal_data = await self.process_vision_info(messages)
    images = multi_modal_data.get("images")
    videos = multi_modal_data.get("videos")

    # 2. 应用聊天模板并分词
    prompt_ids = await self.apply_chat_template(messages, images=images, videos=videos)

    # 3. 调用 LLM 生成响应
    metrics = {}
    with simple_timer("generate_sequences", metrics):
        output = await self.server_manager.generate(
            request_id=uuid4().hex,
            prompt_ids=prompt_ids,
            sampling_params=sampling_params,
            image_data=images,
            video_data=videos,
        )

    # 4. 构造输出
    response_mask = [1] * len(output.token_ids)  # 全部是 LLM 生成的
    output = AgentLoopOutput(
        prompt_ids=prompt_ids,
        response_ids=output.token_ids[:self.response_length],
        response_mask=response_mask[:self.response_length],
        response_logprobs=output.log_probs[:self.response_length] if output.log_probs else None,
        multi_modal_data=multi_modal_data,
        num_turns=2,  # 1轮用户 + 1轮助手
        metrics=metrics,
    )

    # 保持与 tool_agent_loop 的 schema 一致
    output.extra_fields.update({"turn_scores": [], "tool_rewards": []})
    return output

执行流程

用户消息 (raw_prompt)
    │
    ▼
提取多模态数据 (process_vision_info)
    │
    ▼
应用聊天模板 + 分词 (apply_chat_template)
    │
    ▼
调用 LLM 生成 (server_manager.generate)
    │
    ▼
构造 AgentLoopOutput(response_mask 全为 1)

关键细节

  1. response_mask 全为 1:因为没有工具调用,所有 token 都是 LLM 生成的,全部参与策略梯度计算。
  2. num_turns=2:固定为 2(1 轮用户输入 + 1 轮助手响应)。
  3. response_length 截断:如果生成的 token 超过配置的 response_length,会截断。
  4. extra_fields 兼容:添加空的 turn_scores 和 tool_rewards,与 ToolAgentLoop 保持 schema 一致。

核心类/函数列表

名称 类型 说明
SingleTurnAgentLoop 类 单轮对话 Agent 循环实现
run() 异步方法 执行一次完整的单轮生成

与其他模块的关系

  • 继承自 AgentLoopBase(agent_loop.py)
  • 通过 @register("single_turn_agent") 注册到全局注册表
  • 作为默认的 Agent 循环使用(当配置中 default_agent_loop 为 single_turn_agent 时)
  • PartialSingleTurnAgentLoop(fully_async_policy 中)是其支持部分回滚的变体

小结

SingleTurnAgentLoop 是最简单的 Agent 循环实现,仅做一次 LLM 推理调用。它是理解 Agent 循环框架的最佳入门点——先理解这个简单版本,再看 ToolAgentLoop 的多轮工具调用实现。