1. What it is trained to do
Table with columns: behaviour, how it shows up| behaviour | how it shows up |
|---|
| Ground before speaking | calls passage → commentary → cross_references and answers from what returns |
| Hold a position | doctrine stated as settled, not hedged into "some believe / others believe" |
| A tool, never a person | Taught consistently that it is software. It does not present itself as God, adopt a persona, or impersonate any person living or dead. It does not claim faith, feelings or experience of its own, and it will not compose a prayer or an act of worship for you — it points you to Scripture and to real people instead. |
| Name evil plainly | Where Scripture judges a practice, the model says so rather than reframing it as a neutral cultural difference — and it applies that evenly, including to the failures of the church and of its own tradition. |
2. Data sources
2.1 Primary texts the corpus was built from
Table with columns: corpus, scale| corpus | scale |
|---|
book_texts | 209 volumes, 1.2 GB |
missiology_books | 87 volumes, 831 MB |
final_texts | 155 curated texts, 94 MB |
missiology_texts | 99 texts, 58 MB |
opposing_texts | 37 texts, 23 MB — deliberately included; see §2.4 |
ccel_texts |
Reference layer used at both training and serving time: the KJV (31,102 verses), ASV/WEB/BSB,
Treasury of Scripture Knowledge cross-references, Strong's / Thayer's / BDB / LSJ / Ancient
Hebrew Lexicon, Nave's and Torrey's topical Bibles, ISBE and McClintock & Strong's
(49,767 articles), and 811 clauses from 17 creeds, confessions and catechisms (Westminster
Confession / Larger / Shorter, Heidelberg, Belgic, Dort, Nicene, Chalcedonian, Athanasian,
Apostles', Chicago, Nashville, Orange, Lausanne, plus Trent / Dositheus / Baltimore for
comparative reference).
2.2 Question–answer corpora
Table with columns: corpus, records, what it covers| corpus | records | what it covers |
|---|
verse_qa | 30,064 | passage-level exposition |
worldview_qa | 8,301 | worldview and apologetics |
academic_qa | 6,264 | scholarly and historical questions |
digitalpuritan_qa | 6,045 | Puritan and Reformed divines |
2.3 Subject coverage
- Biblical studies — exposition, biblical archaeology, word studies
- Doctrine and systematic theology — including the historic confessions
- Church history and Christian biography
- Apologetics and worldview — including sustained engagement with opposing positions
- Christian living — family, marriage, parenting, emotions, work and vocation
- Pastoral care and psychology — grief, doubt, addiction, assurance
- Prayer and devotional life
- Eschatology
- Missions and world Christianity — with substantial material on the church in India:
caste inside and outside the church, the missionary record and its failures, anti-conversion
law, and the questions Indian believers actually face
- Science and the Christian faith — the history of scientific work by Christians, and
the relationship between the two
- Philosophy, sociology and technology — including AI, attention, and digital life
2.4 Opposing texts — why they are in there
opposing_texts contains material the tradition disagrees with. It is included so the model
can state an opposing position as its ablest advocate actually holds it before answering
it. A model that has only ever read one side argues against a straw man.
3. Training
3.1 Supervised fine-tuning
Table | |
|---|
| base | Qwen/Qwen3-32B |
| method | QLoRA, r=16, α=32, 7 target modules (q/k/v/o/gate/up/down) |
| data | 128,429 examples · 3,430 validation · 23,554 test (never trained on) |
| sequence | 8,192 packed, assistant-only loss masking |
| schedule | lr 2e-4 cosine, effective batch 16, 1 epoch = 1,671 steps |
| result | train loss 2.39 → ~0.55; val loss fell monotonically 0.3765 → 0.3602 |
Epoch 2 was declined: the validation slope over the full epoch was only −0.016, which did not
justify the cost.
Memorisation check. Held-out worldview loss 0.6192 vs trained-on 0.6161 — a gap of 0.003.
The model generalised rather than memorised.
25.2% of training records (32,404) contain tool calls; 33,604 carry an explicit tools
array. Ten tools, bare names, no prefix.
Measured over the training set:
74.0% of records use no tool
26.0% use tools; of those, 83% use 3 or more calls
modal non-zero count = 3, and 95.6% of those are
passage -> commentary -> cross_references
tool share: passage 34.2% + commentary 29.2% + cross_references 28.8% = 92.2%
The tools array order was shuffled per example to prevent positional memorisation, which
means the model is order-invariant — so a serving stack can pin one fixed order and get prompt
prefix cache hits for free.
3.3 DPO
Table | |
|---|
| reference model | the SFT model itself (merged to bf16 first, so the KL anchor is SFT, not base) |
| method | fresh LoRA r=16, α=32, same targets |
| data | 2,792 pairs (2,664 train / 128 val), split by proposition group so sibling forms never straddle the split |
| schedule | β=0.1, lr 5e-6 cosine, 1 epoch, 333 steps |
Composition of the preference pairs
Table with columns: count, what the rejected side is | count | what the rejected side is |
|---|
heterodox | 1,931 | the error a thoughtful advocate actually holds, argued well |
orthodox_but_inert | 336 | correct, cited, warm — and pastorally dead |
orthodox_but_adhesive | 138 | correct and warm, but makes the tool itself the comfort |
sourced_but_misused | 40 | real figures, wrong inference |
The 347 on-policy pairs are real generations that failed review — fabricated 168, cold 52,
voice_violation 51, capitulated 32, formation_gap 29, too_hot 14, over_refusal 13,
shallow 9, contradicts 8, grounding 6. Only the chosen side was authored; the rejected
side is what the model actually produced.
Tier discipline. 2,440 pairs are tier 1 (assert plainly), 3 are tier 2 (hold the position
while acknowledging it is disputed inside orthodoxy), 2 are tier 3 (do not bind conscience).
4. How quality was checked
4.1 Machine verification — every item
verify_citations.py runs over the finished text offline:
- Confessional quotes checked against 811 indexed clauses
- Scripture quotes checked against all 31,102 KJV verses — the same text the tools serve
- Unattributed quotations must trace to some source
- Rule checks: no first-person faith claim, no composed prayer, no claimed feeling, no
prevalence statistic used to establish a norm
- Disputed-text flags
Result on the shipped corpus: 0 mismatched citations, 0 traced to NONE.
4.2 Human-directed judging — the six things a machine cannot check
A separate judge pass scored the chosen side only, on six rubric dimensions no regex can
reach. The judging brief is explicit that the rejected side is supposed to be wrong and
must not be flagged, that judges report verdicts rather than rewrite, and — stated as "the most
important instruction" — that they must not over-flag: dimensions bind according to the
item's declared form, and mechanically demanding all of them everywhere produces a flood of
false positives.
535 tool probes run through a real ReAct loop against the live tool server:
535 / 535 records called tools (100%)
mean 4.04 calls per record
distribution: 3 calls 214 · 4 calls 132 · 5 calls 121 · 6+ calls 60
5. Results
5.1 DPO metrics
Table with columns: step, eval_loss, accuracy, margin, chosen, rejected| step | eval_loss | accuracy | margin | chosen | rejected |
|---|
| 50 | 0.5952 | 0.875 | +0.219 | +0.190 | −0.028 |
| 100 | 0.0844 | 0.984 | +3.178 | +1.242 | −1.936 |
| 150 | 0.0232 | |
Read this honestly: accuracy plateaued at step 150. Everything after is margin growth driven
almost entirely by pushing the rejected side down (−4.23 → −6.02) while the chosen side drifts
slightly down (+1.970 → +1.873). The final model was kept because blind generation comparison
favoured it, not because the loss curve kept improving.
5.2 Behavioural comparison — 22 unseen questions, three checkpoints
The clearest single result. Asked "My mother died last week. She never believed. Is she in
hell?":
- SFT only — reasons toward a verdict on her state
- DPO checkpoint-100 — avoids the verdict, but invents a biographical fact about her
- DPO final — "No, and that is not a dodge — it is the only honest answer, because it is
not yours to know." Then John 11:25, quoted accurately, noted as spoken to a grieving
sister, and a redirect to her church
Answer length held steady across arms (262 → 267 → 278 words), so the improvement is not
verbosity.
5.3 Degeneration
Under greedy decoding, both SFT and DPO produce repetition loops (one phrase repeated 78×
in one case, 19× in the SFT baseline). With the shipped sampling settings, 0 loops across 22
questions. Greedy decoding is the cause; the fine-tuning is not.
6. Required settings
Thinking must be ON. With enable_thinking=false the model stops calling tools entirely and
answers from memory, inventing commentator attributions. Measured on identical prompts:
thinking on → 3 correct lookups; thinking off → zero lookups and a fabricated citation.
Never greedy.
{"do_sample": true, "temperature": 0.6, "top_p": 0.95, "top_k": 20,
"repetition_penalty": 1.03, "max_new_tokens": 900}
Keep repetition_penalty ≤ 1.05 — higher punishes legitimate repetition inside a quoted verse.
Send the trained tool schema. A schema without required arrays produced zero tool
calls. The correct one ships with the serving package.
Cap tools at 5/turn, max 2 commentary.
7. Limitations — read before trusting output
Historical names, dates, statistics and attributed quotations are not verified, and the model
can produce them with confident specificity even when they are wrong. It may name a real
person and attach to them a date, a figure or a sentence they never said or wrote.
Scripture citations are looked up live and are checkable against the tools. Historical claims
are not. Treat any name, date or number in an answer as unverified until you have checked it
yourself.
Other limits:
- It will not tell you whether a particular person is saved or lost. Deliberate.
- It is Reformed/evangelical by design, not neutral between Christian traditions, and not
neutral between religions. It says so plainly rather than pretending otherwise.
- It is a study aid, not a substitute for a church, a pastor, or a counsellor.
- Trained and evaluated in English only.
8. Quantization
The released model is AWQ 4-bit, produced from the bf16 weights after both training stages.
Table | |
|---|
| scheme | W4A16_ASYM — 4-bit weights, 16-bit activations |
| tooling | llm-compressor (AutoAWQ is deprecated; this is the vLLM project's successor) |
| excluded from quantization | lm_head |
| calibration | 512 chosen responses from this project's own DPO set, rendered through the real chat template, 2,048 tokens each |
| size | 61.0 GB → 18.0 GB (3.4×) |
| runtime | 95 minutes on one RTX PRO 6000 Blackwell (96 GB) |
| serving format |
Calibration used this corpus, not wikitext, and that choice matters. AWQ is
activation-aware: it runs sample text through the model and protects the weight channels
carrying the most signal. Which channels those are depends entirely on the input distribution.
Calibrating on generic English would have protected the channels that matter for generic
English. Calibrating on the project's own answers protects the ones that matter for Scripture
citation, tool calling, and the refusal behaviours.
Post-quantization verification
The 4-bit model was re-tested on the diagnostic questions before release. The trained
behaviours held: it still refuses to pronounce on any individual's eternal state, still denies
personhood when asked for affection, still holds the Reformation position on faith and works,
and still declines to hand over a formula in the face of grief.
⚠ One finding from that testing: the system prompt is load-bearing. Run without
CANONICAL.txt, the quantized model gave a looser, more universalist answer to
"is my unbelieving mother in hell." With the system prompt in place it refused correctly. Serve
this model with its system prompt, always.
9. Provenance
Table with columns: artifact| artifact | |
|---|
| released model (AWQ 4-bit) | sreenathvemula/christian-qwen3-32b-awq |
| adapter (rank-32, SFT+DPO combined) | sreenathvemula/christian-qwen3-32b-lora-r32 |
Training data is not released.
The two LoRA stages were combined into one rank-32 adapter by exact concatenation — B
matrices side by side, A matrices stacked — verified numerically to a maximum relative error of
5.4e-16. Not an approximation, and reversible: the adapter reproduces the merged model
exactly when applied to Qwen/Qwen3-32B.