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)
关键细节¶
- response_mask 全为 1:因为没有工具调用,所有 token 都是 LLM 生成的,全部参与策略梯度计算。
- num_turns=2:固定为 2(1 轮用户输入 + 1 轮助手响应)。
- response_length 截断:如果生成的 token 超过配置的
response_length,会截断。 - 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 的多轮工具调用实现。