README.md

August 24, 2026 ยท View on GitHub

ARCO: Adaptive Rubrics with Co-Evolution for Multi-Step LLM-Based Agents

Code arXiv


๐Ÿ“Œ Introduction

ARCO (Adaptive Rubric CO-evolution) trains multi-step LLM agents with interpretable, step-level process rewards. A single rubric model ฮผ shares a backbone between a generation head that emits K=3 natural-language criteria per step and a score head that returns rubric-conditioned step rewards. A trajectory-decomposition constraint ties the sum of step rewards to the binary outcome reward, so ฮผ and the policy ฯ€ are co-optimized on the same on-policy rollouts โ€” without any external judge.

ARCO has three properties that distinguish it from prior reward-modeling work:

  • Step-level rubrics. Existing rubric methods score at the trajectory level; ARCO writes a fresh checklist for every action and scores the action under that checklist.
  • Trainable, same-scale evaluator. No frozen closed-source judge โ€” ฮผ is an open-source LM that learns alongside the policy.
  • Co-evolution at the parameter level. Both the rubric content and the scoring function are updated by gradients, on the same on-policy data that updates ฯ€.

This repository ships the minimal implementation for the HotpotQA + Qwen3-4B setting from the paper.


๐Ÿ› ๏ธ Environment Setup

We recommend Conda.

# 1. Create a new conda environment with Python 3.10
conda create -n arco python=3.10 -y

# 2. Activate the environment
conda activate arco

# 3. Install dependencies
pip install -r requirements.txt

A CUDA build of torch matching your driver is required. ARCO trains with LoRA in bf16; one 80 GB GPU is enough for Qwen3-4B, two GPUs (one for ฯ€, one for ฮผ) make the dense stage faster.


๐Ÿ’พ Data & Models

Datasets

Place the original HotpotQA corpus under data/hotpotqa/:

mkdir -p data/hotpotqa
wget -O data/hotpotqa/hotpot_train_v1.1.json \
  http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_train_v1.1.json
wget -O data/hotpotqa/hotpot_dev_distractor_v1.json \
  http://curtis.ml.cmu.edu/datasets/hotpot/hotpot_dev_distractor_v1.json

Note: the 2k / 500 splits we trained on, the GPT-annotated warmup trajectories, and the derived ฯ€ / ฮผ SFT data are all included under data/hotpotqa/splits/ and data/hotpotqa/output/. You can skip warmup collection and go straight to the RL stage with the shipped jsonl files.

Pre-trained Models

The code reads model paths from configs/hotpotqa/hotpotqa.yaml and configs/hotpotqa/arco_qwen.yaml. By default it pulls from Hugging Face:

  • Qwen/Qwen3-4B-Instruct-2507 โ€” backbone for both ฯ€ and ฮผ
  • princeton-nlp/unsup-simcse-roberta-base โ€” local SimCSE retriever

Using Local Weights: If you have mirrored these weights locally, replace the strings above in the two YAMLs with your absolute paths.

API Key (warmup only)

Stage 1 (warmup collection) calls a GPT teacher. Set your key in configs/hotpotqa/hotpotqa.yaml โ†’ api.api_key. You can skip this entirely if you reuse the shipped warmup jsonl.


๐Ÿš€ Quick Start

End-to-end pipeline:

bash scripts/run/hotpotqa/run_arco_qwen.sh

The script chains the four stages below. Run them individually if you want fine control.

Step 0: Launch the SimCSE Retriever

CUDA_VISIBLE_DEVICES=0 python scripts/deploy_retriever.py \
  --config configs/hotpotqa/hotpotqa.yaml

The service listens on http://127.0.0.1:2022/retrieve. The port is set in configs/hotpotqa/hotpotqa.yaml โ†’ retriever.port.

Step 1: Collect Warmup (skip if using shipped jsonl)

python scripts/collect_warmup.py --config configs/hotpotqa/hotpotqa.yaml

This drives a GPT teacher through HotpotQA training questions and dumps trajectories + per-step rubrics to data/hotpotqa/output/warmup_records.jsonl.

Step 2: Warmup-SFT the Policy ฯ€

CUDA_VISIBLE_DEVICES=0 python scripts/sft_pi.py \
  --config configs/hotpotqa/pi.yaml

ฯ€ is initialized to imitate the high-reward warmup trajectories.

Step 3: Warmup-SFT the Rubric Model ฮผ

CUDA_VISIBLE_DEVICES=0 python scripts/sft_mu.py \
  --config configs/hotpotqa/mu.yaml

ฮผ is trained with a dual objective โ€” an LM loss on rubric text and an MSE on projected criterion scores so that the trajectory-decomposition constraint holds at warmup.

Step 4: ARCO Co-Evolution RL

python scripts/rl_train.py --config configs/hotpotqa/arco_qwen.yaml

The RL trainer follows a sparse-to-dense schedule: the first few epochs use the binary outcome reward only (so ฮผ catches up to the fresh rollouts), then ฯ€ is trained with reward-to-go advantages from ฮผ's step scores using a position-bucketed baseline, while ฮผ is updated by trajectory-decomposition MSE plus KL to its warmup reference.

Tip: vLLM rollout is enabled by default in configs/hotpotqa/arco_qwen.yaml (vllm.enabled: true, max_model_len: 8192). Disable it if your GPU memory is tight.


๐Ÿ“‚ Repository Layout

ARCO/
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ src/                          # ARCO framework
โ”‚   โ”œโ”€โ”€ agents/                   # policy / rubric agent
โ”‚   โ”œโ”€โ”€ environments/             # HotpotQA env + dataset registry
โ”‚   โ”œโ”€โ”€ training/                 # rl_trainer, dual_head_mu, sft_trainer, vllm_engine, ...
โ”‚   โ””โ”€โ”€ utils/                    # retriever, metrics, prompt builders, api client
โ”œโ”€โ”€ scripts/
โ”‚   โ”œโ”€โ”€ collect_warmup.py         # GPT-teacher warmup collection
โ”‚   โ”œโ”€โ”€ sft_pi.py / sft_mu.py     # Warmup SFT for policy and rubric model
โ”‚   โ”œโ”€โ”€ rl_train.py               # Co-evolution RL
โ”‚   โ”œโ”€โ”€ deploy_retriever.py       # SimCSE retriever service
โ”‚   โ””โ”€โ”€ run/hotpotqa/run_arco_qwen.sh
โ”œโ”€โ”€ configs/hotpotqa/
โ”‚   โ”œโ”€โ”€ hotpotqa.yaml             # Dataset / API / retriever
โ”‚   โ”œโ”€โ”€ pi.yaml                   # Policy SFT config
โ”‚   โ”œโ”€โ”€ mu.yaml                   # Rubric model SFT config
โ”‚   โ””โ”€โ”€ arco_qwen.yaml            # ARCO RL config (vLLM enabled, max_model_len=8192)
โ”œโ”€โ”€ prompts/                      # Policy / rubric / shared prompt templates
โ””โ”€โ”€ data/hotpotqa/
    โ”œโ”€โ”€ splits/                   # train_2k.jsonl, dev_500.jsonl
    โ””โ”€โ”€ output/                   # GPT warmup + ฯ€ / ฮผ SFT data

๐Ÿ“‘ Citation

If you find ARCO useful in your research, please cite our paper:

@misc{tian2026arcoadaptiverubricscoevolution,
      title={ARCO: Adaptive Rubrics with Co-Evolution for Multi-Step LLM-Based Agents}, 
      author={Zihang Tian and Jingsen Zhang and Rui Li and Xiaohe Bo and Yuanzi Li and Xu Chen},
      year={2026},
      eprint={2606.21262},
      archivePrefix={arXiv},
      primaryClass={cs.AI},
      url={https://arxiv.org/abs/2606.21262}, 
}