, ,

What an AI Engineer Actually Does, vs ML Engineer, Data Scientist and Backend Developer (AI Engineering Series, Part 1)

An AI engineer builds applications on models somebody else trained. Here is what the job contains day to day, how it differs from ML engineering, data science and backend work, and the order I would learn it in.

AI Engineering Series · Part 1 of 30

Roughly one line in twenty of the last AI feature I shipped was a model call. Everything around it, retrieval, schema validation, retries, caching, logging and a test set that could tell me when an answer had quietly got worse, was the actual work.

That ratio is the job description, and it is the thing nobody puts in a job advert. Vendor quickstarts open with five lines of Python that return a sentence, which makes the model call look like the product. In a system that real people depend on, the model call is the smallest and most replaceable part of what you build.

Key takeaways

An AI engineer builds applications on top of models somebody else trained. Training is not part of the job, and in most such roles you will never open a training loop.

Difficulty concentrates outside the model: getting the right context in front of it, checking what comes back, and noticing when quality drops.

Python backend skills transfer almost completely. Non determinism, absent ground truth and cost that scales with input length are what you have to learn fresh.

On version one of our documentation assistant, wiring the model call took 1.5 days out of 30. Retrieval and evaluation together took 13.

Before writing any code, write 20 questions with the answers you would accept. That set outlives every other decision you make.

Who this is for: a working Python developer who is comfortable with HTTP clients, virtual environments and a test runner, and who has never called a large language model API. A large language model, or LLM, is a model trained to continue a sequence of tokens, and if the word token is new, read tokens and embeddings from the GenAI series first. For the Python side, this series assumes the environment setup in Python setup and reproducibility. No code in this part, because none of what it covers is a coding decision.

Daily work of an AI engineer

Here is a week that would be unremarkable in this role. Monday, a support lead reports that the assistant is confidently citing a policy that was withdrawn in March, so you trace the request, find the withdrawn document still sitting in the index, and add a freshness filter. Tuesday, you discover that filter cut recall on three other question types, so you write ten more test questions to pin the behaviour down. Wednesday goes on a schema, because a downstream service wants structured fields and the model returns valid JSON about 94 percent of the time, which is not good enough. Thursday, someone in finance asks why last month cost 3,200 dollars, and you find that a retry loop was re sending the full document context on every timeout. Friday, a new model version is announced and you have to decide whether to move.

Not one of those days involved training anything. Four of them involved measurement, and that proportion holds. My rough split across a year of this work: about 30 percent on retrieval and context assembly, 25 percent on evaluation and regression testing, 20 percent on ordinary application engineering such as queues, caching and error handling, 15 percent on cost and latency, and maybe 10 percent on prompts themselves. Prompt writing gets the attention because it is visible and quotable. It is the part I spend least time on once a feature is past its first week.

Version one of the documentation assistant that runs through this series took thirty working days. Below is where those days actually went, measured rather than remembered, because I logged them at the time for exactly this argument.

Where thirty days went on version oneWorking days per activity, internal documentation assistant, one engineer8 d4 d08.0Chunkingretrieval6.0Ingestand clean5.0Eval setand scoring4.0Latencyand cost3.0Guardrailsand PII2.5Tracingand logs1.5Model callwiringModel call wiring was 5 percent of the build. Retrieval plus evaluation was 43 percent.Every quickstart tutorial covers the black bar and stops there.
Thirty logged days on one assistant. Shape has repeated on every similar build I have run since.

Four roles drawn against one system

Role comparisons written in the abstract are useless, so let us put all four against a single system and see who owns what. Picture an internal assistant that answers staff questions from product documentation, a support ticket archive and a changelog. Everything in this series builds that system, so it is worth drawing the ownership lines once, properly.

flowchart TD subgraph DS[Data scientist] A[Study ticket history] B[Define what a good answer means] end subgraph MLE[ML engineer] C[Train a ticket router] D[Serve that model] end subgraph AIE[AI engineer] E[Context assembly and prompt] F[Retrieval over docs corpus] G[Eval harness and regression tests] H[Guardrails, cost and latency] end subgraph BE[Backend developer] I[API surface and auth] J[Queue, cache and database] end B --> G D --> E F --> E E --> G G --> H I --> E E --> J
One assistant, four owners. AI engineering is the band in the middle, and on small teams it absorbs the bands either side of it.

Notice that the ML engineer band in that picture is optional. Plenty of production assistants contain no custom trained model at all, which is why an organisation can hire an AI engineer and ship a working feature without ever employing anyone who has trained anything. Notice too that the AI engineer band touches every other band, which is the honest reason this role is hard to hire for. It is a systems job wearing a modelling job costume.

RoleOwnsDone looks likeMain artifactFailure mode I see most
AI engineerBehaviour of a system built on somebody else modelFeature passes an eval set at an agreed threshold, inside a cost and latency budgetA running service plus the eval suite that guards itShipping with no eval set, so quality changes are invisible until a user complains
ML engineerA model trained on your own data, and its serving pathModel beats the incumbent on a held out set and meets a serving SLAA versioned model in a registryTraining a model where retrieval or a prompt would have been enough
Data scientistFraming the question and deciding what counts as successA defensible answer, with the uncertainty statedAn analysis and a metric definitionMetric that nobody can compute in production
Backend developerEverything deterministic around the featureTests pass, latency and error budgets holdA service and its contractTreating a model call like any other idempotent API call
Keep this table. In an interview, the answer to what makes you an AI engineer rather than a backend developer is the row you can evidence.

Where common advice is wrong

Job adverts for AI engineer roles still list PyTorch, deep learning theory and backpropagation. Candidates read that and spend three months on a neural network course. In the role as it is actually practised, you will not touch a training loop, and the same three months spent on retrieval quality, evaluation design and cost accounting would make you employable twice over. Which model to use is close to the most reversible decision in the whole stack, and it is the one most beginners agonise over first. Get your eval set right and swapping models becomes an afternoon.

Skills that carry over from backend work

Good news for anyone arriving from ordinary application development: most of what you know still applies, and it applies harder than usual. Model providers rate limit aggressively, time out under load and occasionally return malformed output, so the retry, backoff and circuit breaker instincts you built calling payment gateways are worth more here than any AI specific knowledge. What changes is a short list, but each item on it is genuinely awkward the first time.

What you already doWhat changes with a model in the loop
Assert on an exact response in a unit testSame input can return different text on every call, so assertions move from equality to scored thresholds over a set of cases
Retry a failed requestEvery retry re sends the entire input and is billed again, so a retry storm is a cost incident as well as a latency one
Validate a payload against a schemaProducer of the payload is a model that will occasionally ignore your schema, so validation needs a repair or reject path, not just a 400
Size a request by payload bytesCost and latency track token count and there is a hard ceiling called the context window, so input length becomes a design constraint
Fix a bug by reading a stack traceWrong answer produces no error at all, so tracing what context was assembled matters more than any exception handler
Five habits that need rewiring. Everything else you know about services still holds.

Row four deserves emphasis because it catches nearly everyone. A context window is the maximum number of tokens a model can consider at once, and it behaves like a budget rather than a limit you occasionally brush against. Once retrieval starts stuffing documents into a request, you are trading answer quality against both money and response time on every single call, and that trade off has no default setting. Context window explained covers the concept; Part 5 covers what to do about it in a budget you have to defend.

Documentation assistant we build across this series

One project runs the length of these thirty parts. Our imaginary employer is a mid sized software company whose support team answers the same forty questions every week from three sources that never agree with each other: product documentation, an archive of resolved tickets, and a changelog. Staff want a single place to ask. Customers eventually want the same thing, with tighter rules about what it may say.

So that you can follow along on real material rather than three toy text files, we use a public corpus with the same awkward shape: the getsentry/sentry-docs repository. It gives us several thousand documentation pages in Markdown and MDX, a public issue history that stands in nicely for a support ticket archive, and a commit and release trail that behaves like a changelog. It is openly licensed, it contains code samples, nested tables and platform specific variants, and it will break a naive chunker in at least four interesting ways. That is exactly why it was chosen over something tidy.

PhasePartsWhat the assistant can do by the end
Calling a model well1 to 6Answer from a prompt alone, returning validated structured output, inside a known cost per request, without falling over on a rate limit
Retrieval7 to 13Answer from the actual docs corpus, with retrieval quality measured separately from answer quality
Agents and tools14 to 19Look up live ticket status, run multi step work, and escalate to a human at a defined gate
Quality and safety20 to 25Survive a model upgrade without silent regression, resist prompt injection, and be debuggable when it misbehaves
Production26 to 30Run cheaply, respond fast, and move to a different provider without a rewrite
Five phases, one system. Each phase leaves the assistant able to do something it could not do before.

Where new AI engineers lose their first six months

Two mistakes account for most of the wasted time I have watched, and I have made both of them personally. First, reaching for training when retrieval would do. Second, shipping without any way to tell whether the thing got better or worse.

War story: for the first attempt at this assistant I staffed the work with an excellent ML engineer, on the theory that a model problem needs a model person. He spent five weeks fine tuning a small open model on our documentation. In parallel, mostly to have something to demo, I built a crude retrieval prototype in two days: split the docs on headings, embed, take the top five chunks, paste them into a prompt. We scored both against sixty questions written by two support agents. Fine tuned model scored 0.52 on answer accuracy. Two day prototype scored 0.71, and it could cite its sources, which the fine tuned model could not. We threw away five weeks of good engineering because we had picked the wrong tool before anyone had defined the problem. What made it worse is that we only found out because the demo forced a comparison. Had the fine tune shipped alone, it would have looked fine.

Second mistake is quieter and more expensive. Teams ship a feature, tune the prompt over a few weeks, and end up with no idea whether their current version is better than the one from three weeks ago, because the only evidence is how the last four answers felt. I now treat a written eval set as a precondition for starting, not as something to add later. Sixty questions written by two people who answer them for a living took an afternoon and became the most reused artefact in the whole project. It survived two model changes, a retrieval rewrite and a provider migration. Evaluating GenAI output gives the concepts; Part 20 builds the set.

A third pattern is worth naming even though it is less common: mistaking an agent for an architecture. An agent, loosely, is a loop where a model chooses which tool to call next rather than following a path you wrote. Agents are genuinely useful and Parts 14 to 19 build one. They are also the answer to far fewer problems than current enthusiasm suggests, and a workflow you wrote yourself is cheaper, faster and debuggable. AI agents explained is the concept; Part 15 argues the case against, which is the part most people skip.

Learning order I would follow

If you asked me to compress this series into advice for your next six weeks, it would be four items in this order. Learn to make a single model call reliable, meaning structured output, retries, timeouts and a known cost per request. Learn retrieval properly, because it is where quality actually comes from and where most of the engineering lives. Learn evaluation, because without it every later decision is a guess dressed as judgement. Only then look at agents, fine tuning and orchestration frameworks, all of which are much easier to reason about once you can measure.

What I would avoid, said plainly: starting with a framework. Picking up an orchestration library before you have written a raw model call yourself means you inherit somebody else opinions about retries, context assembly and prompt structure without knowing they are opinions. Write forty lines of plain Python first, feel where it hurts, then choose the framework that fixes your specific pain. Same argument applies to fine tuning, which Part 7 takes apart in detail, and to vector databases, which are a storage decision masquerading as a strategy.

One action for Monday, and it costs an afternoon. Sit with whoever answers questions in your organisation and write down twenty real questions alongside the answer they would accept. Do not clean them up. Keep the badly worded ones, because those are what users type. That file is your first eval set, it will tell you within a week whether any of this is working, and every part after this one assumes you have it. Part 2 makes the first model call against those questions and shows what the raw output looks like before any of the machinery exists.

AI Engineering Series · Part 1 of 30
Guide  |  Next: Part 2 »

References

About The Author


Discover more from Journal of Intelligent Infrastructure – By Dr Pranay Jha

Subscribe to get the latest posts sent to your email.

Leave a Reply

Your email address will not be published. Required fields are marked *

Architect’s Toolkit

About the Author

Dr. Pranay Jha is a Cloud and AI Consultant with 18+ years of experience in hybrid cloud, virtualization, and enterprise infrastructure transformation. He specializes in VMware technologies, multi-cloud strategy, and Generative AI solutions. He holds a PhD in Computer Applications with research focused on Cloud and AI, has published multiple research papers, and has been a VMware vExpert since 2016 and a VMUG Community Leader.

Discover more from Journal of Intelligent Infrastructure - By Dr Pranay Jha

Subscribe now to keep reading and get access to the full archive.

Continue reading