AgentEvolver 源码解读 · 第 2 章:任务自生成(Self-Questioning / Task Manager)
> 上章把骨架立起。此章看「米」从何来——AgentEvolver 三大机制之首 Self-Questioning:自动生成训练任务,免却人工造数据集之苦。核心在 agentevolver/module/task_manager/。
---
一、Why:任务稀缺是 RL Agent 的头号瓶颈
RL 训练公式化作「对环境的轨迹调优」,数据质量直接定模型上限。真人环境里,任务难造、质量难控。Task Manager 用一套动态工作流破局:探环境 → 抽任务 → 滤质量 → 配比例,全程可独立跑、也可嵌进训练。
官方三阶段(见 docs/guidelines/task_manager.md):环境刻画(Profile)→ 任务派生(Derivation)→ 任务策展(Curation)。代码里对应 TaskManager + strategies/ + filters/ + data_mixture/。
---
二、Environment Profile:给环境一个「概念骨架」
API 只说「能调什么」,不说「高层概念为何」。Profile 用三元补全:
| 概念 | 含义 | 例(文件系统) |
|---|---|---|
| Entity | 交互对象,可增删改 | file / directory |
| Attribute | 对象属性,不可执行 | name / size / type |
| Operation | 可执行动作,常对齐 API | create / read / write |
env_profiles.py 里 EnvEntity / EnvEntityOpt / TaskPreference 是 Python 表达;cookbook/env_profiles/appworld.json 是 JSON 真本。训练时由 EnvProfile.load_from_json 载入。task_preference(num_entities / num_opts / relation_difficulty)控制生成任务的风格与难度。---
三、TaskManager:四件武器
TaskManager.__init__ 把依赖焊死:
self._exploration_strategy = get_exploration_strategy(exploration_strategy, ...)
self._mixture_strategy = mixture_strategy
self._realtime_filters = [NaiveTaskPostFilter()]
self._post_filter = [LlmFilter(env_service_url, llm_client, ...)]
self._exploration_strategy._inject_deps(
self._old_retrival, self._llm_client,
DashScopeClient(model_name='qwen3-235b-a22b-instruct-2507', max_tokens=8192),
env_profile=env_profile)
注意两处「藏刀」:
- 注入的依赖里塞了个
qwen3-235b专做 summarize——探索用轻模型,总结用强模型,省钱。 - 两层过滤器:实时
NaiveTaskPostFilter(边探边滤)+ 后置LlmFilter(LLM 判可行性),外加old_retrival(NaiveTaskObjectiveRetrieval,按task_id存已生成目标,避免重复)。
四、任务派生:探索 + 总结
generate_task 是主入口,伪代码即真相:
task_q = list(tasks) * self._n # 每个种子任务滚 n 次
parallel_num = min(self._num_exploration_threads, len(tasks))
with ThreadPoolExecutor(...) as pool:
for batch in batches(task_q, parallel_num):
futures = [pool.submit(self._exlore_and_summarize, task, ...)
for task in batch]
res.extend(sum(f.result() for f in futures))
res = reduce(lambda x,f: f.filter(x), self._realtime_filters, res)
self._old_retrival.reset(); add_objectives(res)
# 落盘检查点 → 后置过滤 → 打乱
_exlore_and_summarize 拆两步:_step_explore(策略去环境里逛)→ _step_summarize(把轨迹抽成任务)。批大小取 min(线程数, 任务数),正是注释所言「避免同时探索同一任务产生重复查询」。检查点 .generate_task.checkpoint.json 带 md5 摘要,断了能续。
RandomWalk 策略
strategies/random/__init__.py 的 LlmRandomSamplingExploreStrategy 是默认策略:
- explore:起
EnvWorker+ModifiedAgentFlow(enable_context_generator=False),max_steps=max_explore_step,在环境里随机踩点,吐一条Trajectory。 - summarize:把轨迹里真实 query 用
[MASKED]遮掉(steps[1]、steps[2]),再交给强模型get_task_summarize_prompt→parse_tasks_from_response,产出一串TaskObjective,且强制task.evaluator='synthetic'。
trajectory.steps[1]['content'] = '[MASKED]'
trajectory.steps[2]['content'] = '[MASKED]'
tasks = parse_tasks_from_response(task, llm_output)
遮真 query 是为防「总结」时把答案泄露回任务本身——合成任务须是开放问句,不是复述标准答案。
---
五、任务策展:滤与混
| 阶段 | 类 | 作用 |
|---|---|---|
| 实时滤 | NaiveTaskPostFilter | 基础去重/格式 |
| 后置滤 | LlmFilter | LLM 判可行性、[MASKED] 后验 |
| 混合 | UnifiedMixtureStrategy | 原任务 + 合成,按 synthetic_data_ratio 配 |
| 仅原 | OriginalOnlyStrategy | 验证集只用环境原生任务 |
FullDataset(见 datasets.py)把合成目标与环境原任务 mix_data 后 to_rl_dataset 成 RL 训练集。need_synthetic 为真才生成;有 cache_path 则落盘复用。get_statistics 回报合成/原生占比。---
六、内置合成奖励(兜底)
无用户自定义奖励时,synthetic_grader: llm 兜底。奖励三件套:相关性(轨迹对不对题)、成败(任务成否)、效率(步数是否合理)。官方明言:兜底能用,但领域奖励函数才能拉满性能。配置里 original_grader: env / synthetic_grader: llm 即分工。
---
七、接驳点:第 1 章那两个 TaskManager
回到 main_ppo.py:
train_task_manager = TaskManager(..., mixture_strategy=UnifiedMixtureStrategy(
use_original=config.task_manager.mixture.use_original_tasks, # basic.yaml=True
synthetic_ratio=config.task_manager.mixture.synthetic_data_ratio, # basic.yaml=0.0
shuffle=True, seed=42))
val_task_manager = TaskManager(..., mixture_strategy=OriginalOnlyStrategy())
最小化训练为何只吃内置数据? 因为 synthetic_data_ratio=0.0 且 use_original_tasks=True——UnifiedMixtureStrategy 只吐原任务,合成流水线被 n=0 熄火(n=0 时 task_q 空)。这正接上《深度研究》里「basic.yaml 只跑内置数据集」的结论,源头在此 TaskManager 与混合策略。
---
八、小结
Self-Questioning 的代码骨架:Profile 给概念 → RandomWalk 探环境 → 强模型总结遮真 query 抽任务 → 双层过滤器去芜 → 混合策略配比进 RL 集。本质是把「人工造题」自动化成一趟可断点续跑、可独立调试的流水线。NaiveTaskObjectiveRetrieval 做去重记忆,qwen3-235b 专司总结,n=0 一键关停合成——处处是工程上的省钱与防错心机。
下一章,看经验如何被复用——Self-Navigating 之 exp_manager 与 ReMe。