Fraud
Fraud Detection in the SLM Era: Where Language Models Actually Help
Gradient boosting still wins on transaction fraud. The real gains from small language models are in unstructured features, alert triage, and deduplication — everywhere except the authorisation path.
The reflexive move when language models arrive is to point them at your hardest problem. In fraud, that's the transaction scoring model — and it's the one place a language model will lose. Gradient-boosted trees over well-engineered tabular features remain extremely hard to beat on transaction fraud, and no amount of model scale changes that. The opportunity is elsewhere, and it's larger than it looks.
Why the obvious application fails
Three reasons, none of which get better with a bigger model.
The data is tabular, and trees own tabular. Amount, MCC, hour of day, distance from last transaction, velocity counters, device age, historical decline rate. Gradient boosting is close to purpose-built for this shape of data, handles missingness and monotonicity natively, trains in minutes, and gives you feature importances your analysts can argue with.
The latency budget forbids it. An authorisation decision has tens of milliseconds to spare for scoring. Even a small language model, served locally, is an order of magnitude outside that. This is not an optimisation problem; it's an architectural constraint.
The class balance is brutal. Fraud rates well under 1% mean your model must be extraordinarily well calibrated in the tail. That is a property you get from careful loss design, thresholding, and calibration — not from a model that was trained to predict the next token.
Keep the GBM. If a proposal starts with "replace the fraud model with an LLM," it is going the wrong way. Everything below is about feeding the GBM better inputs and making the humans around it faster.
Where language models genuinely help
1. Turning unstructured text into features
Your transaction stream is full of language your tabular model currently throws away or reduces to a hashed category:
- Merchant descriptors —
SQ *COFFEE 4TH ST,PAYU*ACME-RETAIL-IN,WWW.RANDOM-SHOP.XYZ - Payment references and narration fields on transfers
- Chargeback reason narratives
- Support ticket text from the disputed cardholder
- Merchant onboarding documents and stated business descriptions
A small embedding model turns merchant descriptors into a dense vector that encodes things one-hot encoding cannot: that two differently-spelled descriptors are the same merchant, that a descriptor looks like a shell entity, that a business's stated category doesn't match its transaction pattern. Reduce those embeddings and feed them to the GBM as ordinary numeric features.
The latency problem disappears because this happens offline. Merchant descriptors are a bounded, slow-moving set. Embed them in batch, store the vectors, and look them up at authorisation time in microseconds:
# nightly batch
descriptors = warehouse.query("SELECT DISTINCT descriptor FROM txns WHERE ...")
vectors = embedder.encode(descriptors, batch_size=256) # small local model
feature_store.upsert("merchant_embedding", zip(descriptors, reduce(vectors)))
# authorisation path, sub-millisecond
emb = feature_store.get("merchant_embedding", txn.descriptor, default=ZERO)
score = gbm.predict(np.concatenate([tabular_features(txn), emb]))
Whether this lifts your model is an empirical question that depends on how much signal your descriptors carry. Run the ablation. The point is that it's a cheap, low-risk experiment that doesn't touch your latency budget.
2. Triage in the alert queue
This is where the time actually goes. Your model flags alerts; humans work the queue; the queue is always longer than the staffing. An analyst opening a case spends the first several minutes reconstructing context — recent transactions, prior disputes, device history, past decisions on the same account.
A small model that reads the case file and writes a five-line brief does not decide anything. It removes the reconstruction step:
ALERT a-88213 · card ····4471 · score 0.87
Card-not-present, ₹42,300, electronics merchant, first transaction
with this merchant. Two declines at unrelated merchants in the prior
11 minutes. Device fingerprint first seen today; account is 4 years
old with no prior disputes. Shipping pincode differs from all 23
historical deliveries.
Closest precedents: 3 alerts on this pattern in 30 days — 2 confirmed
fraud, 1 released.
Same constraints as the credit memo: every fact traces to a queryable field, no recommendation, and a validator that checks numbers against source. The analyst decides. The model just stops making them dig.
3. Collapsing duplicate alerts
One compromised card generates a burst of alerts. One compromised merchant generates hundreds across unrelated cards. Rule-based deduplication catches the obvious clusters and misses the ones that share a semantic signature rather than an exact key — same fraud ring, different descriptors, different BINs.
Embedding the alert context and clustering gives your analysts one case with forty transactions instead of forty cases. This is often the single largest efficiency win available, and it's mostly unglamorous vector search.
4. Turning analyst feedback into candidate rules
Analysts encode enormous tacit knowledge in their dispositions and case notes. Mining resolved cases for recurring patterns — and drafting them as candidate rules in your rules DSL — turns that into something reviewable:
-- DRAFT, generated from 47 confirmed-fraud cases in the last 14 days
-- Precedent: alerts a-81044, a-81192, a-81255, ... (44 more)
-- Backtest: 0.34% of volume flagged, 71% historical precision
WHEN channel = 'CNP'
AND device_age_hours < 24
AND merchant_first_seen_for_card
AND amount > percentile(account.amount_90d, 95)
THEN review
Generated, backtested, then reviewed by a human before anything goes live. The model proposes; the fraud strategist disposes.
The architecture, assembled
┌─── OFFLINE (batch, seconds to minutes) ───┐
│ SLM embeds merchant descriptors, │
│ narrations, dispute narratives │
│ ↓ │
│ feature store │
└────────────┬───────────────────────────────┘
│ lookup, sub-ms
txn ──────────────────▼──────────────────────────► GBM ──► score
│
┌─────────────────────────────────────────┤
▼ ▼
auto-decision alert queue
(below/above threshold) │
┌───────────────────┤
▼ ▼
SLM case brief SLM dedup/cluster
│ │
└────────┬──────────┘
▼
analyst decision
│
▼
labels ──► GBM retrain
notes ──► rule mining
Note where the language model sits: never in the authorisation path, always either before it (offline feature generation) or after it (human workflow).
Measure the things that matter
AUC is a poor guide here, because you don't operate across the whole ROC curve — you operate at one threshold, set by how many alerts your team can work. The honest metrics are operational:
- Precision at fixed alert volume. If you can work 500 alerts a day, what fraction of those 500 are fraud? This is the number that changes when you add features.
- Value detection rate. Fraud rupees caught over fraud rupees attempted — not case counts. Catching one large fraud beats catching twenty small ones.
- False positive rate on good customers. A declined legitimate transaction has a real, measurable cost in churn.
- Time to disposition. Where case briefs and deduplication show up.
- Analyst agreement rate. Do two analysts reach the same call on the same case? If not, your problem is process, not modelling.
Two things that will bite you
Text signals drift adversarially. Fraudsters change descriptors, rotate merchant names, and adapt faster than your retraining cadence. Tabular features like velocity are comparatively stable; text features are not. Monitor embedding drift explicitly and retrain the text side more often than the tabular side.
Case briefs create automation bias. A well-written summary is persuasive, and analysts will start trusting it instead of the underlying case. Two countermeasures: make every claim in the brief click through to its source, and periodically route cases with the brief suppressed to check that disposition quality hasn't quietly become a function of the summariser.
The summary
Language models have not changed transaction fraud detection at its core. Gradient boosting over good features still wins, and the authorisation path is still no place for a generative model.
What has changed is the amount of signal you can afford to extract from unstructured data, and how much of your analysts' day is spent on reconstruction rather than judgment. Both are worth real money, and neither requires you to touch the model that actually makes the decision.
Want this built on your data?
Writing about this is our day job because building it is. We build and fine-tune custom AI models for fintech teams — fraud, credit risk, document extraction — and hand back models you own and can run yourself. Or build it yourself in a sciFi notebook.
Keep reading
Research
What the Latest Fintech AI Research Actually Says
Three 2026 papers converge on the same finding: the hard problem is no longer modelling, it's evidence — reproducibility you can prove, latency and cost you actually measured, and attributions that don't move between runs.
Credit risk
Building a Credit Risk Copilot a Regulator Would Accept
Most credit copilots stall at the compliance review. The fix is architectural: keep the scorecard conventional, ground every generated number in a validated fact, and never let the model recommend.