The title confuses people, including people who hire for it. When someone hears AI engineer they usually picture model training, and that is a small slice of the work. Most of what I do is ordinary software engineering applied to a component that behaves differently every time you run it.
Here is the honest shape of the job.
You are building around the model, not the model
Almost nobody outside a frontier lab trains a foundation model. The models arrive as an API or a set of weights, and the engineering question is what you wrap around them.
That wrapper is where the work lives. Where does context come from. What happens when the model returns nothing useful. How do you know it got worse after Tuesday’s deploy. What does the user see while they wait four seconds. What stops a prompt from turning into an expensive loop.
None of those are modelling problems. They are systems problems, and they are the reason the role sits closer to backend engineering than to data science.
Non-determinism is the whole difficulty
A normal function returns the same output for the same input. That property is so ordinary that every testing tool, every cache, every retry policy and every debugging habit quietly assumes it.
Language models break the assumption. The same input can produce a different answer, a differently shaped answer, or an answer that is subtly wrong in a way no exception will ever surface. You cannot assert equality on the output, so the usual safety net does not catch anything.
Everything distinctive about the discipline follows from that one fact: evaluation instead of assertions, guardrails instead of type checks, observability instead of stack traces.
Evaluation is the actual skill
If I had to name one thing that separates people who ship working AI features from people who ship demos, it is that the first group can answer the question “is this better than last week” with evidence.
That means a set of real inputs with known good outputs, a scoring method you trust, and a number you can watch move. It is unglamorous work. Building the evaluation set is usually harder than building the feature, and it is the part that gets skipped under deadline, which is exactly why so many AI features degrade quietly after launch.
Cost and latency are design constraints, not afterthoughts
Traditional web work treats a database query taking 200 milliseconds as something to fix. Model calls take seconds, and they cost real money per call, which changes the shape of what you are allowed to build.
A feature that calls a large model three times per keystroke is not a feature, it is a bill. A lot of AI engineering is deciding which parts of a task actually need a model at all. Often the answer is that a regular expression, a database lookup or a small classifier does most of the job, and the expensive model only handles the last step.
Failure has to be designed
Because the component is unreliable by nature, the interesting design question is what happens when it fails, and it will fail.
Does the feature disappear cleanly. Does it fall back to something dumber but predictable. Does it tell the user it is unsure. Does it ever confidently make something up in a place where being wrong is expensive.
I have come to think that the quality of an AI feature is mostly determined by how well it handles its own bad days, not by how good it looks on a good one.
The unglamorous summary
An AI engineer is a software engineer whose components are probabilistic. The work is retrieval, evaluation, guardrails, caching, cost control, fallbacks, observability, and a lot of careful thinking about what the product should do when the clever part does not work.
If that sounds like plumbing, it is. Plumbing is what makes the difference between a demonstration and something people can actually rely on.
