Intended use
- Invoice / PO matching, reconciliation triage, and other form-like
classification tasks where the output must be a single label.
- Research and education on small specialist models on Apple Silicon.
- NOT for: open-ended generation, legal/financial advice, autonomous payments.
Training methodology
- Base model:
Qwen/Qwen3.5-4B (configurable via --base-model).
- Method: LoRA/PEFT supervised fine-tuning (
scripts/train.py).
- Loss: answer-only — prompt tokens before
ANSWER: are masked (-100),
so cross-entropy focuses on the label. See README for rationale.
- Hardware: Apple Silicon M3 (MPS); CUDA/CPU fallbacks supported.
LoRA configuration
- r: 16, alpha: 32, dropout: 0.05
- target modules: q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
Dataset description
- JSONL records:
state + question + options -> answer label.
- Starter set is synthetic smoke-test data only (train ~120 / valid ~30 /
test ~60). Meaningful fine-tuning requires a substantially larger,
licensed or independently generated dataset.
test.jsonl is never trained on.
Evaluation methodology
scripts/evaluate.py --mode base vs --mode tell on held-out test.jsonl.
- Metrics: exact accuracy, invalid-output rate, per-class accuracy, confusion
matrix. Only measured results are reported — never fabricated.
Limitations
- Small context, label-only output; long or conflicting evidence degrades
accuracy (see README robustness section).
- Prompt-injection resistance is best-effort: STATE is untrusted data.
- Starter dataset does NOT yield a production-quality model.
Responsible use
- Keep a human in the loop for financial decisions.
- Validate structured outputs; treat
invalid_output as abstention.
License
MIT (see LICENSE) for the Tell-4B adapter, code and synthetic starter data.
Base-model weights follow their own license.
How to run
pip install -r requirements.txtpython scripts/inference.py --adapter . --state "Invoice is 1200 EUR but PO is 1000 EUR." --question "What is the reconciliation result?" --options "A:match|B:mismatch|C:needs_review"# -> B
Ollama
A Q4_K_M GGUF of the merged model is published for local runs
(see Modelfile in the GitHub repo):
ollama pull seyhunak/tell-4bollama run seyhunak/tell-4b "STATE: ... QUESTION: ... OPTIONS: ... ANSWER:"
Live demo
A Next.js one-pager classifying 50 finance tickets in real time
(demo/ in the GitHub repo, npx . after npm run build).