CoolFace
Datasetpublic

dougalldeepmind/2026-08-04-sft-mixture-table2-8000-plus-synthdoc-2203

SFT mixture — Table 2 instruction-tuning (8,000, filtered) + difficult advice (2,203) 10,203 examples. Combines a spec-filtered reproduction of the paper's Table 2 instruction-tuning mixture with the full difficult-advice corpus generated against a 9-principle distilled constitution. field value experiment SFT mixture pairing general instruction-tuning data with constitution-aligned difficult-advice data, for the Teaching Claude Why replication date_generated… See the full description on the dataset page: https://huggingface.co/datasets/dougalldeepmind/2026-08-04-sft-mixture-table2-8000-plus-synthdoc-2203.

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes106downloads
Dataset Card

SFT mixture — Table 2 instruction-tuning (8,000, filtered) + difficult advice (2,203)

10,203 examples. Combines a spec-filtered reproduction of the paper's Table 2 instruction-tuning mixture with the full difficult-advice corpus generated against a 9-principle distilled constitution.

fieldvalue
experimentSFT mixture pairing general instruction-tuning data with constitution-aligned difficult-advice data, for the Teaching Claude Why replication
date_generated2026-08-04
constitution`claude_distilled_12_principles_mid` — 9 numbered principles (the "12" in the name is historical). Used both to generate the difficult-advice half and to filter the Table 2 half.
source_repo`teaching_claude_why_replication` @ 96ff8aa36dd7d9914b016f88e80b1e3724f96ccc
modelsdifficult advice: anthropic/claude-haiku-4.5 + anthropic/claude-sonnet-5; spec filter: openai/gpt-5.6-terra (all via OpenRouter)
generation_configseed 0; Table 2 half sampled stratified by source; max_seq_len 8192 at build time
schematext (Qwen3.6 chat-template-rendered conversation), source (dataset name)
provenancescratch/build_paper_mixture.py -> scratch/filter_spec_misaligned.py -> combine; see the parent repos below

Composition

examplesrendered tokenssupervised tokens% of supervised
Table 2 instruction-tuning8,0004,270,3601,743,04037.38%
synthdoc difficult-advice2,2033,643,0422,920,14362.62%
total10,2037,913,4024,663,183

The two halves weigh very differently depending on which token you count. Difficult advice is 21.6% of examples and 46.0% of rendered tokens, but 62.6% of supervised tokens — it is long-form assistant prose with reasoning traces, whereas much of the Table 2 half is long context with short answers. Weight by supervised tokens, not example counts.

By source

sourceexamplesrenderedsupervised
synthdocdifficultadvice2,2033,643,0422,920,143
longalign1841,356,11027,557
no_robots2,275675,348436,448
apigenfunctioncalling850482,32047,663
numinamath_cot893466,454382,545
tulu3_if1,176458,993377,989
selfossinstruct903288,364176,291
smol_summarize576192,31633,060
smol_constraints891190,323117,366
lima252160,132144,121

longalign alone is 20% of rendered tokens and 0.7% of supervised: long documents in, one-line answers out. apigen_function_calling is similar (schema-heavy prompts, short tool calls).

Think blocks — three states, kept distinct

  • —synthdoc rows carry a real `<think>` trace and are fully supervised. This is the ingredient the difficult-advice result depends on: the assistant deliberates about the value at stake before answering.
  • —Table 2 rows carry no think block at all — neutral, training the model neither to emit nor to suppress reasoning.
  • —No row carries an empty `<think></think>`. Training a model to emit that marker is the documented reasoning-collapse pattern for Qwen3.x. If you want the empty marker as inference-time context on the non-reasoning half, add it with src/data/add_empty_think_multi.py and set mask_empty_think: true so its tokens are excluded from the loss.

Filtering (Table 2 half)

Judged by openai/gpt-5.6-terra against the full constitution, per the paper's recipe. 9,285 of 10,000 kept (7.15% rejected), then 8,000 sampled stratified by source.

Read the caveat before using this as a spec filter: rejections were ~30 toxic and ~685 spec_violation, with zero wrong_identity or no_self_disclaimer — the two failure modes the paper names. About half the spec_violation rejections are instruction-following failures (a summary ignoring its three-sentence limit), which is a real data-quality problem but a broader screen than the paper describes. smol_summarize lost 31% on that basis. Per-sample categories are in the parent repo's verdicts.jsonl if you want to rebuild with a narrower rule.

Parent datasets

Caveats

  • —LIMA came from `64bits/lima_vicuna_format`, a third-party re-upload: GAIR/lima ships a loading script the Hub no longer supports. Verify provenance if that matters to you.
  • —LongAlign is not representative. Its rows average 10,677 tokens; only the shortest ~18% fit under the 8192 cap, so 965 were dropped to find 216.
  • —79 of 10,000 judge replies did not parse and were kept rather than dropped — filtering on unparseable output would silently delete good data.
  • —Not evaluated: no model has been trained on this mixture yet.

Usage

python
from datasets import load_dataset
ds = load_dataset("LASR-Callum/2026-08-04-sft-mixture-table2-8000-plus-synthdoc-2203", data_files="mixture.jsonl", split="train")

Rows are pre-rendered with the Qwen3.6 chat template. Train on text directly and build the assistant-only loss mask from the rendered string (src/train/masking.py) rather than re-rendering from messages.