fragment-2 (v3.0.2)
A 36.3M-parameter System-One decision model, built by FrameXlabs on the original fragment build and trained entirely from scratch β own BPE tokenizer, own encoder, own RLCD loop. No pretrained weights, no fine-tune of Laya or any other model.
Give it a state (any text) and typed questions; it returns typed
answers with calibrated probabilities in a single forward pass β no
autoregression, no text generation, no chain-of-thought, nothing to parse and
nothing to hallucinate. Five question types: choice, score, noul,
multi, rank.
Results (measured by the training notebook, held-out splits)
| benchmark | fragment-2 | Laya (reported) |
|---|---|---|
| AG News (choice) | 0.9080 | 0.950 |
| DBpedia-14 (14-way choice) | 0.1540 | β |
| Yelp-5 (score) | 0.6040 | SST-5 0.372 |
| SST-5 (score, zero-shot) | 0.3421 | zero-shot base 0.362 |
| IMDb (noul, zero-shot) | 0.8345 | β |
| multi F1@0.5 (AG News) | 0.7860 | n/a (no multi type) |
| rank Kendall tau (Yelp) | 0.5773 | n/a (no rank type) |
| avg ECE (calibrated) | 0.1971 | 0.081 (raw 0.213) |
| avg accuracy | 0.5920 | typed-decisions 0.766 |
Sizes: fragment-2 36.3M from scratch vs Laya 421M/322M
Quickstart
The repo ships a self-contained runtime β f3.py (needs only torch +
safetensors):
from f3 import Fragment
m = Fragment.from_pretrained("FrameXlabs/fragment-2")
res = m.decide(
state="Hi, we were billed twice for March. Please refund the duplicate today.",
questions={
"urgency": {"type": "score",
"instructions": "How urgent is this request?",
"criteria": ["not urgent", "soon", "critical or blocking"]},
"refund": {"type": "noul",
"instructions": "Does the user explicitly request a refund?"},
"dept": {"type": "choice",
"instructions": "Which department should handle this?",
"criteria": {"billing": "invoices, payments, refunds",
"technical": "bugs, outages, errors",
"other": "everything else"}},
"claims": {"type": "multi",
"instructions": "Which of these claims hold for this message?",
"criteria": ["the customer is angry",
"a refund is requested",
"this is about march billing"]},
})
print(res["answers"]["refund"]["noul"]) # calibrated P(yes)
print(res["answers"]["urgency"]["score"]) # expected level + distribution
Architecture
| fragment-1 (v2.29) | fragment-2 (v3.0.2) | |
|---|---|---|
| layers / width | 6 Β· d=256 | 10 Β· d=384 |
| attention | 4 heads, learned pos | 6 heads, RoPE |
| FFN | GELU 1024 | SwiGLU 1536 |
| vocab / context | 16,384 / 192 | 32,768 / 256 |
| params | 8.98M | 36,332,161 |
| question types | 3 | 5 (+ multi, rank) |
| options per question | 5 | 16 (trained 14-way) |
Training: supervised warmup (cross-entropy / BCE / Plackett-Luce over ~470k typed items from SST-2, BoolQ, Amazon polarity, AG News, DBpedia-14, Yelp-5) β RLCD v2 (GRPO-style Gaussian logit-noise exploration, strictly proper scoring rules as reward β log score, RPS, Brier, PL log-likelihood) β per-type temperature calibration on a held-out split.
Honest limits
- English-first. The tokenizer carries a char-level fallback alphabet for other scripts (encodable, but no sub-word merges outside Latin) β a multilingual fragment on this same build is next.
- Zero-shot numbers are measured on IMDb / SST-5, which were never trained on; they are reported, not guaranteed, on arbitrary domains.
- Fine-tuned Laya checkpoints still win some benchmarks (e.g. Banking77 0.870 vs 0.425); fragment-2's case is: from-scratch, ~9x smaller, 5 question types, calibrated out of the box, fully reproducible.
- Scores are ordinal rubric answers, not generation β it will not write prose, by design.
Lineage
fragment-1 v2.29 (8.98M, CPU-trained) β fragment-2 v3.0.2 (same recipe, scaled, GPU-trained). One build, no graveyard: the notebook is the complete, reproducible pipeline.
β FrameXlabs, a group of students who want to build something big.