finai-slm-v2 is an open-weight model from Finndot India Pvt Ltd, released under Apache License 2.0. Its published files total 85.7 MB.
A 1.7B on-device language model for Indian bank SMS parsing and personal finance coaching. FinAI SLM is a Qwen/Qwen3-1.7B derivative fine-tuned with QLoRA SFT for the FinnDot expense tracker app.
Model Card
By Finndot India Pvt Ltd, published under apache-2.0, revision 2b4c3828c04c.
A 1.7B on-device language model for Indian bank SMS parsing and personal finance coaching. FinAI SLM is a Qwen/Qwen3-1.7B derivative fine-tuned with QLoRA SFT for the FinnDot expense tracker app. It runs entirely on-device — no cloud calls, no user data leaves the phone. The model handles English, Hindi, Hinglish, Tamil, Telugu, Marathi, and Bengali bank SMS. v1 → v2: R-EM +5.2 pp, chat groundedness +36 pp, false-parse 28.57% → 0.54%. No user SMS. No real financial data. Fully synthetic. Split hygiene: assignment unit is (bank, templateid), not individual SMS. All variants of a template stay in one split. See ml/data/manifest/SHA256SUMS. Pre-registered before looking at test scores…
Read Finndot India Pvt Ltd's full model card
A 1.7B on-device language model for Indian bank SMS parsing and personal finance coaching.
FinAI SLM is a Qwen/Qwen3-1.7B derivative fine-tuned with QLoRA SFT for the FinnDot expense tracker app. It runs entirely on-device — no cloud calls, no user data leaves the phone.
What it does
| Task | Description |
|---|---|
| SMS → JSON | Extracts {amount, merchant, type, account, balance, category} from Indian bank SMS (UPI, NEFT, IMPS, credit card, salary, ATM) |
| Finance coach | Answers personal finance questions grounded in the user's ledger (spending breakdown, saving tips) |
| General finance Q&A | Short answers about SIP, EMI, tax, budgeting |
The model handles English, Hindi, Hinglish, Tamil, Telugu, Marathi, and Bengali bank SMS.
Key results (v2 held-out eval, 1,282 test SMS)
| Metric | FinAI v2 | Qwen3-1.7B base | Qwen2.5-1.5B-Instruct |
|---|---|---|---|
| SMS R-EM % | 97.97 [97.2, 98.7] | 28.16 | 42.43 |
| Amount EM % | 99.53 | 82.84 | 89.78 |
| JSON valid % | 100.0 | 100.0 | 99.45 |
| Merchant exact % | 98.21 | 61.31 | 72.85 |
| False-parse % | 0.54 | 100.0 | 47.83 |
| Chat groundedness % | 68.0 | 26.0 | 68.0 |
SHIP: YES. All gates pass. McNemar p = 7.6e-270.
v1 → v2: R-EM +5.2 pp, chat groundedness +36 pp, false-parse 28.57% → 0.54%.
How to use
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_id = "finndot/finai-slm-v2"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id, torch_dtype=torch.bfloat16, device_map="auto"
)
# SMS parsing
messages = [
{"role": "system", "content": "Extract transaction details from this SMS as JSON: {amount, merchant, type, account, balance, category}. type is one of: INCOME, EXPENSE, CREDIT, TRANSFER, INVESTMENT. If this is not a transaction (OTP, promo, KYC), return {}."},
{"role": "user", "content": "HDFC Bank: Rs.499.00 debited from A/c XX1234 to SWIGGY via UPI. Avl Bal Rs.15000.50"}
]
text = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True,
enable_thinking=False
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=256, do_sample=False)
result = tokenizer.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(result)
# {"amount": 499.0, "merchant": "SWIGGY", "type": "EXPENSE", "account": "1234", "balance": 15000.5, "category": "Food"}
Training details
| Parameter | Value |
|---|---|
| Base model | Qwen/Qwen3-1.7B |
| Method | QLoRA SFT (4-bit NF4, double quant, bf16 compute) |
| LoRA rank / alpha | 16 / 32 |
| LoRA targets | q, k, v, o, gate, up, down_proj |
| Dropout | 0.05 |
| Epochs | 3 |
| Learning rate | 2e-4 cosine, 3% warmup |
| Effective batch | 16 (2 × 8 grad accum) |
| Max sequence | 1536 |
| Training data | 16,000 examples (60% SMS, 25% coach, 15% general) |
| Checkpoint selection | Best validation SMS strict R-EM |
| Thinking | Disabled (enable_thinking=false) |
| Hardware | 1× NVIDIA A10G (g5.2xlarge), ~5 hours |
| Seed | 42 |
Data recipe (privacy-safe)
No user SMS. No real financial data. Fully synthetic.
| Source | Description | Count |
|---|---|---|
| Parser gold | JUnit test cases from parser-core (35+ Indian banks) |
~3,000 |
| Synthetic SMS | Template-generated UPI/NEFT/IMPS/CC/salary/ATM in English + Hindi/Hinglish | ~6,000 |
| Indic SMS | Hindi, Hinglish, Tamil, Telugu, Marathi, Bengali bank SMS paraphrases | ~300 |
| Finance coach | Grounded Q&A with synthetic ledgers (English + Indic) | ~4,000 |
| General instruct | Short finance Q&A (SIP, EMI, tax, budgeting) | ~2,400 |
| Negatives | OTP, KYC, promo, failed UPI → {} |
~300 |
Split hygiene: assignment unit is (bank, template_id), not individual SMS. All variants of a template stay in one split. See ml/data/manifest/SHA256SUMS.
Evaluation protocol
Pre-registered before looking at test scores: docs/llm-eval-protocol.md
Ship gates
- SMS R-EM lift vs Qwen3-base ≥ +3 pp, CI excludes 0
- Amount EM drop vs base ≤ 1 pp
- Chat groundedness drop vs base ≤ 5 pp
- JSON validity ≥ 95%
- On-device TTFT / peak RSS ≤ 1.3× old Qwen2.5
Limitations
- Indian bank SMS only — trained on Indian banking formats (UPI, NEFT, IMPS, etc.). May not generalize to US/EU bank SMS.
- Merchant extraction is the hardest field; regex parsers in
parser-corestill win on supported banks. - Chat groundedness is moderate (~32%); the model sometimes paraphrases numbers instead of citing exact figures.
- Thinking is disabled — do not expect chain-of-thought reasoning.
- 1.7B parameter model — smaller than general-purpose assistants; optimized for the SMS+coach task mix.
On-device deployment
The production format is LiteRT-LM INT4 (.litertlm, ~0.9 GB). The bf16 safetensors here are the merge before quantization. For the quantized on-device file, see the FinnDot app's model download.
Conversion: litert-torch export_hf, dynamic_int4_block32, KV 1280, nothink prefix.
Reproduce
git clone https://github.com/AnomaProAI/Finndot
cd Finndot/ml
# Build dataset
python -m data.build_splits --repo-root .. --out data/out --train-size 16000
# Train (needs 1× A10G / T4 GPU)
python train/sft_qlora.py --config train/train_config.yaml
# Merge adapter
python train/merge_lora.py --adapter <output>/adapter --out <output>/merged
# Evaluate
python -m eval.run_eval \
--backend hf \
--sms data/out/test_sms.jsonl \
--chat eval/fixtures/chat_eval.jsonl \
--model-id <output>/merged \
--baseline-id Qwen/Qwen3-1.7B \
--tag my-eval
Supported banks (35+)
HDFC, SBI, ICICI, Axis, Kotak, PNB, Bank of Baroda, Union Bank, IDFC First, Canara, Federal, Indian Bank, IOB, Central Bank, Karnataka, South Indian, City Union, DBS, HSBC, IDBI, J&K Bank, AMEX, OneCard, Slice, LazyPay, Juspay, Airtel Payments, Jio Payments, IPPB, Jupiter, Utkarsh, Mashreq, and more.
Citation
@misc{finai-slm-2026,
title={FinAI SLM: On-device Indian bank SMS parsing with QLoRA fine-tuning},
author={FinnDot Team},
year={2026},
url={https://huggingface.co/finndot/finai-slm-v2},
note={Apache 2.0. Based on Qwen3-1.7B.}
}
License
Apache 2.0 — same as the Qwen3-1.7B base model.
Identity and Version
- Repository
- finndot/finai-slm-v2
- Publisher
- Finndot India Pvt Ltd
- Task
- Not stated by the source
- Modality
- Other
- Library
- transformers
- Parameters
- Not stated by the source
- Languages
- en, hi, ta, te, mr, bn
- Revision
- 2b4c3828c04c029b6573d68dbaf3cdd69aaa6485
- First published
- 2026-09-23
- Last updated
- 2026-09-23
Files and Weights
15 files, 85.7 MB in total. The weights are 2 files totalling 69.8 MB in bin, safetensors.
Every file
| File | Type | Size | SHA-256 |
|---|---|---|---|
| adapter/adapter_model.safetensors | Weights | 69.8 MB | 8bb99b9ca493 |
| adapter/training_args.bin | Weights | 6.2 KB | 5f26292f52be |
| adapter/adapter_config.json | Configuration | 927 B | — |
| adapter/added_tokens.json | Configuration | 707 B | — |
| adapter/special_tokens_map.json | Configuration | 613 B | — |
| FINETUNE_GUIDE.md | Documentation | 23.7 KB | — |
| README.md | Documentation | 7.7 KB | — |
| adapter/README.md | Documentation | 5.2 KB | — |
| eval/v20260922-finai-slm-v2.md | Documentation | 1.6 KB | — |
| adapter/chat_template.jinja | Other | 4.2 KB | — |
| .gitattributes | Repository | 1.6 KB | — |
| adapter/merges.txt | Tokenizer | 1.7 MB | — |
| adapter/tokenizer.json | Tokenizer | 11.4 MB | aeb13307a71a |
| adapter/tokenizer_config.json | Tokenizer | 5.4 KB | — |
| adapter/vocab.json | Tokenizer | 2.8 MB | — |
License and Download
- License
- apache-2.0
- Access
- Open weights, no gate
- Download size
- 69.8 MB
Released by Finndot India Pvt Ltd through its official repository on Hugging Face. Read the license.
Built From
- Derived from Qwen/Qwen3-1.7B
- Trained on (disclosed) finndot/finai-slm-data
Evaluations
Each result is shown as reported, with the conditions its reporter stated. None is a SAVRN measurement. A comparison lines two results up only when their configuration, unit and setup are all stated and identical.
| Benchmark | Conditions | Result | Reported by | Revision | Date |
|---|---|---|---|---|---|
| FinAI SMS test (synthetic) | Task Indian Bank SMS → JSON extractionMetric Amount Exact-MatchComparison conditions not established | 99.53 | finndot Publisher reported |
Evaluated revision not stated | — |
| FinAI SMS test (synthetic) | Task Indian Bank SMS → JSON extractionMetric JSON ValidityComparison conditions not established | 100 | finndot Publisher reported |
Evaluated revision not stated | — |
| FinAI SMS test (synthetic) | Task Indian Bank SMS → JSON extractionMetric Strict Record Exact-Match (R-EM)Comparison conditions not established | 97.97 | finndot Publisher reported |
Evaluated revision not stated | — |
Memory Requirements
| Precision | Weights in memory |
|---|---|
| As published | 69.8 MB |
Weights only, from the published parameter count; the key-value cache and runtime add to this.
Questions About finai-slm-v2
Can I use finai-slm-v2 commercially?
Yes. finai-slm-v2 is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.