Why this exists
GRPO on τ²-bench-airline from raw Qwen2.5-7B-Instruct is null — and not because of a bug.
Base success is ~20%, so most rollout groups come back all-fail → zero intra-group variance → the
group-relative advantage is ~0 → no gradient. RL sharpens what a policy already does sometimes;
it cannot invent a skill. Worse, the base policy's own successful rollouts never invoke the
write-tools (update_reservation_*) that held-out tasks require, so self-sampling can't bootstrap
them either.
This adapter is the floor that makes the RL step work.
Results
This adapter, merged into the base, is the step 0 policy of the
tau2_airline verl recipe. Measured under
that recipe's protocol (held-out BINARY mean@4, 20 held-out airline tasks, VAL_TEMP=0.5,
llama-3.3-70b user simulator):
Table with columns: val@0 (this adapter), val@20 (after GRPO) | val@0 (this adapter) | val@20 (after GRPO) |
|---|
| seed 42 | 0.275 | 0.5625 |
| seed 123 | 0.375 | 0.55 |
GRPO endpoint across 2 seeds: 0.556 ± 0.01. Measured evaluation noise on this same checkpoint
(6 repeats of val@0) is 0.30 ± 0.05, so the two val@0 values above are a single checkpoint
sampled twice from that band, not a difference.
Scope note. A separate hand-written pipeline reported
base 0.20 → distilled SFT 0.405 → GRPO 0.545
for this approach, but under a different eval protocol (pass^1 over 10 trials
with a self-hosted 7B user simulator, n=200). Those numbers are not directly comparable to the
table above — different user simulator, different metric — and I have not re-verified that this
exact file is the checkpoint they were measured on. The table above is what this file scores.
Usage
from peft import PeftModelfrom transformers import AutoModelForCausalLM, AutoTokenizer base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct", torch_dtype="auto", device_map="auto")model = PeftModel.from_pretrained(base, "yuyu0529nya/qwen2.5-7b-tau2-airline-sft-lora")tok = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
To use it as an RL starting point, merge first (model.merge_and_unload()) and point the trainer at
the merged weights — that is exactly how the recipe above consumes it.
This adapter only makes sense inside the τ²-bench airline harness — same system prompt, same 14
tool schemas, same dialogue loop. It is a policy for that environment, not a general chat model.
Training
Table | |
|---|
| base | Qwen/Qwen2.5-7B-Instruct |
| method | behavior-cloning SFT (QLoRA 4-bit) on teacher trajectories |
| teacher | DeepSeek V4 Flash (deepseek-v4-flash, requested via the deepseek-chat alias) — agent and user-simulator, temp 0.7 |
| data | yuyu0529nya/tau2-airline-deepseek-distill (ds_114 config) — 114 successful teacher trajectories (reward = 1), deduped by action signature, capped 4/task |
| LoRA |
Teacher success on these tasks was ~76% vs base ~20%, and 51% of teacher trajectories invoke the
write-tools the base policy never reaches on its own. That skill gap is why self-RFT from base
cannot work here, and why distillation — rather than more RL — was the fix.
Licensing / provenance
- Base model:
Qwen2.5-7B-Instruct, Apache-2.0 → derivatives unrestricted.
- Teacher outputs (DeepSeek V4 Flash): DeepSeek Open Platform ToS §4.2(2) assigns "any rights,
ownership and interest" in outputs to the user; §4.2(3) explicitly permits applying inputs/outputs
to "training other models (e.g. model distillation)".
- Task data: τ²-bench airline tasks are public benchmark data. All user profiles in the
trajectories are synthetic (
@example.com, RFC 2606 reserved). No real PII.
- Released under Apache-2.0.
Honest limits
- 20 held-out tasks. One task is worth 5 percentage points. Read single-point moves as noise.
- 30 training tasks, 114 teacher trajectories. Small-data regime throughout.
- Teacher/eval simulator mismatch: teacher dialogues used an API user-simulator; the reported
evals use
llama-3.3-70b. Not controlled for.
airline domain only. Not evaluated on other τ²-bench domains. Not a general-purpose model.
- The reported runs used a hosted user simulator with provider fallback enabled, so they are not
bit-reproducible.
Links