The idea
The adapter supplies voice. Retrieval supplies truth.
CTRL-2B is a QLoRA adapter on MiniCPM5-2B, trained on 939 reviewed question and answer pairs from Expedient's cloud infrastructure knowledge base. Fine-tuning teaches tone, answer shape, and when to stop. It does not put facts in the weights.
Every supported answer runs against the top three retrieved excerpts. A lens gate scores the model's confidence in its own answer. Below 0.74, it abstains. That rule is the difference between a demo and a support agent.
The gate is part of the runtime, not the adapter. Closed-book mode is not supported.
Measured
Number-fact recall counts gold numbers present in the answer. Precision counts answer numbers present in the gold answer, so invented specifics lower the score.
| Arm | Recall | Precision |
|---|---|---|
| Base MiniCPM5-2B, closed-book | 0.692 | — |
| CTRL-2B, closed-book | 0.772 | 0.865 |
| CTRL-2B, open-book, production shape | 0.943 | 0.945 |
Open-book production shape: 94 held-out rows, 939-row index, retrieval hit@3 94/94 at rank 0.0. The 26-row probe scored 0.962 / 0.962. GGUF Q8_0 engine eval: 1.000 / 0.981 open-book, overall 0.889.
Corpus
Five sources feed the v2 corpus. The belt shows rows collected before review; the gate decides what ships. Select a plate to see the source.
Nutanix
522 source rows · nutanix-knowledge
Reviewed rows enter the v2 corpus; the remainder waits for review.
Five source sets total 1,377 rows. The v2 corpus holds 939 after review and dedupe. The 1,005 unreviewed vendor rows triaged to 682 accepted, 207 rejected, and 116 held for human review.
| Source | Type | Rows |
|---|---|---|
| Nutanix | Vendor docs | 522 |
| VMware VCF9 | Vendor docs | 504 |
| Expedient KB | First-party | 218 |
| Zerto | Vendor docs | 71 |
| Cohesity | Vendor docs | 62 |
| Five source sets | 1,377 |
Nutanix and VMware marks via Simple Icons. Zerto, Cohesity, and Expedient plates are typographic placeholders. Vendor names and marks remain trademarks of their owners.
Quick start
The adapter ships with the GGUF Q8_0 build. The runtime that adds retrieval and the gate lives in the training repo. This card covers the model artifact.
# GGUF Q8_0, 2.5 GB
llama-server -m ctrl-2b-q8_0.gguf -c 4096
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
base = AutoModelForCausalLM.from_pretrained("openbmb/MiniCPM5-2B")
model = PeftModel.from_pretrained(base, "chadstthomas/ctrl-2b")
tok = AutoTokenizer.from_pretrained("openbmb/MiniCPM5-2B")
Closed-book generation is not a supported posture. Pair the adapter with retrieval and the lens gate.
Limits
Closed-book precision is 0.865, not 1.0. Specific numbers, versions, and dates need an excerpt behind them.
Prompted refusal caught 20% of out-of-domain questions. The lens gate caught 15/15 at 0.74. Do not ship the adapter without it.
Expedient cloud infrastructure support. It is not a general assistant, a coding model, or a substitute for the KB owner's review.
The 0.74 threshold is calibrated for this vehicle. Recalibrate after a base-model, corpus, or adapter change.
Training
- Base model
- MiniCPM5-2B (2.52B)
- Method
- QLoRA, r16 / a32
- Corpus
- 939 reviewed QA rows
- Schedule
- 4 epochs, 211 steps
- Hardware
- RTX 4050 Laptop, 6 GB
- Wall time
- 54 minutes
- Compute
- bf16, NF4 double quant
- License
- Apache-2.0
A 4B control run bought no clear quality gain for twice the size, at 19.9 seconds per step versus 15.4. 2B ships.
Governance
The base model and this adapter ship under Apache-2.0. The corpus combines Expedient first-party KB drafts with vendor documentation, paraphrased and verified against live pages. Rights for the underlying vendor content remain with the publishers. This release is intended for Expedient-internal support use pending the corpus owner's final call.
Known limits: facts live in retrieval, not in the weights. The abstention gate is mandatory in production.
@misc{ctrl2b2026,
title = {CTRL-2B: A retrieval-grounded support agent},
author = {St. Thomas, Chad},
year = {2026},
url = {https://huggingface.co/chadstthomas/ctrl-2b}
}