Skip to main content

RFC-005

Choosing the Model

A Decision Procedure for Picking the Right AI Approach

How to pick the right AI approach — buy the product, write the rule, call an API, prompt a model, add retrieval, or train your own — with a selector you can use in a meeting, the arithmetic that settles the argument, and the vocabulary that stops four incompatible proposals from being debated as one.


Motivation

Someone says: "We should use AI to read our invoices." Ten minutes later there are four proposals on the table: buy a document API, train a model on five years of history, prompt a language model, or write rules against the ERP.

The room debates them as competing answers. They are not. Two are different layers of the same pipeline and belong together. One is a runtime choice. One is a training choice nobody has costed. The meeting ends in a pilot that proves nothing, because no one wrote down what "works" would mean.

This is a missing procedure, not a missing skill. "AI" is not one technology with one adoption decision — it is nine approaches with different cost shapes, different failure modes, and different reasons to be wrong. This RFC is the procedure for choosing between them.

PrincipleWhy
Decompose before decidingEvery "AI project" is a pipeline; each layer has its own answer
Constraints prune, economics ranksLatency, residency, and auditability are gates — not trade-offs
Take the lightest option that clears the barSimplicity is moving parts you must keep alive, not technique
Prompting sets the task, retrieval supplies the facts, training fixes the formMost "train it on our data" requests are retrieval requests
No selection without a scored evaluation setOtherwise selection is a preference argument between senior people
Every selection expiresCapability and price move faster than systems get rewritten

Pick in Five Minutes

Step 1 — Name the layer. "Read our invoices" is not a task, it is a pipeline. Choose per layer, never per project.

LayerExample questionThis layer is
SourceCould this arrive structured instead?Process design
CaptureWhat characters are on this page?Solved perception
NormalizeIs this date, currency, ID canonical?Deterministic code
ExtractWhich number is the total?Reading under variation
ClassifyWhich cost center is this line?Fixed label space
ValidateDo the lines sum? Is the VAT rate legal?Arithmetic and rules
MatchWhich purchase order is this?Search and scoring
DecideApprove, hold, or escalate?Policy under uncertainty
ActPost to the ledgerTransaction code

Six of those nine are not model problems. That is the point of the step.

Step 2 — Read the answer off the table. For the layer you named:

If the layer is…And…Start here
A document that could arrive as dataSuppliers or systems are negotiableChange the source
An entire standard workflow (AP, payroll, e-signature)A mature product category existsBuy the product
An exact, stable, writable ruleArithmetic, validation, formattingCode
A solved perception taskOCR, speech, translation, embeddingsBought API
Reading, judging, or writing textUnder ~1M items/yearGeneral LLM with a schema
Reading text about your own factsAnswers depend on internal dataLLM + retrieval
Reading text and taking actionMulti-step, path varies per itemLLM + tools
Text work under a residency or offline ruleData cannot reach a providerSelf-hosted open-weight LLM
Numeric or tabular scoringHigh volume, sub-100 ms, labeled historyClassical ML
Fixed labels at extreme volumeAbove ~1M items/year, or a hard latency floorDistill a small model — after running the LLM first

Step 3 — Check the disqualifiers. These remove options before any comparison; establishing them after the build invalidates the build.

ConstraintThresholdRemoves
LatencyUnder ~100 ms per decisionHosted LLM calls
ResidencyData may not leave a network or jurisdictionAny provider without a compliant regional deployment — usually points at self-hosted open weights, not at training
ReproducibilitySame input must yield same output on auditGeneration as the final authority
ExplainabilitySomeone can demand the reason for a decisionOpaque scoring as the sole basis
Untrusted inputDocuments arrive from outsideAny design where model output can act without a deterministic check
Unit cost ceilingA per-item cost the business case can't exceedLarge-model inference on the high-volume path
OfflineNo network at inferenceEverything hosted

Step 4 — Get a number before you argue. If nobody can say what "working" means, the meeting's output is not a decision — it is an assignment to build a 200-item evaluation set and reconvene. That week routinely saves a quarter.

The default answer for text work is a general model with a strict output schema. It has no fixed cost, no training data requirement, and no model to own. Everything else on the list needs a reason: a constraint it satisfies, a workflow it replaces wholesale, or volume arithmetic that beats it.


The Approach Menu

Ordered by how much you end up owning — the first rung that clears the bar wins, because every rung down adds permanent operational surface.

#ApproachWins whenYou ownFails by
0Change the sourceInput format is negotiableNothingThird parties you don't control
1Buy the finished productThe workflow is a mature commercial categoryA contractCeiling on fit; integration and lock-in
2Rules and codeThe rule is exact, stable, writableCode and testsBrittleness as variation grows
3Bought capability APIPerception is solved — OCR, speech, embeddingsA contractA vendor ceiling you can't raise
4General LLM with a schemaThe work needs reading or judgmentA prompt and an eval setNon-determinism; linear cost forever
5LLM + retrievalAnswers depend on facts the model can't knowAn indexRetrieval becomes the accuracy ceiling
6LLM + toolsThe work requires taking actionOrchestration and authorizationCompounding error; hardest to govern
7Self-hosted open-weight LLMResidency, offline, or extreme volume rules out hostedInference infrastructureCapacity, upgrades, and quality gap vs. frontier
8Classical ML on featuresNumeric signal, high volume, hard latency floorLabels, features, training pipelineSilent decay; needs labeled history
9Trained or distilled task modelFixed labels, extreme volume, proven taxonomyEverything in 8, plus a registry and rollbackRetraining forever

Two rungs get skipped for bad reasons. Rung 2 feels unfashionable — yet validation and arithmetic belong in code, where they can be unit-tested, not in a model that is right 97% of the time. Rung 8 gets skipped because attention moved to language models — yet tabular scoring (fraud, credit, churn) is still won decisively by gradient-boosted trees, at lower cost and far better latency.

"Simpler is cheaper" — true, if you define simple correctly

The instinct is right; the usual definition is wrong. Simplicity is parts you must keep alive, not technical modesty.

Technically simpleOperationally simpleMust be kept alive
Rules engineYesOnly while the rules are fewRule set, owner, regression tests, exception backlog
Classical ML / trained modelNoNoLabels, features, training, hosting, drift monitoring, retraining, rollback
General LLM with a schemaNoYesA prompt, a schema, an eval set

An LLM call is the sophisticated technique and the operationally simple choice. A hand-written rules pipeline is the modest technique that quietly becomes 4,000 rules and a full-time maintainer. Counting complexity in moving parts rather than cleverness reverses the ranking most teams start with — and the reversed ranking is the correct one.

Is a frontier LLM expensive compared to classical ML?

Per item, yes — by two to four orders of magnitude. In total cost of ownership at ordinary volume, no.

Classical ML / trained modelGeneral LLM
Per item~$0.00001 (CPU milliseconds)~$0.001–$0.05
To reach production$25,000–$80,000 (labels, features, training, deployment)Near zero — a prompt and a schema
Annual ownership$15,000+ (retraining, monitoring, hosting, on-call)Zero beyond usage
Time to first resultWeeks to monthsHours

Both columns are true at once, which is why unit price ranks the options backwards. And they are frequently not substitutes at all: classical ML cannot read an unstructured PDF, and an LLM cannot score a transaction in five milliseconds. Where both genuinely apply — fixed labels, high volume — volume decides, not preference.


The Words That Hide the Decision

Circulate this before the meeting, not after. Most selection arguments are two people using one phrase for different things.

SaidUsually meansActually requires
"Train a model on our data""It should follow our conventions"Retrieval or a better prompt; occasionally fine-tuning
"We need our own model""Our data must not leave our control"A hosting and contract decision — often self-hosted open weights
"It will learn from corrections""It improves as we use it"Nothing automatic. A labeled feedback loop somebody owns and funds
"RAG""It can use our documents"A retrieval design: filters, ranking, permissions, citations
"AI agent"Anything from a chatbot to write access in productionAn authorization decision, separate from the model decision
"It must be 100% accurate""I have not set an error budget"An error budget and an escalation path per decision type
"Our data is too specialized"An untested assumption about vocabularyTwenty hard examples and an hour
"It works in the demo"The easy third of the distributionA re-run on the frozen holdout, tail included

Six things called "training"

NameChangesNeedsOrder of costWho should
Pre-trainingCreates a base modelTrillions of tokensTens of millionsFrontier labs only
Continued pre-trainingDomain languageBillions of tokensHundreds of thousandsGenuinely alien vocabulary
Fine-tuning (incl. LoRA)Output form, schema, tone1,000–50,000 examplesThousands, plus upkeepProven, stable, high-volume tasks
Task model trainingA dedicated classifier2,000–50,000 labelsTens of thousandsFixed labels at extreme volume
Preference tuningRanking among acceptable outputsThousands of comparisonsTens of thousandsA graded quality signal exists
In-context learningBehavior for one call0–50 examples in the promptFreeEveryone, first

Fine-tuning changes how a model answers, not what it knows. A model tuned on last year's contracts writes confidently about clauses that changed in January. Facts belong in retrieval, where they can be updated, cited, and revoked.


Retrieval Is Not One Thing

"Add RAG" names a goal, not a design. Vector search is one method among several and is frequently the wrong one — most retrieval failures are method mismatches, not model weaknesses.

MethodWins whenCost
Deterministic lookup by ID, date, owner, or scopeThe right document is known, not searchedNear zero. No index
Lexical search (BM25)Exact tokens matter — SKUs, error codes, names, citationsCheap, explainable, no re-embedding on model change
Hybrid lexical + vector, then a rerankerGeneral document corporaThe realistic production default
Vector search aloneParaphrase and concept matchingIndex sync, embedding-version lock-in, chunk-level permission risk
Structured query (text-to-SQL)The answer is a fact in a table, not proseNo index; needs schema context and query guardrails
Live API callData changes faster than any index refreshZero staleness — the most under-used option
Knowledge graphMulti-hop questions across entitiesExpensive to build and to keep current
Long-context stuffingThe corpus is small — one contract, one handbookNo retrieval infrastructure at all

Three rules regardless of method. Permissions are applied at query time, not after retrieval — filtering afterwards leaks. Freshness is a property of the method: every indexed approach is stale by its refresh interval; only live calls aren't. Embedding a number is worse than matching it — spend on the retrieval method before spending on a better embedding model.


The Arithmetic of Training Your Own

Training trades a large fixed cost for a lower marginal cost. The break-even is nearly always larger than people expect.

V* = (C_fixed + C_upkeep) / (c_general − c_specialized)

Worked with deliberately favorable assumptions — routing invoice lines to cost centers:

ItemAssumption
Labeling 5,000 examples (model-assisted, human-reviewed)$4,000
Engineering: build, evaluate, deploy (3–4 weeks)$25,000
Retraining, monitoring, on-call$15,000 / year
Inference hosting$3,600 / year
Per item: small general model$0.002
Per item: self-hosted specialized model$0.0001
HorizonBreak-even volume
Year one ($29,000 fixed + $18,600 upkeep)~25,000,000 items / year
Steady state, year two onward ($18,600 upkeep)~9,800,000 items / year
Three-year total cost of ownership~14,000,000 items / year

At a realistic 50,000 items per year, the general model costs about $100 annually and the specialized one about $47,600 in year one — to save $95. The gap only closes if the per-item delta is large, which is why the first optimization is always within the general-model rung:

Per-item savingYear-one break-evenSituation
$0.0019~25,000,000 / yearSmall general model → specialized
$0.02~2,400,000 / yearLarge general model → specialized
$0.10~480,000 / yearLarge model, long prompt → specialized

Before training anything, try the cheap moves. A smaller model, a shorter prompt, a cached stable prefix, batching, and a rule that filters the easy cases routinely cut per-item cost by an order of magnitude — in days, with no fixed cost and no model to own.

When specializing does pay, the sequence is not "train instead of prompt." Run the general model in production, keep its inputs and verified outputs, then train the small model on that corpus. The general model becomes the labeling engine and the quality reference; the small model becomes the runtime. This avoids the classic failure of labeling a taxonomy up front that production then invalidates.

Re-derive these numbers with current prices. The structure is stable; the figures are not.


Evidence

No approach can be selected without a scored evaluation set — and the set outlives every choice made with it. Models get replaced; the eval set is what makes replacement a one-day decision.

Build it in a week
Sample150–300 real items, stratified across supplier, format, language, layout, amount band
Include the tailA third from the awkward cases: handwriting, credit notes, multi-page, foreign currency, poor scans
Label per layerExtraction and classification separately, not one end-to-end verdict
Freeze a holdoutA third, never inspected during development
Score abstention"I don't know" is a correct answer at low confidence — it routes to a human instead of causing an error
Assign ownersDomain expert owns labels, engineering owns the harness, both in version control

Where output is genuinely subjective — drafting, summarizing — the score is a human rubric, not an exact match. Rubric scoring is slower and still beats opinion. The only unacceptable answer is having no score at all.

MetricWhy it decides
Accuracy per layerLocates the weak stage instead of averaging it away
Escalation rateHuman review is usually the dominant cost, not inference
Cost per correct decision, including error costThe only figure that ranks approaches against each other
p95 latencyAverages hide the failures users actually experience

A system that abstains on 20% of items with 99.9% accuracy on the rest usually beats one that answers everything at 95%. The first has a known cost — review of a fifth of the volume. The second has an unknown liability spread across every downstream system.


Five Problems, Five Answers

ProblemDecisive factsVerdict
Invoice capture and coding, 50k/yearVolume ~500x below break-even; capture is commodity; VAT rules are arithmeticBuy capture, code the rules, general LLM with a schema for extraction and coding, escalate low confidence. Training saves $95/year and costs a permanent obligation
Ticket routing, 50k/day, 12 queues, 200 msFixed labels, extreme volume, hard latency floorStart on the LLM to establish the taxonomy and generate labels in production; distill to a small classifier once the taxonomy holds for a quarter; keep the LLM for the low-confidence tail
Contract clause review, 400/yearLow volume, high judgment, standards shift with case lawLLM + retrieval over the clause library, mandatory citations, no autonomous decision. Fine-tuning here bakes in last year's positions
Fraud scoring, 5 ms, regulator asks whyLatency and explainability disqualify rungs 4–7 outrightGradient-boosted trees with feature attribution. The LLM's role is summarizing a flagged case for the analyst — not scoring
Knowledge search, 30k documents, constant changeNeeds current facts with provenanceRetrieval with citations and an explicit "not in the sources" answer. The request to "fine-tune on our wiki" is asking training to do retrieval's job

The first row generalizes: for most enterprise document work, the honest answer is buy the commodity layer, code the deterministic layer, prompt the judgment layer, and train nothing.


Deciding, and Re-Deciding

Run the meeting in this order. No approach may be named before question four.

  1. What are the layers? Nine boxes on the board, not one.
  2. Which layer are we discussing? Every sentence after this is scoped to one box.
  3. What are the hard constraints and the error budget for that box?
  4. What does the evaluation set say?

Decision rights follow the same split: the domain owner sets the error budget and owns the labels, engineering owns the harness and the measured numbers, the budget holder picks among options that cleared the constraints — and nobody overrules a constraint, because a constraint is a fact, not a preference.

Record it where it can be revisited.

task: invoice-line-coding
layer: classify
date: 2026-09-06
constraints:
  latency_p95_ms: 5000
  residency: EU
  error_budget: "2% miscoded, caught by monthly reconciliation"
  volume_per_year: 50000
evaluated:
  - approach: rules-on-supplier-master
    accuracy: 0.71
    cost_per_correct_decision: 0.052   # includes rework on 29% misroutes
    rejected: "fails on new suppliers and split lines"
  - approach: general-llm-with-schema
    accuracy: 0.94
    escalation_rate: 0.09
    cost_per_correct_decision: 0.019
  - approach: trained-classifier
    projected_accuracy: 0.93
    break_even_volume_per_year: 25000000
    rejected: "volume is 500x below break-even"
selected: general-llm-with-schema
eval_set: evals/invoice-line-coding-v3 (247 items, 82 held out)
review_on: 2027-03-06
review_trigger: "volume above 2M/year, or p95 breach, or eval accuracy below 0.90"
owner: finance-operations

Every selection expires. Two years ago several tasks now handled by a prompt required a trained model, and several now handled by a small model required a large one. Systems that aged well are not the ones that picked correctly — they are the ones that kept re-picking cheap.

PracticeEffect
Prompts, schemas, and evals in version controlThe asset survives any model it was written against
One interface in front of every model callSwapping providers is configuration, not a refactor
Re-run the eval quarterly and on any price or model changeSelection stays a standing question
A review trigger recorded with the decisionSomeone reconsiders on a number, not a news cycle
No business logic that exists only inside trained weightsLogic in weights cannot be read, diffed, or reviewed

The durable assets are the decomposed pipeline, the labeled evaluation set, and the recorded decision — not the model. Models are the most replaceable component in the system, and any architecture that treats one as permanent has locked in the fastest-moving part of the stack.

Back to RFCs