Views
No views yet
cat data.json | jqgen "total spend per customer, paid orders only"<|request|> {your request}
<|input|> {raw prefix or shape sketch of your JSON}
<|program|><|end|>.nl2jq-bench v1.0.0
(held-out by construction: 0% field overlap with training, novel domains, evaluated once
per system). These weights are v7 — the third and final data generation of the
from-scratch experiment. The three-generation arc is the research result:| system | frozen pass@1 | valid | what it taught us |
|---|---|---|---|
| v5 (scored 0.55 on the retired in-distribution dev split) | 0.00 | 0.48 | the dev score was vocabulary recall, not skill — on unseen fields it emits training-vocab names (.urgent) |
| v6 (per-example-unique field names) | not run on the frozen set; ~0.01 on the dev twin | — | name-level uniqueness isn't enough: BPE absorbed the name components, and real field names tokenize into fragments the model never learned to emit |
| v7 (this: components from real-text subwords) | 0.04 | 0.56 | token-level copying finally works — and 37M still cannot compose correct programs on OOD inputs |
| v7 + input-grounded decoding | 0.09 | 0.76 | the honest ceiling of a 37M from-scratch model with system help |
| nl2jq-qwen3-0.6b (pretrained sibling, same data recipe) | 0.40 | 0.73 | what pretraining buys: 0.40 vs 0.09 |
| Claude Opus 4.8 (zero-shot, context row) | 0.96 | 0.98 | the task ceiling |
0.9 on its own distribution), but out-of-distribution semantics — binding the user's actual field names and composing the right operation — does not emerge at this scale, even after redesigning the data twice against mechanistically-diagnosed failures. Treat this model as the research artifact it is; for actual use, take the pretrained backends.
pass@1 is greedy; valid = fraction of generated programs that parse and run under
jq 1.7.1. Scoring is execution equivalence (array/stream repackaging normalized;
array order normalized for items flagged order_insensitive). Frozen scores are one-shot
(no selection or iteration against the frozen split; see its
FREEZE record).nl2jq-qwen3-0.6b backend.transformers LlamaForCausalLM — the conversion is a
pure key rename (same RoPE convention), verified to reproduce the original module's logits
exactly (max abs diff 0.0).1from transformers import AutoModelForCausalLM, AutoTokenizer
2tok = AutoTokenizer.from_pretrained("gauthierpiarrette/nl2jq-40m")
3model = AutoModelForCausalLM.from_pretrained("gauthierpiarrette/nl2jq-40m")GGUF/llama.cpp note: the tokenizer splits numbers into single digits (deliberate, for numeric reasoning), a pre-tokenizer llama.cpp doesn't yet recognize, so a faithful GGUF export isn't currently possible — use the PyTorch/transformerspath above.
jqgen CLI prints the program to stderr for this reason. jq runs locally with no network
access, but an incorrect program can still produce misleading results.