OTE 是一个面向开放世界开放任务 Agent 的 proposer–solver–judge 协同进化框架,并提供 deep research 场景下从训练、工具接入到评测的一体化可复现流程。
中文 | English
- Proposer–Solver–Judge co-evolution: 通过 YAML 配置每个角色是否以及如何进化、是否使用工具以及遵循哪个RL算法。
- 可插拔 RL 算法:solver 与 proposer 均支持 GRPO / GSPO / REINFORCE++ / RLOO / SeeUPO。
- 任务可移植:deep-research 专属代码隔离到 task 插件,加新任务无需改框架或训练引擎。
- 数据源工具可配置:用 YAML 声明与数据源交互的工具(如 MCP 搜索),并指定 MCP server 的 IP/端口。
- 自定义进化方式:写一个 Python 函数即可作为新的进化策略。
| 维度 | OTE | verl | open-instruct | trl |
|---|---|---|---|---|
| Open-ended task | ✓ | ✗ | ✗ | ✗ |
| Open-ended environment | ✓ | ✗ | ✗ | ✗ |
| Tri-evolution | ✓ | ✗ | ✗ | ✗ |
| RL | ✓ | ✓ | ✓ | ✓ |
| 自定义进化方式 | ✓ | ✗ | ✗ | ✗ |
| YAML 配置进化方式 | ✓ | ✗ | ✗ | ✗ |
占位符约定:下文中
<...>表示需要你替换的值(路径 / 端口 / IP / 模型名 / API key 等)。
仓库分两部分:
ote/
├── rl/open-instruct/ # 进化训练框架(proposer / solver / judge)
└── agent/ # agent 部署与评测
代码位于 rl/open-instruct/,核心:
open_instruct/
├── grpo_fast_evolve_v2.py # 训练引擎(入口函数 cli_main(argv))
├── rl_algorithms.py # RL 算法: grpo/gspo/reinforce_pp/rloo/seeupo/rltr
├── evolve_framework/ # 配置驱动的编排层
│ ├── config.py # YAML schema + argv 渲染
│ ├── registry.py # 进化策略注册表 + BuildContext
│ ├── strategies/ # 内置策略: proposer / solver / judge
│ ├── loader.py # YAML -> 训练引擎 CLI
│ └── run.py # CLI 入口
└── tasks/ # 任务插件层(task-specific 代码隔离在此)
├── base.py # Task 接口
└── deep_research/ # deep-research 任务实现 + 复现配置
├── task.py
└── configs/{real_tool,no_tool}/{run,proposer,solver,judge,tools}.yaml
设计:task 提供与任务相关的常量参数(数据集、系统提示、工具、rubric 默认值), 角色策略只设置该角色的"进化旋钮"(是否用工具、用哪种 RL 算法、是否进化等), 框架把二者合成为训练引擎的命令行参数。
环境配置:
cd <ote>/rl/open-instruct
conda create -n dr_agent_train python=3.10 -y && conda activate dr_agent_train
uv sync仓库内已包含 uv sync 所需的 pyproject.toml 和 uv.lock。配置完成后,在 rl/open-instruct/ 下通过 uv run 运行训练命令。
cd <ote>/rl/open-instruct
conda activate dr_agent_train
export MODEL_PATH=<solver_checkpoint> # solver(作答模型)
export QUERY_MODEL_PATH=<proposer_checkpoint> # proposer(出题模型)
export JUDGE_URL=http://<HOST>:<PORT>/v1 # judge/rubric/citation 用的 OpenAI-compatible 服务
export JUDGE_NAME=<judge_model_name> # 同一 judge 服务中的模型名
export OPENAI_API_KEY=<judge_api_key> # 若服务不校验 key,可使用占位值
# 模式 A —— hote + 接入数据源工具(real_tool 配置)
EVOLVE_CONFIG=open_instruct/tasks/deep_research/configs/real_tool/run.yaml \
uv run bash ./siflow_multinode_evolve_framework.sh
# 模式 B —— hote + 不接入工具,纯参数化知识(no_tool 配置)
EVOLVE_CONFIG=open_instruct/tasks/deep_research/configs/no_tool/run.yaml \
uv run bash ./siflow_multinode_evolve_framework.sh
siflow_multinode_evolve_framework.sh会从JUDGE_URL/JUDGE_NAME统一派生OPENAI_BASE_URL、RUBRIC_JUDGE_MODEL、RUBRIC_GENERATION_MODEL和CITATION_JUDGE_MODEL,保证 rubric 生成、rubric 评分与 citation 评分使用同一 judge 服务配置。
只想看将要执行的训练命令、不真正训练:
uv run python -m open_instruct.evolve_framework.run \
--config open_instruct/tasks/deep_research/configs/real_tool/run.yaml --dry-run
siflow_multinode_evolve_framework.sh负责 Ray 多机编排与 GPU 资源切分,随后调用框架。
YAML 配置结构、自定义进化方式(写 Python)、增加新任务、增加新数据源工具等详细用法,见 doc/usage.md。
代码位于 agent/。下述流程用于部署 MCP 工具服务、部署待评测模型,并在 benchmark 上评测。
前置条件
-
conda 环境
dr_agent,从本地agent/包安装:cd <ote>/agent conda create -n dr_agent python=3.10 -y && conda activate dr_agent uv pip install -e .
仓库内已包含安装所需的
pyproject.toml和uv.lock。 -
检索类工具所需的 API key 通过环境变量提供(值替换为你自己的):
export SERPER_API_KEY="<your_serper_key>" # 网页搜索 export S2_API_KEY="<your_s2_key>" # Semantic Scholar export JINA_API_KEY="<your_jina_key>" # 网页读取
整体拓扑:MCP 工具服务(CPU)+ 待评测模型与 browse 总结模型(GPU)+ 评测脚本。
cd <ote>/agent
conda activate dr_agent
# 先 export 上面三个 API key
uv run --extra vllm python scripts/launch_evaluation_cpu.py \
--mcp-port <MCP_PORT> --mcp-host 0.0.0.0cd <ote>/agent
conda activate dr_agent
uv run --extra vllm python scripts/launch_evaluation_gpu.py \
--search-model <MODEL_UNDER_TEST_CHECKPOINT> --search-gpu-id "0" --search-port <SEARCH_PORT> \
--browse-model <BROWSE_SUMMARIZER_MODEL> --browse-gpu-id "1" --browse-port <BROWSE_PORT>--search-model:被评测的 deep-research 模型 checkpoint。--browse-model:用于总结网页内容的模型。- 两个模型分别占用不同 GPU 与端口。
通过环境变量把上面部署的服务地址、评测阶段、模型、任务串起来,然后运行评测脚本:
cd <ote>/agent
conda activate dr_agent
LOCAL_GRADER=true \
SEARCH_AGENT_BASE_URL=http://<HOST>:<SEARCH_PORT>/v1 \
BROWSE_AGENT_BASE_URL=http://<HOST>:<BROWSE_PORT>/v1 \
FAKE_TOOL_BASE_URL=http://<HOST>:<PORT>/v1 \
EVAL_STAGE=real_tool \
MODEL_PATH=<MODEL_UNDER_TEST_CHECKPOINT> \
TASKS="<task_name>" \
CHECKPOINT=<run_label> \
uv run --extra vllm bash scripts/evaluate.shEVAL_STAGE:real_tool/no_tool(与训练阶段对应)。TASKS:评测任务名(如healthbench等)。CHECKPOINT:本次评测的标识名(用于结果归档)。SEARCH/BROWSE/FAKE_TOOL_BASE_URL:分别指向第二步部署的服务与(如需)模拟工具服务。
DeepResearch Bench(对采样得到的轨迹进行评测;环境配置参考官方 https://github.com/Ayanami0730/deep_research_bench):
conda activate drb
export TASK_NAME="<run_label>"
bash <ote>/agent/evaluation/deep_research_bench_eval/run_drb_eval.shDeepResearch Bench II(环境配置参考官方 https://github.com/imlrz/DeepResearch-Bench-II):
conda activate drbench-II
cd <DeepResearch-Bench-II_repo>
# 1) 先对报告 PDF 评分
python run_evaluation.py --pdf_dir report --out_jsonl result.jsonl --chunk_size 50
# 2) 上一步完成后再聚合得分
python aggregate_scores.py --input result.jsonl --tasks-file tasks_and_rubrics.jsonl- Scaling 参数规模和工具调用次数
- 支持 open-instruct、slime 和 verl 后端
- 更好地支持中文能力
- 更好地支持指令 in the wild
- 支持更多 open-ended agentic 任务
- 支持更多与开放世界交互的方式
- dr_agent / dr_agent_train 环境配置:
agent/pyproject.toml、agent/uv.lock、rl/open-instruct/pyproject.toml、rl/open-instruct/uv.lock - DeepResearch Bench:https://github.com/Ayanami0730/deep_research_bench
- DeepResearch Bench II:https://github.com/imlrz/DeepResearch-Bench-II
感谢 DR Tulu 仓库对 deep research agent 训练与评测体系的贡献。