Research log Small Model Experimentation
GitHub

Qwen Batched Transduction Consistency

Finished2026-06-27imported · line YBenchmark GeneralizationGitHub ↗
Answering rows together never helped, sometimes hurt

The one idea you need

Picture reformatting one column of a spreadsheet. You can hand the model each cell alone, or show it every cell at once, hoping it locks onto a single rule and applies it uniformly. Shared context should breed consistency, but one slip now spoils the whole column.

The question

If a model reformats a batch of similar entries all together instead of one by one, does it get the whole set right more often?

What we found

No. Answering every entry in one combined pass got the whole task right 45 percent of the time, versus 50 percent when each entry was handled alone, a five-point loss. Bundling never rescued a task the solo approach had failed, and it spoiled two tasks that had been fully solved. Asking the model to reason first or format strictly did not close the gap.

Why it matters

To cut calls by packing similar rows into one generation, know the tax: one wrong element fails the whole batch, and shared context can corrupt rows the model would have nailed alone. Keep independent rows independent.

Whole task fully right, one entry at a time50%share of tasks with every entry correct, handled solo
Whole task fully right, all entries together45%best bundled approach, a five-point drop
Failed tasks the bundling rescued0 of 40never turned a loss into a win
Solved tasks the bundling broke2 of 40correct handled solo, wrong once bundled
On this page
  1. Results at a glance
  2. Overview
  3. Report
    1. Abstract
    2. Method
    3. Run Configuration
    4. Primary Results
    5. Figures
    6. Interpretation
    7. Limitations
    8. Artifacts
  4. Experiment log
  5. Figures
  6. Data files
  7. Reproduce
  8. Related

Results at a glance 3

Bundling rows six ways versus handling them one at a time

How to read

Six methods run along the bottom, from one-at-a-time up through ever-larger bundles to all-at-once with order shuffled or a rule hint; taller is better. Dark bars show how often the whole task was fully correct, light bars how often a single entry was correct.

0%20%40%60%80%row-by-rowrow-by-row50%72.1%batch of 2batch of 240%70.2%batch of 4batch of 440%71.7%batch allbatch all45%72.5%batch all, shuffled orderbatch all, shuffled order42.5%65.8%batch all + rule hintbatch all + rule hint45%69%

Takeaway → The leftmost one-at-a-time bar is tallest on whole-task correctness, so no bundling method beats handling entries separately, though bigger bundles beat smaller ones.

Data table
prompting methodfull-task exactrow exact
row-by-row50%72.1%
batch of 240%70.2%
batch of 440%71.7%
batch all45%72.5%
batch all, shuffled order42.5%65.8%
batch all + rule hint45%69%

Numbers from experiments/qwen_batched_transduction_consistency/analysis/iteration_comparison.csv

Technical framing

Batched transduction vs row-by-row prompting (40 text-transformation tasks) — No batched arm beats row-by-row on strict full-task exact; larger batches help but the best (45%) still trails row-by-row (50%).

Stricter bundling instructions still fall short

How to read

Four methods along the bottom, taller is better: handling entries one at a time versus three ways of bundling them with tougher instructions. Dark bars are whole-task correctness; light bars are single-entry correctness.

0%20%40%60%80%row-by-rowrow-by-row50%72.1%batch allbatch all45%72.5%batch all + verify hintbatch all + verify hint45%70%batch all + structured JSON inputbatch all + structured JSON input42.5%67.5%

Takeaway → Every bundled bar sits at or below the one-at-a-time bar on whole-task correctness, so tighter instructions never close the gap.

Data table
prompting method (v2 iteration)full-task exactrow exact
row-by-row50%72.1%
batch all45%72.5%
batch all + verify hint45%70%
batch all + structured JSON input42.5%67.5%

Numbers from experiments/qwen_batched_transduction_consistency/analysis/summary.csv

Technical framing

Stricter batch prompts do not recover the gap — A verify hint ties plain batch-all at 45% full-task exact and structured JSON input falls to 42.5%; prompt iteration cannot close the gap.

For each task, did bundling help, tie, or hurt?

How to read

Three bars count, out of forty tasks, how many bundling improved, left unchanged, or worsened versus one at a time. A tall wins bar would be good; a tall loses bar is bad.

010203040batch-all winsbatch-all wins0tiesties38batch-all losesbatch-all loses2

Takeaway → The wins bar is empty, thirty-eight tasks tie, and two tasks lose, so bundling only ever hurt or made no difference.

Data table
task outcometasks (of 40)
batch-all wins0
ties38
batch-all loses2

Numbers from report table (reports/qwen_batched_transduction_consistency_report.md, Batch-All Task Flips)

Technical framing

Per-task outcome: batch-all vs row-by-row on full-task exact — Batch-all never flips a failed task into a full-task success and loses two tasks that row-by-row solved: a clean negative result.

In the author’s words from the Report · “Abstract”

This standalone experiment tests whether answering multiple query rows in one shared generation context improves task-level consistency on public text-transformation tasks. The strict primary metric is full-task exact: all held-out rows for a task must be answered exactly.

Overview

Standalone experiment testing whether batched transduction improves task-level consistency on public text-transformation tasks.

Question

Given a few input-output examples and multiple query rows, does answering all queries in one shared generation context improve full-task consistency compared with answering each row independently?

Main Arms

  • row_by_row: one prompt per held-out row.
  • batch_2: held-out rows answered in batches of two.
  • batch_4: held-out rows answered in batches of four.
  • batch_all: all held-out rows for the task answered in one JSON list.
  • batch_all_shuffled: all held-out rows answered in one JSON list, but query order is deterministically shuffled and then unshuffled for scoring.
  • batch_all_rule_hint: all held-out rows answered together with an instruction to infer one rule internally before emitting the JSON list.

Layout

Report

Rendered from reports/qwen_batched_transduction_consistency_report.md

Abstract

This standalone experiment tests whether answering multiple query rows in one shared generation context improves task-level consistency on public text-transformation tasks. The strict primary metric is full-task exact: all held-out rows for a task must be answered exactly.

Method

  • Dataset: public Transformation.Text tasks.
  • Split: first 4 examples are train examples; up to 6 held-out examples are scored.
  • Row-by-row baseline: one prompt per held-out row.
  • Batched transduction: one JSON-array output per query batch, with batch sizes 2, 4, and all held-out rows.
  • Shuffled-order control: query rows are shuffled inside the batch and then unshuffled for scoring.
  • Rule-hint arm: one-batch output with an instruction to use one consistent internal rule.
  • Parse failures are counted directly; malformed or wrong-length JSON arrays receive empty predictions for missing rows.

Run Configuration

  • Suite: main_v2_prompt_iteration.
  • Qwen model: Qwen/Qwen3-4B.
  • Tasks: 40.
  • Held-out cap: 6.
  • Sample seed: 20260627.

Primary Results

Prompt Iteration Result

methodtasksfull_task_exactrow_exactparse_ok_rate
batch_all4045.0%72.5%100.0%
batch_all_structured4042.5%67.5%100.0%
batch_all_verify_hint4045.0%70.0%100.0%
row_by_row4050.0%72.1%100.0%

Iteration Comparison

The first main run swept batch size and basic controls. The second main run kept the same 40-task sample and tested stricter batch prompts.

iterationmethodtasksfull_task_exactrow_exactparse_ok_rate
v1_batch_sweeprow_by_row4050.0%72.1%100.0%
v1_batch_sweepbatch_24040.0%70.2%99.2%
v1_batch_sweepbatch_44040.0%71.7%99.2%
v1_batch_sweepbatch_all4045.0%72.5%100.0%
v1_batch_sweepbatch_all_shuffled4042.5%65.8%100.0%
v1_batch_sweepbatch_all_rule_hint4045.0%69.0%100.0%
v2_prompt_iterationrow_by_row4050.0%72.1%100.0%
v2_prompt_iterationbatch_all4045.0%72.5%100.0%
v2_prompt_iterationbatch_all_verify_hint4045.0%70.0%100.0%
v2_prompt_iterationbatch_all_structured4042.5%67.5%100.0%

Batch-All Task Flips

  • Batch-all wins over row-by-row on 0 tasks.
  • Batch-all loses to row-by-row on 2 tasks.
  • Batch-all ties row-by-row on 38 tasks.

Family Summary

familymethodtasksfull_task_exactrow_exact
Addressbatch_all20.0%50.0%
Addressbatch_all_structured20.0%50.0%
Addressbatch_all_verify_hint20.0%50.0%
Addressrow_by_row20.0%50.0%
BillingCodebatch_all10.0%0.0%
BillingCodebatch_all_structured10.0%0.0%
BillingCodebatch_all_verify_hint10.0%0.0%
BillingCoderow_by_row10.0%33.3%
Citybatch_all250.0%87.5%
Citybatch_all_structured2100.0%100.0%
Citybatch_all_verify_hint2100.0%100.0%
Cityrow_by_row250.0%87.5%
Columnbatch_all1100.0%100.0%
Columnbatch_all_structured1100.0%100.0%
Columnbatch_all_verify_hint1100.0%100.0%
Columnrow_by_row1100.0%100.0%
DateTimebatch_all1650.0%75.0%
DateTimebatch_all_structured1637.5%69.8%
DateTimebatch_all_verify_hint1643.8%72.9%
DateTimerow_by_row1656.2%70.8%
FilePathbatch_all1100.0%100.0%
FilePathbatch_all_structured1100.0%100.0%
FilePathbatch_all_verify_hint1100.0%100.0%
FilePathrow_by_row1100.0%100.0%
Genderbatch_all10.0%66.7%
Genderbatch_all_structured10.0%66.7%
Genderbatch_all_verify_hint10.0%66.7%
Genderrow_by_row10.0%66.7%
Languagebatch_all1100.0%100.0%
Languagebatch_all_structured1100.0%100.0%
Languagebatch_all_verify_hint1100.0%100.0%
Languagerow_by_row1100.0%100.0%
Namebatch_all1100.0%100.0%
Namebatch_all_structured1100.0%100.0%
Namebatch_all_verify_hint1100.0%100.0%
Namerow_by_row1100.0%100.0%
Numberbatch_all1020.0%62.5%
Numberbatch_all_structured1020.0%48.3%
Numberbatch_all_verify_hint1020.0%53.3%
Numberrow_by_row1030.0%64.2%
Phonebatch_all2100.0%100.0%
Phonebatch_all_structured2100.0%100.0%
Phonebatch_all_verify_hint2100.0%100.0%
Phonerow_by_row2100.0%100.0%
ShippingCodebatch_all10.0%33.3%
ShippingCodebatch_all_structured10.0%33.3%
ShippingCodebatch_all_verify_hint10.0%33.3%
ShippingCoderow_by_row10.0%33.3%
UserAgentbatch_all1100.0%100.0%
UserAgentbatch_all_structured1100.0%100.0%
UserAgentbatch_all_verify_hint1100.0%100.0%
UserAgentrow_by_row1100.0%100.0%

Task Details

task_idfamilymethodheldout_rowsfull_task_exactrow_exactparse_ok_rate
Address.000002Addressbatch_all3False33.3%100.0%
Address.000002Addressrow_by_row3False33.3%100.0%
Address.000013Addressbatch_all6False66.7%100.0%
Address.000013Addressrow_by_row6False66.7%100.0%
BillingCode.000007BillingCodebatch_all3False0.0%100.0%
BillingCode.000007BillingCoderow_by_row3False33.3%100.0%
City.000010Citybatch_all3True100.0%100.0%
City.000010Cityrow_by_row3True100.0%100.0%
City.000011Citybatch_all4False75.0%100.0%
City.000011Cityrow_by_row4False75.0%100.0%
Column.000001Columnbatch_all6True100.0%100.0%
Column.000001Columnrow_by_row6True100.0%100.0%
DateTime.000004DateTimebatch_all6True100.0%100.0%
DateTime.000004DateTimerow_by_row6True100.0%100.0%
DateTime.000007DateTimebatch_all6True100.0%100.0%
DateTime.000007DateTimerow_by_row6True100.0%100.0%
DateTime.000017DateTimebatch_all6True100.0%100.0%
DateTime.000017DateTimerow_by_row6True100.0%100.0%
DateTime.000025DateTimebatch_all6True100.0%100.0%
DateTime.000025DateTimerow_by_row6True100.0%100.0%
DateTime.000027DateTimebatch_all6False66.7%100.0%
DateTime.000027DateTimerow_by_row6False33.3%100.0%
DateTime.000034DateTimebatch_all6True100.0%100.0%
DateTime.000034DateTimerow_by_row6True100.0%100.0%
DateTime.000051DateTimebatch_all3False33.3%100.0%
DateTime.000051DateTimerow_by_row3False33.3%100.0%
DateTime.000076DateTimebatch_all6False66.7%100.0%
DateTime.000076DateTimerow_by_row6False66.7%100.0%
DateTime.000081DateTimebatch_all6False50.0%100.0%
DateTime.000081DateTimerow_by_row6False50.0%100.0%
DateTime.000094DateTimebatch_all4True100.0%100.0%
DateTime.000094DateTimerow_by_row4True100.0%100.0%
DateTime.000104DateTimebatch_all6True100.0%100.0%
DateTime.000104DateTimerow_by_row6True100.0%100.0%
DateTime.000108DateTimebatch_all6True100.0%100.0%
DateTime.000108DateTimerow_by_row6True100.0%100.0%
DateTime.000111DateTimebatch_all6False83.3%100.0%
DateTime.000111DateTimerow_by_row6True100.0%100.0%
DateTime.000114DateTimebatch_all6False50.0%100.0%
DateTime.000114DateTimerow_by_row6False0.0%100.0%
DateTime.000115DateTimebatch_all6False0.0%100.0%
DateTime.000115DateTimerow_by_row6False0.0%100.0%
DateTime.000116DateTimebatch_all6False50.0%100.0%
DateTime.000116DateTimerow_by_row6False50.0%100.0%
FilePath.000001FilePathbatch_all6True100.0%100.0%
FilePath.000001FilePathrow_by_row6True100.0%100.0%
Gender.000001Genderbatch_all3False66.7%100.0%
Gender.000001Genderrow_by_row3False66.7%100.0%
Language.000002Languagebatch_all6True100.0%100.0%
Language.000002Languagerow_by_row6True100.0%100.0%
Name.000028Namebatch_all6True100.0%100.0%
Name.000028Namerow_by_row6True100.0%100.0%
Number.000008Numberbatch_all6False16.7%100.0%
Number.000008Numberrow_by_row6False33.3%100.0%
Number.000015Numberbatch_all6False50.0%100.0%
Number.000015Numberrow_by_row6False33.3%100.0%
Number.000016Numberbatch_all6False50.0%100.0%
Number.000016Numberrow_by_row6False83.3%100.0%
Number.000022Numberbatch_all6False33.3%100.0%
Number.000022Numberrow_by_row6True100.0%100.0%
Number.000028Numberbatch_all3True100.0%100.0%
Number.000028Numberrow_by_row3True100.0%100.0%
Number.000029Numberbatch_all3False66.7%100.0%
Number.000029Numberrow_by_row3False66.7%100.0%
Number.000043Numberbatch_all6True100.0%100.0%
Number.000043Numberrow_by_row6True100.0%100.0%
Number.000049Numberbatch_all4False75.0%100.0%
Number.000049Numberrow_by_row4False25.0%100.0%
Number.000075Numberbatch_all6False66.7%100.0%
Number.000075Numberrow_by_row6False66.7%100.0%
Number.000077Numberbatch_all3False66.7%100.0%
Number.000077Numberrow_by_row3False33.3%100.0%
Phone.000008Phonebatch_all6True100.0%100.0%
Phone.000008Phonerow_by_row6True100.0%100.0%
Phone.000011Phonebatch_all3True100.0%100.0%
Phone.000011Phonerow_by_row3True100.0%100.0%
ShippingCode.000008ShippingCodebatch_all3False33.3%100.0%
ShippingCode.000008ShippingCoderow_by_row3False33.3%100.0%
UserAgent.000003UserAgentbatch_all6True100.0%100.0%
UserAgent.000003UserAgentrow_by_row6True100.0%100.0%

Figures

method_accuracy.png

parse_cleanliness.png

family_batch_delta.png

task_row_scatter.png

iteration_comparison.png

Interpretation

Row-by-row inference reaches 72.1% row exact and 50.0% full-task exact. Batch-all reaches 72.5% row exact and 45.0% full-task exact, a full-task delta of -5.0% and a row-exact delta of 0.4%. The result is a clean negative for batched transduction as a general consistency fix in this setup. Batch-all slightly improves average row exact, but it never flips a row-by-row-failed task into a full-task success on the 40-task sample, and it loses two tasks that row-by-row solved. The batch-size sweep shows larger batches are better than smaller batches, but the best batched arm still trails row-by-row on full-task exact. The stricter prompt iteration does not recover the gap: verify-hint batch-all ties plain batch-all at 45.0%, while structured JSON input falls to 42.5%. The shuffled-order control is lower than normal batch-all, so ordering and shared context carry some signal. The signal is not enough to overcome the new batch failure mode: one wrong element in the JSON array spoils full-task exact, and batch prompting sometimes changes correct row-by-row outputs into wrong batched outputs.

Limitations

This run uses deterministic decoding and a capped task sample. Batched JSON output is stricter than ordinary text output, so parse cleanliness is reported separately. Full-task exact is intentionally harsh; a method can have high row exact while failing full-task exact because one row is wrong.

Artifacts

  • Task-level details: analysis/task_details.csv
  • Row-level details: analysis/row_details.csv
  • Summary: analysis/summary.csv
  • Iteration comparison: analysis/iteration_comparison.csv
  • Figures: analysis/figures/
  • Benchmark mirror: /workspace/large_artifacts/qwen_batched_transduction_consistency/prose-benchmarks

Experiment log 4

Show the running log (4 entries)

Setup

  • Created a fresh standalone experiment directory.
  • Copied the public transformation benchmark mirror into /workspace/large_artifacts/qwen_batched_transduction_consistency/prose-benchmarks.
  • Primary metric: full-task exact on held-out rows. A task counts only if every held-out row is exact.
  • Secondary metrics: row exact, parse success, and parsed item count.

Run smoke_v1

  • Time UTC: 2026-06-27T06:16:05.586794+00:00
  • Elapsed seconds: 12.4
  • Config: {"batch_max_new_tokens": 160, "heldout_cap": 3, "methods": "row_by_row,batch_all", "min_heldout": 3, "qwen_task_limit": 4, "row_max_new_tokens": 48, "sample_seed": 20260627, "suite": "smoke_v1", "task_limit": 0, "train_n": 4}
  • batch_all: row exact 91.7%; full-task exact 75.0%; parse ok 100.0%
  • row_by_row: row exact 83.3%; full-task exact 75.0%; parse ok 100.0%

Run main_v1

  • Time UTC: 2026-06-27T06:25:27.762033+00:00
  • Elapsed seconds: 530.3
  • Config: {"batch_max_new_tokens": 320, "heldout_cap": 6, "methods": "", "min_heldout": 3, "qwen_task_limit": 40, "row_max_new_tokens": 64, "sample_seed": 20260627, "suite": "main_v1", "task_limit": 0, "train_n": 4}
  • batch_2: row exact 70.2%; full-task exact 40.0%; parse ok 99.2%
  • batch_4: row exact 71.7%; full-task exact 40.0%; parse ok 99.2%
  • batch_all: row exact 72.5%; full-task exact 45.0%; parse ok 100.0%
  • batch_all_rule_hint: row exact 69.0%; full-task exact 45.0%; parse ok 100.0%
  • batch_all_shuffled: row exact 65.8%; full-task exact 42.5%; parse ok 100.0%
  • row_by_row: row exact 72.1%; full-task exact 50.0%; parse ok 100.0%

Run main_v2_prompt_iteration

  • Time UTC: 2026-06-27T06:32:43.777202+00:00
  • Elapsed seconds: 357.6
  • Config: {"batch_max_new_tokens": 360, "heldout_cap": 6, "methods": "row_by_row,batch_all,batch_all_verify_hint,batch_all_structured", "min_heldout": 3, "qwen_task_limit": 40, "row_max_new_tokens": 64, "sample_seed": 20260627, "suite": "main_v2_prompt_iteration", "task_limit": 0, "train_n": 4}
  • batch_all: row exact 72.5%; full-task exact 45.0%; parse ok 100.0%
  • batch_all_structured: row exact 67.5%; full-task exact 42.5%; parse ok 100.0%
  • batch_all_verify_hint: row exact 70.0%; full-task exact 45.0%; parse ok 100.0%
  • row_by_row: row exact 72.1%; full-task exact 50.0%; parse ok 100.0%

Figures 5

family batch delta
family batch delta · analysis/figures/
iteration comparison
iteration comparison · analysis/figures/
method accuracy
method accuracy · analysis/figures/
parse cleanliness
parse cleanliness · analysis/figures/
task row scatter
task row scatter · analysis/figures/

Data files 4

Result tables and metrics copied from the experiment folder — preview inline or open the raw file.

Reproduce

This entry is source code or analysis only — there is no separate run to reproduce.

Browse the experiment folder on GitHub ↗