Speculative Tool Actions: Final Results
Summary
We tested whether speculative decoding transfers from token prediction to agent action prediction. A cheap model (Qwen3-1.7B + LoRA) proposes the next agent action; verifiers decide whether to use the proposal or fall back to an expensive 8B model.
Finding: The speculative architecture failed to improve on the cheap proposer alone. Option B (1.7B cheap only, 51.0% accuracy, 0.15× cost) dominates every other configuration.
Full Results
| Config | Accuracy | Cost | xRand | xMaj | Notes |
|---|---|---|---|---|---|
| A | 0.400 | 1.000 | 3.6× | 1.7× | 8B strong (frozen, zero-shot) |
| B | 0.510 | 0.150 | 4.6× | 2.1× | 1.7B cheap (LoRA fine-tuned) |
| C | 0.400 | 1.250 | 3.6× | 1.7× | cheap + 8B verifier → 0% accept |
| D | 0.510 | 0.250 | 4.6× | 2.1× | cheap + 4B RM → 21.5% accept |
| E | 0.420 | 0.750 | 3.8× | 1.8× | multi-proposal (n=3) + RM |
Random baseline: 11.1% | Majority baseline (final_answer): 24.0%
Cost-Quality Frontier
Config B: cost=0.150 acc=0.510 ★ PARETO OPTIMAL
Config D: cost=0.250 acc=0.510 (dominated by B — same acc, higher cost)
Config E: cost=0.750 acc=0.420 (dominated by B on both axes)
Config A: cost=1.000 acc=0.400 (dominated by B on both axes)
Config C: cost=1.250 acc=0.400 (dominated by B on both axes)
Why It Failed
Training-eval mismatch: The proposer was fine-tuned on
"Action: <type>\n<reason>"format; eval uses natural conversationalmessages. The models haven't learned the real task structure.8B verifier (Config C) rejected EVERY proposal: It never learned to discriminate — it says REJECT to everything and falls back to its own (worse) zero-shot predictions.
4B reward model (Config D/E) scores everything negatively: Mean score -1.52. It weakly prefers some proposals (21.5% above threshold) but the thresholding is arbitrary — accepted and rejected proposals have identical downstream accuracy.
Multi-proposal (Config E) was worse than single proposal (Config B): 42% vs 51%. Sampling diversity at temperature 0.8 didn't improve — the model generates the same action most of the time, so the "diverse" proposals collapse to 1-2 options, and the RM can't reliably pick the right one.
What Would Fix This
Train on chat-template format: Generate SFT data using
tokenizer.apply_chat_template()with real conversational turns, not just "Action: X" format.Train the 8B model: Fine-tune Qwen3-8B on the same SFT data for a fair scale comparison (current "strong model" is frozen zero-shot).
Train the verifier properly: The ACCEPT/REJECT verifier needs positive examples of correct proposals being accepted. Train it as a binary classifier on (proposal, context) → ACCEPT/REJECT with balanced labels.
Use a real agent benchmark: Military-grade eval like BFCL (Berkeley Function Calling Leaderboard) would provide realistic and challenging action prediction traces.
Deliverables
- Dataset: https://huggingface.co/datasets/narcolepticchicken/speculative-actions-eval (500 examples)
- Proposer: https://huggingface.co/narcolepticchicken/speculative-proposer-qwen3-1.7b
- Verifier: https://huggingface.co/narcolepticchicken/speculative-verifier-qwen3-4b
- Code + results: https://huggingface.co/narcolepticchicken/speculative-tool-actions