Usage
from transformers import AutoModelForCausalLM, AutoTokenizerfrom peft import PeftModel base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct", dtype="bfloat16")tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")model = PeftModel.from_pretrained(base, "Johnnyman1100/qwen2.5-1.5b-voynich-eva-lora")
The included tokenizer.json, tokenizer_config.json and chat_template.jinja are
Qwen's files, copied here for convenience.
What was actually measured
Training: 3 epochs, 237 optimizer steps, seq len 256, bf16, on 181 of 226 folios
(45 held out; no multi-word line appears in both splits).
- Held-out EVA perplexity: 22.32 (adapter) vs 133.42 (base Qwen)
- Interpolated word-bigram baseline, same data: 1.66 nats/char vs adapter 1.31
- vs base Qwen 2.07 — the adapter learns real EVA statistics beyond word adjacency
Generation controls (same prompt, seeds, settings, all 226 folios):
- Feeding the adapter shuffled words or frequency-matched gibberish produces
outputs within noise of real passages on all theme rates when pooled over the
226 folios (every difference under 8 points). Individual 45-folio held-out cells
are noisier, and a few of them cross that threshold.
- Its pseudo-Voynichese "echoes" occur at 36-45% on any letter-salad input —
generic EVA vocabulary, not reading.
- Removing the passage entirely is the only control that changes the distribution.
Bottom line: the adapter is a good statistical model of Voynichese. Its English
"translations" are prompt-driven confabulation, independent of passage content.
Repository layout
adapter_model.safetensors, adapter_config.json — the LoRA adapter
scripts/ — training, generation, controls, baselines and analysis code
results/ — metrics, predictions (written before results), conclusions
outputs/ — raw per-folio JSONL for every run: adapter/base x seed42/43 x
real/shuffled/gibberish/no-passage
story/ — The Scattered Leaves, a literary artifact composed from the adapter's
speculative outputs, the editorial brief, the mined fragments, and a reading
edition of all 226 folios. Fiction, explicitly.
Reproducing
The scripts were written for a workspace layout and default to paths that will not
exist in a checkout of this repo. Every script accepts explicit paths — pass them:
# 1. Get the source transcription (not redistributed here — see Provenance)# Save it as ZL3b-n.txt next to the scripts.# 2. Trainpython scripts/finetune_qwen.py --model Qwen/Qwen2.5-1.5B-Instruct \ --source ZL3b-n.txt --output-dir ./my_run# 3. Generate for all folios (adapter, then base), plus controlspython scripts/translate_full_corpus.py --model ... --source ... --adapter ./my_run \ --output ./my_run/adapter.jsonl --prompts forced_speculationpython scripts/translate_full_corpus.py --no-adapter --control gibberish ...# 4. Baseline + analysispython scripts/baseline_bigram.py # edit RUN_DIR / DEFAULT_SOURCE at toppython scripts/analyze_runs.py # edit RUN_DIR / FILES at top
Split: split_folios(folios, 0.2, seed=42) — deterministic; the 45 held-out folio IDs
are listed in results/run_metrics.json. Generation seeds are per-folio and derived from
--seed, so a rerun with the same seed is reproducible modulo GPU nondeterminism.
The source/base_model/adapter fields inside the JSONL metadata records are the
original local paths; they are informational only.
Provenance and licensing
- Adapter weights, scripts, results, story: MIT (see
LICENSE).
- Base model: Qwen/Qwen2.5-1.5B-Instruct,
Apache-2.0. Not included; downloaded automatically by
PeftModel.from_pretrained.
The included tokenizer.json, tokenizer_config.json, chat_template.jinja are
Qwen's unmodified files (Apache-2.0).
- Source text: ZL EVA 3b IVTFF transcription by René Zandbergen and Gabriel Landini,
available from voynich.nu. Not redistributed here;
it is their work.
scripts/strip_ivtff.py documents exactly how it was cleaned.
- Trained on a single RTX 3070 8GB, bf16, PEFT 0.18.1, Transformers 5.0.0, Torch 2.7.1.
Caution
Do not cite outputs of this adapter as evidence about the Voynich Manuscript's
content, language, or provenance. The harness in scripts/ is designed to be
reused to test other hypotheses the same way.