Fintech
Key points

Key points

  1. 1Use the model as an analyst's assistant that summarizes evidence and recommends a verdict, while a person approves or rejects every alert.
  2. 2Give the model three blocks of context for each alert: the order, the device and session signals, and the customer's payment history.
  3. 3Force the model to answer in a fixed JSON schema and reject anything that fails validation before a reviewer ever sees it.
  4. 4Log the prompt, the model output and the human decision so you can measure precision against your existing rules.

Why the fraud queue is the right place for a model

Fraud queues are full of alerts that a rules engine already flagged but cannot explain. A rules engine can say "this card was used three times from three countries in ten minutes," but it cannot summarize the merchant's shipping address history, the account age and the customer's last six months of behavior into a paragraph a reviewer can act on in fifteen seconds. That gap between detection and explanation is where a language model earns its keep.

The public evidence for this is real but modest. The Federal Reserve's payments improvement group notes that generative AI's value in fraud reviews may depend less on raw model capability and more on how clearly the model is guided through context and prompting, and it warns that without clear context a model may drift toward irrelevant details or fail to apply standard fraud definitions (FedPayments Improvement). A Google research paper on scam detection with Gemini reported that the model identified new, accurate reasons for suspicion that human reviewers had not recorded in 32% of cases, while a separate accuracy figure from the same paper put classification accuracy at 93.33% on curated transaction data (arXiv). Both numbers come from a specific research setting, not your queue, so treat them as a reason to test, not a reason to deploy.

The lesson from both sources is the same. The model's job is to read the alert, pull the relevant history and write down the reasons it suspects what it suspects. The decision stays with the analyst.

Decide what the model is allowed to decide

Before writing any prompt, write down the boundary. There are three plausible designs, and you should pick deliberately.

DesignModel roleWho decidesWhen to choose it
CopilotSummarizes and recommendsHuman on every alertDefault for regulated payments and new deployments
TriageSorts alerts into review bands, recommendsHuman on high and medium riskWhen volume outstrips reviewer capacity but the rules baseline is trusted
AutopilotApproves or blocks directlyModel, with human audit sampleOnly after a long measured period where model precision beats the rules your team already trusts

Most teams should start at copilot and only move to triage once they have measured data. The reason is that a false decline is not free: it destroys the relationship with a good customer, which is a cost the business feels long after the transaction (Signifyd). A model that is right about fraud but wrong about good customers will look excellent on a fraud metric and terrible on revenue.

There is also a governance argument. J.P. Morgan's guidance for payments staff recommends documented approval processes, dual authority on payments and consistent escalation procedures, precisely because a single unchecked decision point is the vulnerability (J.P. Morgan). Giving a model unilateral authority is a single unchecked decision point with extra steps. Keep two humans, or one human plus an auditable model, on every release of funds.

Assemble the context the model actually needs

A model asked to judge an alert without context will produce confident nonsense. The prompt is only as good as the records you attach to it. Build three blocks.

Order block. Amount, currency, merchant category, shipping and billing addresses, whether the bill-to and ship-to match, whether this is the first order from this customer, and any line items that are themselves resellable (gift cards, electronics, digital codes). Card testing, the fraud pattern where a stolen card is validated with a small charge, is usually recognizable from order characteristics: tiny amounts, repeated attempts, digital goods (Stripe). J.P. Morgan's card testing guide points out that these test transactions are deliberately zero or low dollar so they do not trip fraud detection (J.P. Morgan). Give the model the amount and the product type and it can name this pattern.

Device and session block. Device fingerprint, IP country, whether the device has been seen on this account before, time from account creation to checkout, and the result of any 3D Secure authentication. This last one carries legal weight: when a card-not-present transaction is fully authenticated with 3DS and the correct ECI and authentication values are passed, liability for fraudulent disputes generally shifts to the issuing bank, though non-fraud disputes like goods not received are not covered (gpayments). If 3DS passed, the model should know it, because it changes the risk calculus and the potential loss.

Customer history block. Account age, lifetime order count, previous chargebacks against this customer, and velocity in the last 24 hours and 7 days. Do not send the raw history; send the aggregates plus a short list of the five most recent orders. Long context makes models slower, more expensive and more likely to latch onto an irrelevant detail.

A worked example of the shape, not the content, of what you send:

{
  "alert_id": "AL-10482",
  "trigger_rule": "velocity_country_mismatch",
  "order": {"amount": 12.00, "currency": "USD", "mcc": "digital_goods", "bill_to_country": "US", "ship_to_country": "US", "first_order": false},
  "device": {"seen_on_account": false, "ip_country": "RO", "account_age_days": 210, "minutes_since_signup": null, "three_ds_result": "not_attempted"},
  "history": {"lifetime_orders": 14, "chargebacks_lifetime": 0, "orders_24h": 5, "orders_7d": 6, "avg_order_value": 85.00},
  "recent_orders": [{"days_ago": 2, "amount": 90.00, "status": "delivered"}]
}

The human reviewer should see the same facts, in the same order, next to the model's verdict. That way the reviewer can disagree with the model's reasoning without having to redo the data pull.

Structure the verdict so a reviewer can act on it

Ask for free text and you get prose. Ask for a schema and you get something you can route, filter, count and validate. The MLflow guidance on structured outputs is blunt about this: schema-constrained generation guarantees syntactic validity and reduces parsing errors compared to prompted JSON, but it does not guarantee the values are correct, so you still need runtime validation (MLflow). Design for both.

A workable schema for a fraud verdict:

{
  "risk_score": 0,
  "top_reasons": ["", "", ""],
  "pattern": "card_testing | account_takeover | friendly_fraud | legitimate | unclear",
  "recommended_action": "approve | hold | block | request_verification",
  "confidence": "low | medium | high",
  "missing_information": [""]
}

Four design rules make this schema hold up in production.

Score in a fixed band, not a percentage. A 0 to 100 score invites false precision. A 0 to 3 band that matches how your reviewers already think (clear, watch, suspicious, block) produces more consistent output.

Cap the reasons at three. A model that lists twelve reasons has not prioritized, and a reviewer cannot read twelve reasons at 2 a.m. Three forces the model to rank.

Require a pattern label drawn from a fixed list. The Fed's work on fraud classification exists precisely because inconsistent terminology between analysts makes cases hard to compare (FedPayments Improvement). An enum in the schema gives you the same consistency for free.

Demand a missing-information field. The single most useful thing the model can say is "I cannot tell whether the shipping address has been used before, because you did not send it." That field tells you which context block to fix, and it stops the model from inventing an answer.

Validate every response against the schema before it enters the queue. If validation fails, do not pass the raw text to the reviewer; retry once with the validation error appended, then route to a human with the failure flagged. Silent malformed output is the failure mode that erodes trust fastest (MLflow).

Keep a human on the decision and log everything

The audit trail is not paperwork. It is the mechanism that lets you measure the model and defend it later.

Log four things for every alert: the exact prompt (including the context blocks), the raw model response, the validated structured verdict, and the human decision with the reviewer's identity and timestamp. Tie them to the alert ID. Chipper Cash, describing its fraud email triage pipeline, reports that its prior manual process took roughly thirty minutes per email, that its Google Sheet was the system of record but entries depended on who filled them in and when, and that the new pipeline posts a notification and writes an audit trail for every action (Chipper Cash). The lesson is not the speed. It is that the audit trail became the product.

With that log you can compute the numbers that justify giving the model more weight.

MetricHow to compute itWhat it tells you
Model precisionHuman-confirmed fraud cases divided by alerts the model flagged high riskHow often the model is right when it shouts
Rules precisionSame calculation for your existing rules on the same alertsThe baseline the model must beat
Override rateHuman decisions that differ from the model's recommendation divided by total reviewedWhere the model and your analysts disagree, and why
Escape rateFraud confirmed later that the model scored low riskThe most expensive error type
Schema failure rateResponses failing validation divided by total callsWhether your prompt or schema is drifting

Set a gate before you ever let the model's verdict change what happens to money. A reasonable gate: the model's precision on high risk alerts must exceed your current rules' precision on the same population, measured over a sample large enough that the difference is not noise, and the override rate must be stable. Until then, the model's recommendation is displayed to reviewers but not enforced.

Run each model verdict against a holdout. In every batch of alerts the model scores, keep a slice where reviewers see the model's verdict only after they have made their own decision. That slice is the only honest measure of whether the model would have helped.

Plan for the errors that matter

Three failure modes deserve a named owner.

Friendly fraud mistaken for stolen cards. A cardholder disputing a legitimate purchase looks, from a distance, like fraud. Friendly fraud is widely reported as a large share of disputes, and it is filed by the actual customer, often out of genuine confusion about a billing descriptor (Visa). Give the model the customer's dispute history and the merchant descriptor, and ask it to consider friendly fraud explicitly as a pattern label. A model that treats every dispute as a stolen card will get the wrong answer in a large fraction of cases.

Card testing drowned in noise. A card testing attack generates a burst of small authorizations, and automated attackers rotate IPs and vary timing to blend in (Chargeback Gurus). The model should be told the velocity of attempts per card and per device over a short window, and the reviewer should be able to see whether this alert is one of a cluster. A single low-value alert is unremarkable. Forty in an hour is a different case.

Prompt leaks and PII. The Fed's guidance is explicit that this analysis should happen inside a bank-approved generative AI environment designed to safeguard sensitive customer information, rather than in external, ungoverned systems (FedPayments Improvement). If your fraud queue contains names, addresses and account numbers, and it will, the model runs in an environment your security team has approved, with the same access controls as the rest of the queue.

Measure before you widen the lane

Give the model a review horizon of four to six weeks before changing anything about who decides. During that time the model runs in shadow mode: it scores every alert, the human decides every alert, and you compute the table above weekly.

When you are ready to move from copilot to triage, do it by band, not by category. Start with the lowest-risk slice: small amounts, established accounts, no prior chargebacks, and specifically not anything routed through a liability shift. If the model's precision holds there, expand to the next band. Keep the top band (the alerts most likely to be genuine fraud) fully human for longer, because that is where a wrong approval costs the most.

The model is also a prompt-and-context consumer, so run it through one gateway rather than wiring each product separately. Quanta Inference (https://quantaintelligence.ai/inference) puts text, image and embedding models behind a single OpenAI-compatible key priced in dollars, which makes it easy to swap the model behind your verdict schema while the schema and the logging stay fixed. That separation, not the model choice, is what keeps the pipeline stable.

FAQ

FAQ

Can the model approve or block transactions on its own?

Not at first, and probably not ever for high-value payments. Start with the model recommending and a human deciding on every alert, measure precision against your existing rules, and only let the model change the outcome for low-risk bands you have tested. The rules that protect payments staff exist because single unchecked decision points fail (J.P. Morgan).

How much context should I send per alert?

Send the order details, device and session signals, and aggregated customer history, plus a short list of recent orders. Do not send the full transaction archive. Long context raises cost and latency and gives the model more irrelevant detail to fixate on, which is the failure the Fed warns about when prompts lack structure (FedPayments Improvement).

What stops the model inventing reasons that are not true?

A fixed schema with a required missing-information field, plus runtime validation of every response. Schema constraints guarantee the shape is valid but not that the values are correct, so you still need to reject malformed output and retry or escalate it (MLflow). Reviewers should be able to check each of the top three reasons against the data shown beside it.

Should the model know whether 3D Secure passed?

Yes. Successful 3DS authentication generally shifts liability for fraudulent disputes to the issuer, while non-fraud disputes and data-only flows are not covered (gpayments). That changes both the risk and the potential loss, so the model should see the authentication result and the reviewer should see it too.

How do I know the model is better than my current rules?

Run both on the same alerts and compute precision, override rate and escape rate from your logs, with a holdout slice where reviewers decide before seeing the model's verdict. Chipper Cash's account of its triage pipeline shows why this matters: the audit trail, not the automation, is what makes the change defensible after the fact (Chipper Cash).

Sources

Sources

  1. Guiding Large Language Models (LLMs) Toward Better ...
  2. Enhancing Trust and Safety in Digital Payments: An LLM ...
  3. A comprehensive guide to payment fraud prevention for merchants
  4. Fraud prevention: 8 best practices for payments staff - J.P. Morgan
  5. Protect yourself from card testing | Stripe Documentation
  6. PDF A Merchant's Guide to Preventing Card Testing Attacks - J.P. Morgan
  7. What the 3D Secure Liability Shift Means for US Businesses
  8. Enforce, Validate, Observe: 3 LLM Structured Output ...
  9. How We Automated Fraud Email Triage at Chipper Cash
  10. Friendly fraud explained: prevention and solutions | Visa
  11. Preventing Card Testing Fraud - Chargeback Gurus
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles