<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jamie Gray</title>
    <description>The latest articles on Forem by Jamie Gray (@jamie_gray_ai).</description>
    <link>https://forem.com/jamie_gray_ai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3804105%2Fe71b12d7-60fc-4dd0-8ff9-11d486cae224.jpg</url>
      <title>Forem: Jamie Gray</title>
      <link>https://forem.com/jamie_gray_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jamie_gray_ai"/>
    <language>en</language>
    <item>
      <title>How I Approach Evaluation When Building AI Features</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Mon, 23 Mar 2026 09:59:22 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/how-i-approach-evaluation-when-building-ai-features-4elh</link>
      <guid>https://forem.com/jamie_gray_ai/how-i-approach-evaluation-when-building-ai-features-4elh</guid>
      <description>&lt;p&gt;Building an AI feature is not the same as shipping traditional software.&lt;/p&gt;

&lt;p&gt;In classic software, you write code, test it, and deploy it. Deployment is usually a finish line.&lt;/p&gt;

&lt;p&gt;With AI features, deployment is just the beginning.&lt;/p&gt;

&lt;p&gt;That is one of the biggest mindset shifts I have had while working on AI systems. The question is not only whether a feature works during development. The bigger question is whether it keeps working well when real users, messy inputs, changing data, and production constraints enter the picture.&lt;/p&gt;

&lt;p&gt;That is why I take evaluation seriously.&lt;/p&gt;

&lt;p&gt;Not as a one-time quality check.&lt;br&gt;
Not as something to do right before launch.&lt;br&gt;
But as an ongoing part of building the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why evaluation has to be continuous
&lt;/h2&gt;

&lt;p&gt;AI systems are different because their behavior is not fully fixed.&lt;/p&gt;

&lt;p&gt;Even if the code around the model does not change, the outputs can still shift because of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;new user inputs&lt;/li&gt;
&lt;li&gt;different context data&lt;/li&gt;
&lt;li&gt;retrieval quality changes&lt;/li&gt;
&lt;li&gt;prompt changes&lt;/li&gt;
&lt;li&gt;model updates&lt;/li&gt;
&lt;li&gt;distribution drift in real-world usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means evaluation cannot be treated as a checkbox.&lt;/p&gt;

&lt;p&gt;It has to be part of the product lifecycle.&lt;/p&gt;

&lt;p&gt;I want to know not just whether the feature looked good in a demo, but whether it remains useful, stable, and trustworthy as conditions change.&lt;/p&gt;

&lt;p&gt;That is the real test.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually care about when evaluating AI features
&lt;/h2&gt;

&lt;p&gt;When I evaluate an AI feature, I usually care about five things most:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Accuracy
&lt;/h3&gt;

&lt;p&gt;Is the output correct?&lt;/p&gt;

&lt;p&gt;This sounds obvious, but it is still the first thing I check. If the system produces wrong answers, wrong classifications, wrong summaries, or wrong structured data, nothing else matters much.&lt;/p&gt;

&lt;p&gt;That said, accuracy in AI systems is often contextual. Sometimes “correct” means factually correct. Sometimes it means aligned with a business rule. Sometimes it means sufficiently useful for the task.&lt;/p&gt;

&lt;p&gt;So I try to define accuracy in a way that matches the real product outcome, not just a vague technical idea of correctness.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Relevance
&lt;/h3&gt;

&lt;p&gt;Even technically correct output can still be unhelpful.&lt;/p&gt;

&lt;p&gt;A feature might produce something reasonable, but if it does not solve the user’s actual need, it is not high quality.&lt;/p&gt;

&lt;p&gt;That is why I evaluate whether the output is relevant to the request, the workflow, and the context in which the feature is being used.&lt;/p&gt;

&lt;p&gt;This matters a lot in AI systems because models are often capable of producing plausible but slightly off-target results.&lt;/p&gt;

&lt;p&gt;Those are dangerous because they look good at first glance.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Consistency
&lt;/h3&gt;

&lt;p&gt;If two similar inputs produce wildly different output quality, the product will feel unreliable.&lt;/p&gt;

&lt;p&gt;Consistency matters because users form expectations fast.&lt;/p&gt;

&lt;p&gt;If a feature works beautifully once and then behaves weakly the next time, trust drops quickly.&lt;/p&gt;

&lt;p&gt;So I pay attention to whether the system behaves predictably across similar cases, especially around formatting, decision logic, quality level, and error handling.&lt;/p&gt;

&lt;p&gt;Consistency is one of the most underrated parts of AI quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Safety and failure behavior
&lt;/h3&gt;

&lt;p&gt;A feature is not only defined by when it works.&lt;/p&gt;

&lt;p&gt;It is also defined by how it behaves when it does not work.&lt;/p&gt;

&lt;p&gt;I want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does it fail clearly?&lt;/li&gt;
&lt;li&gt;does it avoid unsafe output?&lt;/li&gt;
&lt;li&gt;does it avoid pretending to know more than it knows?&lt;/li&gt;
&lt;li&gt;does it return a controlled result when confidence is low?&lt;/li&gt;
&lt;li&gt;does it trigger fallback logic appropriately?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is part of evaluation too.&lt;/p&gt;

&lt;p&gt;A system that occasionally says “I cannot produce a reliable result here” may be much better than a system that always returns something confident but questionable.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Usability
&lt;/h3&gt;

&lt;p&gt;Even a technically strong model can create a bad product if the experience is clumsy.&lt;/p&gt;

&lt;p&gt;That is why I also evaluate things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;response format&lt;/li&gt;
&lt;li&gt;readability&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;whether the output is actionable&lt;/li&gt;
&lt;li&gt;whether the UI can use the response cleanly&lt;/li&gt;
&lt;li&gt;whether the feature helps the user move forward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usability is not separate from model quality.&lt;/p&gt;

&lt;p&gt;In product terms, usability is quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automated evaluation is useful, but limited
&lt;/h2&gt;

&lt;p&gt;I like automated tests.&lt;br&gt;
I use them often.&lt;br&gt;
But I do not think they are enough for AI systems.&lt;/p&gt;

&lt;p&gt;Automated evaluation is great for checking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;known test cases&lt;/li&gt;
&lt;li&gt;regression behavior&lt;/li&gt;
&lt;li&gt;output shape&lt;/li&gt;
&lt;li&gt;schema compliance&lt;/li&gt;
&lt;li&gt;business rules&lt;/li&gt;
&lt;li&gt;scoring against benchmark datasets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are all valuable.&lt;/p&gt;

&lt;p&gt;They help catch obvious breakages early.&lt;br&gt;
They make iteration safer.&lt;br&gt;
They create a baseline.&lt;/p&gt;

&lt;p&gt;But automated evaluation usually has limits.&lt;/p&gt;

&lt;p&gt;It may miss subtle quality issues.&lt;br&gt;
It may fail to capture user expectations.&lt;br&gt;
It may not notice when output is technically valid but practically weak.&lt;/p&gt;

&lt;p&gt;So I treat automation as necessary, but not sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human evaluation still matters a lot
&lt;/h2&gt;

&lt;p&gt;One of the most important lessons in AI product work is that human review still matters.&lt;/p&gt;

&lt;p&gt;AI output quality is often contextual, and context is hard to fully encode in automated checks.&lt;/p&gt;

&lt;p&gt;That is why I like including some kind of human evaluation loop, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manual review of outputs&lt;/li&gt;
&lt;li&gt;comparison between versions&lt;/li&gt;
&lt;li&gt;user feedback collection&lt;/li&gt;
&lt;li&gt;spot checks on edge cases&lt;/li&gt;
&lt;li&gt;domain expert review for sensitive use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Human evaluation helps catch issues that metrics alone can miss.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tone feels wrong&lt;/li&gt;
&lt;li&gt;reasoning is shallow&lt;/li&gt;
&lt;li&gt;output is technically correct but not useful&lt;/li&gt;
&lt;li&gt;the answer misses the most important point&lt;/li&gt;
&lt;li&gt;the result feels inconsistent with user expectations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are real product issues, even if an automated score does not flag them.&lt;/p&gt;

&lt;h2&gt;
  
  
  My favorite way to think about AI evaluation
&lt;/h2&gt;

&lt;p&gt;I usually break evaluation into three layers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 1: Component correctness
&lt;/h3&gt;

&lt;p&gt;This is the most basic layer.&lt;/p&gt;

&lt;p&gt;I ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does the endpoint work?&lt;/li&gt;
&lt;li&gt;is the request valid?&lt;/li&gt;
&lt;li&gt;is the output schema correct?&lt;/li&gt;
&lt;li&gt;does the system parse and return the result properly?&lt;/li&gt;
&lt;li&gt;do rules and validations work as expected?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This layer is mostly about engineering correctness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2: Workflow quality
&lt;/h3&gt;

&lt;p&gt;Here I ask whether the full feature works in practice.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;does retrieval bring in the right context?&lt;/li&gt;
&lt;li&gt;does the prompt produce the intended behavior?&lt;/li&gt;
&lt;li&gt;does the output fit the product need?&lt;/li&gt;
&lt;li&gt;does fallback behavior work when needed?&lt;/li&gt;
&lt;li&gt;does latency stay in an acceptable range?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where many real issues appear.&lt;/p&gt;

&lt;p&gt;The model may work fine, but the workflow around it may be weak.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3: Real user value
&lt;/h3&gt;

&lt;p&gt;This is the highest layer.&lt;/p&gt;

&lt;p&gt;I ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is this actually helping users?&lt;/li&gt;
&lt;li&gt;is it reducing effort?&lt;/li&gt;
&lt;li&gt;is it improving speed or quality?&lt;/li&gt;
&lt;li&gt;are people trusting it?&lt;/li&gt;
&lt;li&gt;are they using it again?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the layer that matters most in the long run.&lt;/p&gt;

&lt;p&gt;A feature can pass technical tests and still fail to create value.&lt;/p&gt;

&lt;h2&gt;
  
  
  I care a lot about edge cases
&lt;/h2&gt;

&lt;p&gt;A lot of AI features look strong on normal examples.&lt;/p&gt;

&lt;p&gt;That is not enough.&lt;/p&gt;

&lt;p&gt;The real test is how they behave when inputs are incomplete, ambiguous, messy, repetitive, or just strange.&lt;/p&gt;

&lt;p&gt;That is why I deliberately evaluate edge cases such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing context&lt;/li&gt;
&lt;li&gt;contradictory input&lt;/li&gt;
&lt;li&gt;unexpected formatting&lt;/li&gt;
&lt;li&gt;overly long input&lt;/li&gt;
&lt;li&gt;low-signal input&lt;/li&gt;
&lt;li&gt;near-duplicate requests&lt;/li&gt;
&lt;li&gt;malformed documents&lt;/li&gt;
&lt;li&gt;empty or partial results from upstream systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edge cases are where reliability becomes visible.&lt;/p&gt;

&lt;p&gt;They also reveal whether the system is truly engineered or just loosely connected around a model call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback loops are part of evaluation
&lt;/h2&gt;

&lt;p&gt;Evaluation should not stop once a feature goes live.&lt;/p&gt;

&lt;p&gt;After launch, I want to learn from real usage.&lt;/p&gt;

&lt;p&gt;That means looking at signals like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user ratings&lt;/li&gt;
&lt;li&gt;correction patterns&lt;/li&gt;
&lt;li&gt;support complaints&lt;/li&gt;
&lt;li&gt;failed requests&lt;/li&gt;
&lt;li&gt;fallback frequency&lt;/li&gt;
&lt;li&gt;manual review findings&lt;/li&gt;
&lt;li&gt;drift in quality over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These signals help answer an important question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the system getting better, staying flat, or quietly getting worse?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without feedback loops, it is very easy to assume an AI feature is healthy just because no one is actively reporting disaster.&lt;/p&gt;

&lt;p&gt;That is not a strong standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metrics matter, but I try not to worship them
&lt;/h2&gt;

&lt;p&gt;Metrics are useful.&lt;br&gt;
I rely on them.&lt;br&gt;
But I also think it is easy to over-trust them.&lt;/p&gt;

&lt;p&gt;A number can look clean while the user experience is getting worse.&lt;/p&gt;

&lt;p&gt;For example, a feature may have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strong request success rate&lt;/li&gt;
&lt;li&gt;good average latency&lt;/li&gt;
&lt;li&gt;valid JSON output&lt;/li&gt;
&lt;li&gt;stable infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and still be underperforming from a product perspective.&lt;/p&gt;

&lt;p&gt;Maybe the answers are too generic.&lt;br&gt;
Maybe the model is missing nuance.&lt;br&gt;
Maybe users are redoing the work manually.&lt;br&gt;
Maybe the feature is technically “working” but not actually helping.&lt;/p&gt;

&lt;p&gt;So I like metrics, but I always want them paired with real qualitative review.&lt;/p&gt;

&lt;h2&gt;
  
  
  My practical rule
&lt;/h2&gt;

&lt;p&gt;When I evaluate an AI feature, I usually come back to one simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If this feature became important to users tomorrow, would I trust the current evaluation process to catch quality problems early?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer is no, the evaluation setup is probably too weak.&lt;/p&gt;

&lt;p&gt;That usually means one of these is missing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;representative test cases&lt;/li&gt;
&lt;li&gt;regression checks&lt;/li&gt;
&lt;li&gt;edge-case coverage&lt;/li&gt;
&lt;li&gt;human review&lt;/li&gt;
&lt;li&gt;real-user feedback loops&lt;/li&gt;
&lt;li&gt;monitoring for drift&lt;/li&gt;
&lt;li&gt;clear definitions of quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Evaluation is not just about measuring the system.&lt;/p&gt;

&lt;p&gt;It is about building confidence that the system can keep improving without quietly breaking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;When building AI features, I do not think evaluation is something you do after the work.&lt;/p&gt;

&lt;p&gt;I think it is part of the work.&lt;/p&gt;

&lt;p&gt;It shapes how you design the system.&lt;br&gt;
It affects how safely you can iterate.&lt;br&gt;
It influences how much trust the product earns.&lt;br&gt;
And it determines whether the feature can survive real-world usage instead of just looking good in a test environment.&lt;/p&gt;

&lt;p&gt;To me, strong AI evaluation means combining engineering discipline with product thinking.&lt;/p&gt;

&lt;p&gt;It means checking correctness, usefulness, consistency, safety, and real user value.&lt;br&gt;
It means using both automated checks and human review.&lt;br&gt;
And it means accepting that quality is something you keep managing, not something you permanently finish.&lt;/p&gt;

&lt;p&gt;That is how I approach evaluation when building AI features.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Closing question for DEV readers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you evaluate AI features, what do you trust more: automated test coverage, human review, or real user feedback after launch?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>testing</category>
      <category>evaluation</category>
    </item>
    <item>
      <title>Why I Insist on Clear Contracts for Robust AI Systems</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Fri, 13 Mar 2026 02:45:31 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/why-i-insist-on-clear-contracts-for-robust-ai-systems-10if</link>
      <guid>https://forem.com/jamie_gray_ai/why-i-insist-on-clear-contracts-for-robust-ai-systems-10if</guid>
      <description>&lt;p&gt;One of the fastest ways to make an AI system fragile is to leave too much undefined.&lt;/p&gt;

&lt;p&gt;Undefined inputs.&lt;br&gt;
Undefined outputs.&lt;br&gt;
Undefined expectations.&lt;br&gt;
Undefined failure behavior.&lt;/p&gt;

&lt;p&gt;That is why I insist on &lt;strong&gt;clear contracts&lt;/strong&gt; when building AI systems.&lt;/p&gt;

&lt;p&gt;A lot of people think contracts are mostly a backend or API concern. They think about them as documentation, schemas, or something engineers add later after the “interesting” AI work is done.&lt;/p&gt;

&lt;p&gt;I see it very differently.&lt;/p&gt;

&lt;p&gt;In AI systems, contracts are one of the most important tools we have for reducing chaos.&lt;/p&gt;

&lt;p&gt;Because the truth is simple: the model is already probabilistic enough.&lt;/p&gt;

&lt;p&gt;If the rest of the system is vague too, reliability drops fast.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I mean by “clear contracts”
&lt;/h2&gt;

&lt;p&gt;When I say “clear contracts,” I do not just mean an API spec.&lt;/p&gt;

&lt;p&gt;I mean every important boundary in the system should be explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what input is accepted&lt;/li&gt;
&lt;li&gt;what shape the output must follow&lt;/li&gt;
&lt;li&gt;what fields are required&lt;/li&gt;
&lt;li&gt;what happens when context is missing&lt;/li&gt;
&lt;li&gt;what errors are possible&lt;/li&gt;
&lt;li&gt;what fallback behavior exists&lt;/li&gt;
&lt;li&gt;what downstream systems can safely assume&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A contract is really an agreement between parts of the system.&lt;/p&gt;

&lt;p&gt;It says:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“If you give me this, I will give you that.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if that agreement is weak, every layer starts making guesses.&lt;/p&gt;

&lt;p&gt;That is when systems become brittle.&lt;/p&gt;
&lt;h2&gt;
  
  
  AI systems get messy faster than normal systems
&lt;/h2&gt;

&lt;p&gt;In traditional software, bad contracts already cause pain.&lt;/p&gt;

&lt;p&gt;In AI systems, they cause even more pain because there is already more uncertainty in the stack.&lt;/p&gt;

&lt;p&gt;You may have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user-generated input&lt;/li&gt;
&lt;li&gt;retrieval context from multiple sources&lt;/li&gt;
&lt;li&gt;prompt construction logic&lt;/li&gt;
&lt;li&gt;one or more model providers&lt;/li&gt;
&lt;li&gt;output parsing&lt;/li&gt;
&lt;li&gt;business rules&lt;/li&gt;
&lt;li&gt;UI rendering&lt;/li&gt;
&lt;li&gt;monitoring and evaluation layers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If even two or three of those layers are loosely defined, bugs become harder to track and failures become harder to contain.&lt;/p&gt;

&lt;p&gt;That is why I care so much about strong boundaries.&lt;/p&gt;

&lt;p&gt;The model should be the only place where limited uncertainty is allowed.&lt;br&gt;
Everything around it should be as disciplined as possible.&lt;/p&gt;
&lt;h2&gt;
  
  
  Weak contracts create hidden bugs
&lt;/h2&gt;

&lt;p&gt;One thing I have learned over time is that weak contracts often do not fail loudly.&lt;/p&gt;

&lt;p&gt;They fail quietly.&lt;/p&gt;

&lt;p&gt;And that is what makes them dangerous.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a missing field gets interpreted as an empty value&lt;/li&gt;
&lt;li&gt;a model response changes format slightly and breaks parsing&lt;/li&gt;
&lt;li&gt;the frontend assumes a value always exists when it does not&lt;/li&gt;
&lt;li&gt;a service sends partial context and no one notices&lt;/li&gt;
&lt;li&gt;a fallback path returns a different structure than the primary path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the kinds of issues that do not always cause immediate crashes.&lt;/p&gt;

&lt;p&gt;Instead, they create inconsistent behavior.&lt;/p&gt;

&lt;p&gt;The product feels unstable.&lt;br&gt;
The team wastes time debugging.&lt;br&gt;
Trust drops.&lt;br&gt;
And everyone starts blaming the model when the real issue is poor system discipline.&lt;/p&gt;

&lt;p&gt;That is why I would rather define contracts early than debug ambiguous behavior later.&lt;/p&gt;
&lt;h2&gt;
  
  
  Clear contracts make AI systems easier to trust
&lt;/h2&gt;

&lt;p&gt;Trust is a huge part of AI product design.&lt;/p&gt;

&lt;p&gt;Users do not trust a system because it sounds smart.&lt;/p&gt;

&lt;p&gt;They trust it because it behaves in a way that feels consistent and understandable.&lt;/p&gt;

&lt;p&gt;Strong contracts help create that experience.&lt;/p&gt;

&lt;p&gt;If the system has well-defined inputs and outputs, it becomes easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validate data before processing&lt;/li&gt;
&lt;li&gt;reject malformed requests&lt;/li&gt;
&lt;li&gt;keep UI behavior consistent&lt;/li&gt;
&lt;li&gt;apply fallback logic safely&lt;/li&gt;
&lt;li&gt;measure quality over time&lt;/li&gt;
&lt;li&gt;trace failures back to specific layers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that improves reliability.&lt;/p&gt;

&lt;p&gt;And reliability is what users experience as trust.&lt;/p&gt;
&lt;h2&gt;
  
  
  Contracts protect teams too
&lt;/h2&gt;

&lt;p&gt;I think engineers sometimes talk about contracts only in technical terms, but they also help teams collaborate better.&lt;/p&gt;

&lt;p&gt;When contracts are clear, people do not have to guess what another service or component is supposed to do.&lt;/p&gt;

&lt;p&gt;That helps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backend engineers&lt;/li&gt;
&lt;li&gt;frontend engineers&lt;/li&gt;
&lt;li&gt;ML engineers&lt;/li&gt;
&lt;li&gt;product teams&lt;/li&gt;
&lt;li&gt;QA teams&lt;/li&gt;
&lt;li&gt;platform teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clear contracts reduce coordination overhead.&lt;/p&gt;

&lt;p&gt;They make integration faster.&lt;br&gt;
They make reviews clearer.&lt;br&gt;
They make debugging less emotional because people can inspect behavior against a known agreement instead of arguing from assumptions.&lt;/p&gt;

&lt;p&gt;That matters even more in AI products, where multiple disciplines usually need to work closely together.&lt;/p&gt;
&lt;h2&gt;
  
  
  I want inputs to be strict, not “flexible”
&lt;/h2&gt;

&lt;p&gt;A common mistake in early AI systems is trying to make inputs too flexible.&lt;/p&gt;

&lt;p&gt;The thinking usually sounds like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“The model is smart. It can figure it out.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes it can.&lt;/p&gt;

&lt;p&gt;But that does not mean the system should rely on that.&lt;/p&gt;

&lt;p&gt;I would much rather define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required fields&lt;/li&gt;
&lt;li&gt;allowed types&lt;/li&gt;
&lt;li&gt;size limits&lt;/li&gt;
&lt;li&gt;optional vs mandatory context&lt;/li&gt;
&lt;li&gt;accepted enum values&lt;/li&gt;
&lt;li&gt;clear validation errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strict inputs are not a limitation.&lt;/p&gt;

&lt;p&gt;They are protection.&lt;/p&gt;

&lt;p&gt;They reduce noisy requests.&lt;br&gt;
They improve consistency.&lt;br&gt;
They make failures easier to understand.&lt;br&gt;
And they stop the model from wasting effort dealing with avoidable mess.&lt;/p&gt;

&lt;p&gt;In my experience, flexible inputs often feel convenient at first and expensive later.&lt;/p&gt;
&lt;h2&gt;
  
  
  Output contracts are even more important
&lt;/h2&gt;

&lt;p&gt;If an AI system produces output that is going to be read by another part of the product, then output contracts matter even more than input contracts.&lt;/p&gt;

&lt;p&gt;This is where a lot of systems become fragile.&lt;/p&gt;

&lt;p&gt;The model returns something “close enough.”&lt;br&gt;
Then parsing logic tries to interpret it.&lt;br&gt;
Then downstream systems assume the result is valid.&lt;br&gt;
Then edge cases start breaking everything.&lt;/p&gt;

&lt;p&gt;That is why I strongly prefer structured outputs whenever possible.&lt;/p&gt;

&lt;p&gt;For example, instead of treating the response as a loose paragraph, I want something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AIResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AIResult&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;AIResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does a few important things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;makes the output predictable&lt;/li&gt;
&lt;li&gt;prevents malformed data from spreading&lt;/li&gt;
&lt;li&gt;simplifies downstream code&lt;/li&gt;
&lt;li&gt;makes monitoring easier&lt;/li&gt;
&lt;li&gt;makes fallback behavior easier to implement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A strong output contract turns a fuzzy model response into something the product can safely use.&lt;/p&gt;

&lt;p&gt;That is a big difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contracts make failure handling better
&lt;/h2&gt;

&lt;p&gt;Another reason I insist on clear contracts is that they make failure behavior much more intentional.&lt;/p&gt;

&lt;p&gt;Without clear contracts, failure handling often becomes random.&lt;/p&gt;

&lt;p&gt;One endpoint returns &lt;code&gt;null&lt;/code&gt;.&lt;br&gt;
Another returns a partial response.&lt;br&gt;
Another returns plain text.&lt;br&gt;
Another silently retries.&lt;br&gt;
Another sends an error the frontend cannot interpret.&lt;/p&gt;

&lt;p&gt;That kind of inconsistency is painful.&lt;/p&gt;

&lt;p&gt;A better system defines failure behavior as part of the contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what errors are expected&lt;/li&gt;
&lt;li&gt;what error shape is returned&lt;/li&gt;
&lt;li&gt;when fallbacks are used&lt;/li&gt;
&lt;li&gt;when retries happen&lt;/li&gt;
&lt;li&gt;what the user sees&lt;/li&gt;
&lt;li&gt;what gets logged for investigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the whole application feel more stable.&lt;/p&gt;

&lt;p&gt;Users may accept a limitation.&lt;br&gt;
They rarely accept confusing behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contracts help you change systems safely
&lt;/h2&gt;

&lt;p&gt;AI systems evolve quickly.&lt;/p&gt;

&lt;p&gt;Prompts change.&lt;br&gt;
Providers change.&lt;br&gt;
Models change.&lt;br&gt;
Retrieval logic changes.&lt;br&gt;
Business rules change.&lt;/p&gt;

&lt;p&gt;That is exactly why contracts matter so much.&lt;/p&gt;

&lt;p&gt;When the inside of the system changes, the boundaries around it should stay stable whenever possible.&lt;/p&gt;

&lt;p&gt;That way, you can improve the implementation without constantly breaking everything connected to it.&lt;/p&gt;

&lt;p&gt;This is one of the biggest advantages of good contracts:&lt;/p&gt;

&lt;p&gt;they let you move faster &lt;strong&gt;without spreading instability everywhere&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To me, that is one of the best signs of strong engineering.&lt;/p&gt;

&lt;p&gt;Not just speed.&lt;br&gt;
Not just flexibility.&lt;br&gt;
But controlled change.&lt;/p&gt;

&lt;h2&gt;
  
  
  My rule of thumb
&lt;/h2&gt;

&lt;p&gt;Whenever I look at an AI system, I usually ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where are the assumptions hiding?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of the time, those hidden assumptions point directly to weak contracts.&lt;/p&gt;

&lt;p&gt;Maybe one service assumes a field is always present.&lt;br&gt;
Maybe the frontend assumes a confidence score always exists.&lt;br&gt;
Maybe the parser assumes the model always follows the same format.&lt;br&gt;
Maybe the monitoring layer assumes every successful request is a good request.&lt;/p&gt;

&lt;p&gt;These assumptions are where fragile behavior starts.&lt;/p&gt;

&lt;p&gt;So I try to make them explicit.&lt;/p&gt;

&lt;p&gt;If a system depends on something, I want that dependency defined.&lt;br&gt;
Not implied.&lt;br&gt;
Not guessed.&lt;br&gt;
Not “usually true.”&lt;/p&gt;

&lt;p&gt;Defined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;I insist on clear contracts for robust AI systems because contracts create clarity, and clarity creates reliability.&lt;/p&gt;

&lt;p&gt;They reduce ambiguity.&lt;br&gt;
They protect downstream systems.&lt;br&gt;
They make debugging easier.&lt;br&gt;
They improve team coordination.&lt;br&gt;
They make user experience more stable.&lt;br&gt;
And they make it possible to evolve AI products without turning every change into a risk.&lt;/p&gt;

&lt;p&gt;Models can be flexible.&lt;/p&gt;

&lt;p&gt;System design should not be.&lt;/p&gt;

&lt;p&gt;That is why I keep coming back to the same idea:&lt;/p&gt;

&lt;p&gt;if you want AI systems to feel dependable, the boundaries between components need to be stronger than the uncertainty inside the model.&lt;/p&gt;

&lt;p&gt;And clear contracts are one of the best ways to make that happen.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Closing question for DEV readers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do you think the most fragile part of AI systems is usually the model itself, or the unclear assumptions between the layers around it?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>backend</category>
      <category>api</category>
      <category>software</category>
    </item>
    <item>
      <title>How I Think About Reliability in LLM Applications</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Thu, 12 Mar 2026 01:25:21 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/how-i-think-about-reliability-in-llm-applications-2ocp</link>
      <guid>https://forem.com/jamie_gray_ai/how-i-think-about-reliability-in-llm-applications-2ocp</guid>
      <description>&lt;p&gt;A lot of people evaluate LLM applications by asking one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Does it give a good answer?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That matters, of course.&lt;/p&gt;

&lt;p&gt;But once you start shipping LLM-powered features to real users, a different question becomes much more important:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Can this system be trusted to behave well over time?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is how I think about reliability in LLM applications.&lt;/p&gt;

&lt;p&gt;Reliability is not just about uptime. It is not just about whether the model provider is available. And it is definitely not just about whether the prompt worked on your favorite test case.&lt;/p&gt;

&lt;p&gt;Reliability is about whether the full system can consistently produce useful outcomes in the messy conditions of real product usage.&lt;/p&gt;

&lt;p&gt;That means handling weak inputs, inconsistent context, variable model behavior, latency spikes, provider issues, partial failures, and changing user expectations without turning the feature into a trust problem.&lt;/p&gt;

&lt;p&gt;In my experience, that is where most of the real engineering work lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability starts before the model call
&lt;/h2&gt;

&lt;p&gt;One of the easiest mistakes in LLM product work is thinking that reliability begins at inference time.&lt;/p&gt;

&lt;p&gt;It does not.&lt;/p&gt;

&lt;p&gt;It starts much earlier.&lt;/p&gt;

&lt;p&gt;Before a model ever sees a request, the system should already be doing important work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validating inputs&lt;/li&gt;
&lt;li&gt;normalizing structure&lt;/li&gt;
&lt;li&gt;checking required context&lt;/li&gt;
&lt;li&gt;trimming unnecessary noise&lt;/li&gt;
&lt;li&gt;routing the request correctly&lt;/li&gt;
&lt;li&gt;enforcing limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this layer is weak, the model ends up absorbing too much chaos.&lt;/p&gt;

&lt;p&gt;And that usually leads to one of two bad outcomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the model produces low-quality output&lt;/li&gt;
&lt;li&gt;the system produces inconsistent behavior that is hard to debug&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I want the model to solve the right problem, not waste effort compensating for sloppy application design.&lt;/p&gt;

&lt;p&gt;That is why I think of pre-processing as part of reliability engineering, not just convenience.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Usually works” is not reliable enough
&lt;/h2&gt;

&lt;p&gt;A lot of LLM systems feel good in internal testing because they work most of the time.&lt;/p&gt;

&lt;p&gt;But “most of the time” is not a strong standard once real users depend on the feature.&lt;/p&gt;

&lt;p&gt;Users remember the moments when the system feels unreliable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when it ignores important context&lt;/li&gt;
&lt;li&gt;when it returns a badly structured answer&lt;/li&gt;
&lt;li&gt;when it times out&lt;/li&gt;
&lt;li&gt;when it confidently says something weak&lt;/li&gt;
&lt;li&gt;when it behaves differently for similar inputs&lt;/li&gt;
&lt;li&gt;when the UI does not know how to handle the response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why I care less about best-case output and more about consistency.&lt;/p&gt;

&lt;p&gt;A reliable LLM application should not just be capable of producing a good answer.&lt;/p&gt;

&lt;p&gt;It should be engineered to reduce the chance of bad outcomes and contain the damage when they happen.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it changes how you design the whole stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  I separate model quality from system reliability
&lt;/h2&gt;

&lt;p&gt;This distinction matters a lot.&lt;/p&gt;

&lt;p&gt;A model can be strong while the application around it is unreliable.&lt;/p&gt;

&lt;p&gt;Likewise, a model can be imperfect while the product still feels dependable because the surrounding system is well designed.&lt;/p&gt;

&lt;p&gt;For me, model quality is about things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relevance&lt;/li&gt;
&lt;li&gt;reasoning quality&lt;/li&gt;
&lt;li&gt;factual alignment&lt;/li&gt;
&lt;li&gt;formatting quality&lt;/li&gt;
&lt;li&gt;task completion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;System reliability is about things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request success rate&lt;/li&gt;
&lt;li&gt;latency stability&lt;/li&gt;
&lt;li&gt;validation behavior&lt;/li&gt;
&lt;li&gt;fallback handling&lt;/li&gt;
&lt;li&gt;error containment&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;repeatability of output shape&lt;/li&gt;
&lt;li&gt;resilience under bad inputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These two areas affect each other, but they are not the same.&lt;/p&gt;

&lt;p&gt;A lot of teams blur them together, and that makes debugging much harder.&lt;/p&gt;

&lt;p&gt;If the product feels unstable, I want to be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the issue in retrieval?&lt;/li&gt;
&lt;li&gt;Is the issue in prompt construction?&lt;/li&gt;
&lt;li&gt;Is the issue in provider latency?&lt;/li&gt;
&lt;li&gt;Is the issue in output parsing?&lt;/li&gt;
&lt;li&gt;Is the issue in business logic after the model call?&lt;/li&gt;
&lt;li&gt;Is the issue in the frontend contract?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That level of clarity is critical if you want to improve a production LLM system instead of just guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured output makes reliability much easier
&lt;/h2&gt;

&lt;p&gt;One of my strongest opinions in applied AI is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If an LLM response needs to drive product behavior, it should be structured whenever possible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free-form text is flexible, but flexibility creates risk when the output feeds other parts of the system.&lt;/p&gt;

&lt;p&gt;If the response is going to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;populate a UI&lt;/li&gt;
&lt;li&gt;trigger a workflow&lt;/li&gt;
&lt;li&gt;update a database&lt;/li&gt;
&lt;li&gt;drive automation&lt;/li&gt;
&lt;li&gt;affect downstream decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then the system needs predictable shape.&lt;/p&gt;

&lt;p&gt;That usually means defining a schema and validating the response against it.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DecisionResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;explanation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;DecisionResult&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;DecisionResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This kind of pattern adds reliability in several ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;malformed responses are caught early&lt;/li&gt;
&lt;li&gt;downstream code becomes simpler&lt;/li&gt;
&lt;li&gt;failure states become explicit&lt;/li&gt;
&lt;li&gt;monitoring becomes clearer&lt;/li&gt;
&lt;li&gt;fallback logic becomes easier to implement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model may still be probabilistic, but the system around it becomes more disciplined.&lt;/p&gt;

&lt;p&gt;That is a big win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fallbacks are a core reliability feature
&lt;/h2&gt;

&lt;p&gt;I do not see fallback paths as optional polish.&lt;/p&gt;

&lt;p&gt;I see them as part of the product contract.&lt;/p&gt;

&lt;p&gt;If the AI path fails, the product should still behave in a controlled way.&lt;/p&gt;

&lt;p&gt;Depending on the feature, that might mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrying the request&lt;/li&gt;
&lt;li&gt;returning a cached result&lt;/li&gt;
&lt;li&gt;switching to a smaller or faster model&lt;/li&gt;
&lt;li&gt;using a rules-based path for simple cases&lt;/li&gt;
&lt;li&gt;showing a limited but safe response&lt;/li&gt;
&lt;li&gt;asking the user for clearer input&lt;/li&gt;
&lt;li&gt;returning a transparent failure state instead of weak output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A fallback is not an admission that the AI failed.&lt;/p&gt;

&lt;p&gt;It is evidence that the system was designed responsibly.&lt;/p&gt;

&lt;p&gt;In fact, I trust LLM products more when they clearly show that the team expected imperfect conditions and designed around them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Latency is part of reliability
&lt;/h2&gt;

&lt;p&gt;This is something AI teams sometimes underestimate.&lt;/p&gt;

&lt;p&gt;If an application technically works but feels slow and unpredictable, users often experience it as unreliable.&lt;/p&gt;

&lt;p&gt;That is why I treat latency as part of reliability, not just performance.&lt;/p&gt;

&lt;p&gt;For every LLM feature, I want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what response time users will tolerate&lt;/li&gt;
&lt;li&gt;whether the task should be synchronous or asynchronous&lt;/li&gt;
&lt;li&gt;whether partial streaming would improve experience&lt;/li&gt;
&lt;li&gt;whether caching makes sense&lt;/li&gt;
&lt;li&gt;what happens when a provider becomes slow&lt;/li&gt;
&lt;li&gt;how the product behaves near timeout thresholds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A feature that returns strong results in 12 seconds may still feel worse than a feature that returns good-enough results in 2 seconds.&lt;/p&gt;

&lt;p&gt;Reliability is not just about correctness.&lt;br&gt;&lt;br&gt;
It is also about dependable experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring needs to go beyond errors
&lt;/h2&gt;

&lt;p&gt;Traditional backend monitoring is necessary, but it is not enough for LLM systems.&lt;/p&gt;

&lt;p&gt;A request can succeed technically and still fail from a product perspective.&lt;/p&gt;

&lt;p&gt;That means I want visibility into more than uptime and exceptions.&lt;/p&gt;

&lt;p&gt;I care about things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;malformed output rate&lt;/li&gt;
&lt;li&gt;fallback rate&lt;/li&gt;
&lt;li&gt;validation failure rate&lt;/li&gt;
&lt;li&gt;latency distribution&lt;/li&gt;
&lt;li&gt;token usage patterns&lt;/li&gt;
&lt;li&gt;low-confidence outcomes&lt;/li&gt;
&lt;li&gt;retrieval misses&lt;/li&gt;
&lt;li&gt;prompt version changes&lt;/li&gt;
&lt;li&gt;user correction patterns&lt;/li&gt;
&lt;li&gt;output quality drift over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that kind of visibility, it is very easy to assume the system is healthy when it is actually degrading in subtle ways.&lt;/p&gt;

&lt;p&gt;For LLM applications, “no crash” is a very weak health signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability improves when responsibilities are clear
&lt;/h2&gt;

&lt;p&gt;As systems grow, I find reliability gets much better when each layer has a narrow responsibility.&lt;/p&gt;

&lt;p&gt;A healthy LLM request path often looks something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;accept and validate request&lt;/li&gt;
&lt;li&gt;normalize input&lt;/li&gt;
&lt;li&gt;gather trusted context&lt;/li&gt;
&lt;li&gt;assemble prompt in a predictable format&lt;/li&gt;
&lt;li&gt;call model provider&lt;/li&gt;
&lt;li&gt;validate response shape&lt;/li&gt;
&lt;li&gt;apply business rules&lt;/li&gt;
&lt;li&gt;return structured result&lt;/li&gt;
&lt;li&gt;log the full path&lt;/li&gt;
&lt;li&gt;route failures to fallback logic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This flow is not exciting, but that is exactly why it works.&lt;/p&gt;

&lt;p&gt;The more explicit the boundaries are, the easier it becomes to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debug failures&lt;/li&gt;
&lt;li&gt;swap providers&lt;/li&gt;
&lt;li&gt;improve retrieval&lt;/li&gt;
&lt;li&gt;test edge cases&lt;/li&gt;
&lt;li&gt;observe regressions&lt;/li&gt;
&lt;li&gt;maintain the product over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unclear boundaries create unreliable systems.&lt;/p&gt;

&lt;p&gt;Clear boundaries create systems that can evolve without constant fear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability is also a UX decision
&lt;/h2&gt;

&lt;p&gt;I think engineers sometimes talk about reliability as if it lives only in backend architecture.&lt;/p&gt;

&lt;p&gt;But a lot of reliability is really about user experience.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the user know what the feature is supposed to do?&lt;/li&gt;
&lt;li&gt;Does the product make confidence visible when appropriate?&lt;/li&gt;
&lt;li&gt;Does it avoid pretending to know more than it knows?&lt;/li&gt;
&lt;li&gt;Does it recover gracefully when a request fails?&lt;/li&gt;
&lt;li&gt;Does it set the right expectations about timing and behavior?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A feature can be technically sophisticated and still feel unreliable if the UX creates false confidence or hides system limits.&lt;/p&gt;

&lt;p&gt;That is why I think product design and engineering discipline have to work together in AI applications.&lt;/p&gt;

&lt;p&gt;The most reliable systems are usually the ones that align model behavior, system constraints, and user expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  My rule of thumb
&lt;/h2&gt;

&lt;p&gt;When I look at an LLM application, I usually ask a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If this feature becomes important to users tomorrow, would I trust the current system design to hold up?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer is no, the issue is usually not the model alone.&lt;/p&gt;

&lt;p&gt;It is usually one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;weak contracts&lt;/li&gt;
&lt;li&gt;weak validation&lt;/li&gt;
&lt;li&gt;weak observability&lt;/li&gt;
&lt;li&gt;weak fallback design&lt;/li&gt;
&lt;li&gt;weak latency planning&lt;/li&gt;
&lt;li&gt;weak separation of responsibilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why I think reliability in LLM applications is mostly a systems problem.&lt;/p&gt;

&lt;p&gt;The model matters.&lt;br&gt;&lt;br&gt;
But the surrounding engineering matters just as much, and often more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Reliable LLM applications are not built by hoping the model behaves well.&lt;/p&gt;

&lt;p&gt;They are built by designing systems that reduce uncertainty, constrain risk, and recover gracefully when imperfect things happen.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear inputs&lt;/li&gt;
&lt;li&gt;structured outputs&lt;/li&gt;
&lt;li&gt;strong validation&lt;/li&gt;
&lt;li&gt;careful monitoring&lt;/li&gt;
&lt;li&gt;fallback paths&lt;/li&gt;
&lt;li&gt;thoughtful UX&lt;/li&gt;
&lt;li&gt;disciplined architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To me, that is what separates an AI demo from a real product.&lt;/p&gt;

&lt;p&gt;A demo proves a model can do something interesting.&lt;/p&gt;

&lt;p&gt;A reliable application proves users can depend on it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Closing question for DEV readers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What do you think contributes most to reliability in LLM applications: structured output, fallback design, monitoring, or better UX around model behavior?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>softwareengineering</category>
      <category>backend</category>
    </item>
    <item>
      <title>What Building AI in Healthcare Taught Me About Engineering Discipline</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Tue, 10 Mar 2026 19:16:03 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/what-building-ai-in-healthcare-taught-me-about-engineering-discipline-4367</link>
      <guid>https://forem.com/jamie_gray_ai/what-building-ai-in-healthcare-taught-me-about-engineering-discipline-4367</guid>
      <description>&lt;p&gt;When people talk about AI, the conversation usually goes straight to model quality, prompt design, or the latest tooling.&lt;/p&gt;

&lt;p&gt;But building AI in healthcare changes your perspective very quickly.&lt;/p&gt;

&lt;p&gt;In healthcare, you do not get to treat software as “mostly fine.” You cannot hide behind a good demo, a clever prototype, or a model that performs well on average. The standard is different. Systems need to be reliable, understandable, and disciplined because the environment itself leaves very little room for ambiguity.&lt;/p&gt;

&lt;p&gt;That is one of the biggest lessons I took away from working on AI systems in healthcare-related environments.&lt;/p&gt;

&lt;p&gt;It was not just a lesson about compliance or process. It was a lesson about engineering discipline.&lt;/p&gt;

&lt;p&gt;And honestly, I think it made me a better engineer overall.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. “Good enough” stops being a comfortable mindset
&lt;/h2&gt;

&lt;p&gt;In a lot of software environments, teams can move fast, release early, and improve through feedback. That approach is often the right one.&lt;/p&gt;

&lt;p&gt;But healthcare forces you to think much more carefully about what “good enough” really means.&lt;/p&gt;

&lt;p&gt;If your product touches sensitive workflows, patient-related data, or any kind of clinical context, sloppy assumptions become expensive very quickly. A vague output, a weak edge-case path, or poor traceability is not just a technical inconvenience. It becomes a trust problem.&lt;/p&gt;

&lt;p&gt;That changes how you build.&lt;/p&gt;

&lt;p&gt;You start asking better questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exactly is this system supposed to do?&lt;/li&gt;
&lt;li&gt;Where can it fail?&lt;/li&gt;
&lt;li&gt;How do we know when it fails?&lt;/li&gt;
&lt;li&gt;What does the user see when confidence is low?&lt;/li&gt;
&lt;li&gt;Can we explain the result?&lt;/li&gt;
&lt;li&gt;Can we audit the path that produced it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That kind of thinking is valuable everywhere, but healthcare makes it unavoidable.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Reliability matters more than novelty
&lt;/h2&gt;

&lt;p&gt;One of the easiest traps in AI is chasing impressive output.&lt;/p&gt;

&lt;p&gt;A system can look exciting in a controlled demo and still be weak in practice. It might handle the happy path beautifully but struggle with inconsistent inputs, poor data quality, missing context, or workflow friction.&lt;/p&gt;

&lt;p&gt;Healthcare taught me to care much more about dependable behavior than flashy behavior.&lt;/p&gt;

&lt;p&gt;That means I pay close attention to things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validation before any AI step&lt;/li&gt;
&lt;li&gt;well-defined input and output contracts&lt;/li&gt;
&lt;li&gt;fallback behavior&lt;/li&gt;
&lt;li&gt;clear failure states&lt;/li&gt;
&lt;li&gt;predictable latency&lt;/li&gt;
&lt;li&gt;monitoring around the full workflow&lt;/li&gt;
&lt;li&gt;human-readable logs and audit trails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of those things are glamorous. But together, they are what make a system usable in the real world.&lt;/p&gt;

&lt;p&gt;A product becomes valuable when people can rely on it repeatedly, not when it produces one amazing example in a meeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sensitive domains punish vague system design
&lt;/h2&gt;

&lt;p&gt;AI systems already contain uncertainty because model behavior is probabilistic.&lt;/p&gt;

&lt;p&gt;So if the rest of the application is also vague, things get messy fast.&lt;/p&gt;

&lt;p&gt;Healthcare pushed me toward more structured system design. I became much more careful about defining boundaries between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data ingestion&lt;/li&gt;
&lt;li&gt;preprocessing&lt;/li&gt;
&lt;li&gt;model or rules-based logic&lt;/li&gt;
&lt;li&gt;post-processing&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;storage&lt;/li&gt;
&lt;li&gt;user-facing presentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation matters because when something goes wrong, you need to know where it went wrong.&lt;/p&gt;

&lt;p&gt;If everything is mixed together, debugging becomes painful. Observability becomes weak. Auditing becomes harder. And trust drops.&lt;/p&gt;

&lt;p&gt;In practice, disciplined engineering often means making the system a little more boring in the best possible way.&lt;/p&gt;

&lt;p&gt;It means fewer hidden assumptions.&lt;br&gt;
More explicit contracts.&lt;br&gt;
Cleaner service boundaries.&lt;br&gt;
Less magic.&lt;/p&gt;

&lt;p&gt;That is especially important in AI products, where the model itself already introduces enough variability.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Trust is not a “nice to have” feature
&lt;/h2&gt;

&lt;p&gt;One thing I think engineers sometimes underestimate is how much trust is part of product quality.&lt;/p&gt;

&lt;p&gt;In healthcare, trust is not built by branding or UI polish alone. It is built by system behavior.&lt;/p&gt;

&lt;p&gt;Users trust products that feel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistent&lt;/li&gt;
&lt;li&gt;transparent&lt;/li&gt;
&lt;li&gt;stable&lt;/li&gt;
&lt;li&gt;understandable&lt;/li&gt;
&lt;li&gt;recoverable when something goes wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That affects technical decisions more than people realize.&lt;/p&gt;

&lt;p&gt;For example, sometimes the right engineering decision is not to maximize model flexibility. Sometimes it is to constrain the output, add stronger validation, or reduce the feature scope so the user experience becomes more predictable.&lt;/p&gt;

&lt;p&gt;That might sound less ambitious, but in practice it often produces a better product.&lt;/p&gt;

&lt;p&gt;A smaller, clearer, more dependable AI feature is usually more valuable than a broader feature that behaves inconsistently.&lt;/p&gt;

&lt;p&gt;Healthcare made that tradeoff feel obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Data quality is a product concern, not just a pipeline concern
&lt;/h2&gt;

&lt;p&gt;Another major lesson: bad data does not stay in the data layer.&lt;/p&gt;

&lt;p&gt;It shows up everywhere.&lt;/p&gt;

&lt;p&gt;It affects model quality, retrieval quality, downstream logic, user trust, and operational load. In healthcare-related systems, where data may come from multiple sources and vary in structure or quality, this becomes very visible.&lt;/p&gt;

&lt;p&gt;That is why engineering discipline cannot stop at the model layer.&lt;/p&gt;

&lt;p&gt;You need discipline in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;schema design&lt;/li&gt;
&lt;li&gt;ingestion pipelines&lt;/li&gt;
&lt;li&gt;normalization logic&lt;/li&gt;
&lt;li&gt;validation rules&lt;/li&gt;
&lt;li&gt;metadata handling&lt;/li&gt;
&lt;li&gt;storage decisions&lt;/li&gt;
&lt;li&gt;monitoring for drift or inconsistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of AI issues that look like “model problems” are really system design problems upstream.&lt;/p&gt;

&lt;p&gt;Once you work in an environment where the stakes are higher, that becomes easier to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Auditability changes how you think
&lt;/h2&gt;

&lt;p&gt;One of the healthiest engineering habits I picked up from healthcare-related work was thinking more carefully about traceability.&lt;/p&gt;

&lt;p&gt;If a system produces a result, can you answer basic questions later?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What input was used?&lt;/li&gt;
&lt;li&gt;What context was retrieved?&lt;/li&gt;
&lt;li&gt;Which rules or model path ran?&lt;/li&gt;
&lt;li&gt;What output was generated?&lt;/li&gt;
&lt;li&gt;What was shown to the user?&lt;/li&gt;
&lt;li&gt;What version of the system handled the request?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions matter a lot in sensitive environments, but they also matter in normal product engineering.&lt;/p&gt;

&lt;p&gt;Auditability makes systems easier to debug.&lt;br&gt;
It makes incident response faster.&lt;br&gt;
It makes quality reviews more grounded.&lt;br&gt;
It makes teams less dependent on memory and guesswork.&lt;/p&gt;

&lt;p&gt;In other words, it turns engineering from intuition-driven to evidence-driven.&lt;/p&gt;

&lt;p&gt;That is a huge shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Guardrails are part of product design
&lt;/h2&gt;

&lt;p&gt;Before working closely on AI systems in more sensitive domains, I think I saw guardrails mostly as a safety layer.&lt;/p&gt;

&lt;p&gt;Now I see them as part of product design.&lt;/p&gt;

&lt;p&gt;Guardrails are not just about preventing disaster. They are about shaping the behavior of the product so it remains useful, understandable, and aligned with user expectations.&lt;/p&gt;

&lt;p&gt;That can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input constraints&lt;/li&gt;
&lt;li&gt;output schema validation&lt;/li&gt;
&lt;li&gt;confidence thresholds&lt;/li&gt;
&lt;li&gt;fallback responses&lt;/li&gt;
&lt;li&gt;role-based access patterns&lt;/li&gt;
&lt;li&gt;content restrictions&lt;/li&gt;
&lt;li&gt;review workflows for certain actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These choices define the real experience of the product.&lt;/p&gt;

&lt;p&gt;In healthcare, this mindset becomes natural because the cost of ambiguity is more obvious. But I think it applies to nearly every serious AI product.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Speed still matters — but reckless speed hurts more
&lt;/h2&gt;

&lt;p&gt;Working in healthcare does &lt;strong&gt;not&lt;/strong&gt; mean moving slowly by default.&lt;/p&gt;

&lt;p&gt;It means being intentional about where speed is safe and where discipline is non-negotiable.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;You can still move quickly in architecture, iteration, and delivery if you are building on strong foundations. In fact, disciplined systems often let you move faster later because they are easier to reason about.&lt;/p&gt;

&lt;p&gt;I have seen the opposite too: teams move fast early, skip structure, and then lose months later untangling fragile workflows, poor validation, weak logging, and unclear responsibilities between components.&lt;/p&gt;

&lt;p&gt;Healthcare taught me that speed is only useful when it compounds.&lt;/p&gt;

&lt;p&gt;And discipline is what allows speed to compound.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. AI does not remove the need for strong engineering
&lt;/h2&gt;

&lt;p&gt;If anything, it increases it.&lt;/p&gt;

&lt;p&gt;When a system includes probabilistic behavior, the surrounding software needs to be even more deliberate.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better contracts&lt;/li&gt;
&lt;li&gt;better observability&lt;/li&gt;
&lt;li&gt;better evaluation&lt;/li&gt;
&lt;li&gt;better fallback paths&lt;/li&gt;
&lt;li&gt;better user-facing clarity&lt;/li&gt;
&lt;li&gt;better system boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model is only one piece of the product.&lt;/p&gt;

&lt;p&gt;I think that is one of the biggest misconceptions in AI discussions today. People talk as if model capability is the main differentiator.&lt;/p&gt;

&lt;p&gt;In real products, especially in high-trust environments, engineering quality is often the real differentiator.&lt;/p&gt;

&lt;p&gt;The teams that win are usually the teams that can make AI capabilities dependable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Building AI in healthcare taught me that engineering discipline is not bureaucracy.&lt;/p&gt;

&lt;p&gt;It is not unnecessary caution.&lt;br&gt;
It is not the opposite of innovation.&lt;/p&gt;

&lt;p&gt;It is what makes innovation usable.&lt;/p&gt;

&lt;p&gt;It is what turns a promising model into a reliable product.&lt;br&gt;
It is what protects user trust.&lt;br&gt;
It is what helps teams scale without losing clarity.&lt;br&gt;
And it is what makes systems hold up when real people start depending on them.&lt;/p&gt;

&lt;p&gt;That lesson has stayed with me far beyond healthcare.&lt;/p&gt;

&lt;p&gt;Because once you learn to build in an environment where trust, traceability, and reliability truly matter, it becomes hard to go back to casual engineering habits.&lt;/p&gt;

&lt;p&gt;And I think that is a good thing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Closing question for DEV readers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Has working in a high-trust or highly regulated environment changed the way you think about software quality?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>healthcare</category>
      <category>softwareengineering</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Why FastAPI Is a Great Fit for AI Products</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Fri, 06 Mar 2026 21:13:46 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/why-fastapi-is-a-great-fit-for-ai-products-1on6</link>
      <guid>https://forem.com/jamie_gray_ai/why-fastapi-is-a-great-fit-for-ai-products-1on6</guid>
      <description>&lt;p&gt;A lot of AI product discussions focus on models, prompts, and retrieval.&lt;/p&gt;

&lt;p&gt;But once you start building real features, the backend matters just as much as the model.&lt;/p&gt;

&lt;p&gt;You still need clean APIs, input validation, error handling, observability, authentication, background jobs, and predictable response shapes. In other words, you need the same software engineering discipline as any other production system, with even more attention to reliability because AI behavior is already probabilistic by nature.&lt;/p&gt;

&lt;p&gt;That is one reason I keep coming back to &lt;strong&gt;FastAPI&lt;/strong&gt; when building AI products.&lt;/p&gt;

&lt;p&gt;It is not the only good option in Python, and it will not solve architecture problems for you. But if you are building AI-powered APIs, internal ML services, evaluation tools, or product backends that need to expose model-driven capabilities, FastAPI gives you a lot of useful structure without a lot of unnecessary weight.&lt;/p&gt;

&lt;p&gt;In this post, I want to break down why FastAPI works so well for AI applications and where I think it really shines.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. AI products need clear contracts
&lt;/h2&gt;

&lt;p&gt;One of the biggest backend challenges in AI systems is dealing with uncertainty.&lt;/p&gt;

&lt;p&gt;Your model output may vary. Your retrieval results may vary. Your latency may vary. The last thing you want is for your API layer to add even more ambiguity.&lt;/p&gt;

&lt;p&gt;That is where FastAPI helps immediately.&lt;/p&gt;

&lt;p&gt;Its request and response models make it easy to define strict contracts around inputs and outputs. That becomes very important when you are exposing AI features to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend applications&lt;/li&gt;
&lt;li&gt;internal services&lt;/li&gt;
&lt;li&gt;external customers&lt;/li&gt;
&lt;li&gt;automation pipelines&lt;/li&gt;
&lt;li&gt;evaluation workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if the model is probabilistic, your API should still be predictable.&lt;/p&gt;

&lt;p&gt;With FastAPI, you can define schemas that make your service behavior explicit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PromptRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PromptResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PromptRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;PromptResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That level of structure is simple, but it matters a lot.&lt;/p&gt;

&lt;p&gt;It means the rest of your stack does not need to guess what the AI backend will return.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Validation is especially important in AI systems
&lt;/h2&gt;

&lt;p&gt;In a traditional backend, validation protects your application from bad inputs.&lt;/p&gt;

&lt;p&gt;In an AI backend, validation protects both your application and your model usage.&lt;/p&gt;

&lt;p&gt;That matters because AI requests often include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;long text inputs&lt;/li&gt;
&lt;li&gt;optional context blocks&lt;/li&gt;
&lt;li&gt;file metadata&lt;/li&gt;
&lt;li&gt;user configuration parameters&lt;/li&gt;
&lt;li&gt;model-specific settings&lt;/li&gt;
&lt;li&gt;workflow state from previous steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without strong validation, it becomes easy to waste tokens, trigger bad outputs, or break downstream logic.&lt;/p&gt;

&lt;p&gt;FastAPI makes validation feel natural instead of bolted on.&lt;/p&gt;

&lt;p&gt;I like that because it encourages better engineering habits by default.&lt;/p&gt;

&lt;p&gt;For example, you can validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required fields&lt;/li&gt;
&lt;li&gt;type correctness&lt;/li&gt;
&lt;li&gt;input length limits&lt;/li&gt;
&lt;li&gt;allowed enum values&lt;/li&gt;
&lt;li&gt;optional vs required context&lt;/li&gt;
&lt;li&gt;nested payload structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not flashy work, but it is exactly the kind of work that makes AI features stable.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. FastAPI is a strong fit for service-oriented AI architecture
&lt;/h2&gt;

&lt;p&gt;A lot of useful AI systems are not giant monoliths.&lt;/p&gt;

&lt;p&gt;They are usually built as a set of focused services such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inference API&lt;/li&gt;
&lt;li&gt;document ingestion service&lt;/li&gt;
&lt;li&gt;retrieval service&lt;/li&gt;
&lt;li&gt;evaluation pipeline&lt;/li&gt;
&lt;li&gt;feedback collection API&lt;/li&gt;
&lt;li&gt;internal admin or model-testing tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FastAPI fits this style really well.&lt;/p&gt;

&lt;p&gt;It is lightweight enough to use for small services, but structured enough that it still feels maintainable as things grow. That balance is important in AI teams because you often need to move quickly at the beginning without creating something impossible to manage later.&lt;/p&gt;

&lt;p&gt;I have found it especially useful when building services that need to do one thing clearly, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accept a request&lt;/li&gt;
&lt;li&gt;enrich it with context&lt;/li&gt;
&lt;li&gt;call a model or ranking layer&lt;/li&gt;
&lt;li&gt;validate the result&lt;/li&gt;
&lt;li&gt;return structured output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That pattern shows up constantly in AI product development.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Automatic docs are more useful than people think
&lt;/h2&gt;

&lt;p&gt;This is one of the most underrated FastAPI features.&lt;/p&gt;

&lt;p&gt;The automatic OpenAPI docs are extremely helpful when you are building AI systems across multiple teams.&lt;/p&gt;

&lt;p&gt;AI product work often involves close collaboration between backend engineers, frontend engineers, ML engineers, product teams, and sometimes operations or domain specialists. Clear API docs reduce friction between all of them.&lt;/p&gt;

&lt;p&gt;When your service is changing quickly, good documentation stops being a nice bonus and becomes part of the development workflow.&lt;/p&gt;

&lt;p&gt;FastAPI gives you that documentation almost for free.&lt;/p&gt;

&lt;p&gt;That helps with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faster frontend integration&lt;/li&gt;
&lt;li&gt;easier internal testing&lt;/li&gt;
&lt;li&gt;better debugging across teams&lt;/li&gt;
&lt;li&gt;cleaner handoffs between product and engineering&lt;/li&gt;
&lt;li&gt;simpler onboarding for new engineers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For AI teams moving fast, small reductions in coordination overhead add up quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Async support is useful for modern AI workflows
&lt;/h2&gt;

&lt;p&gt;AI products often depend on I/O-heavy operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calling model providers&lt;/li&gt;
&lt;li&gt;reading from vector databases&lt;/li&gt;
&lt;li&gt;fetching documents&lt;/li&gt;
&lt;li&gt;hitting external APIs&lt;/li&gt;
&lt;li&gt;storing logs and traces&lt;/li&gt;
&lt;li&gt;saving outputs for later review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FastAPI’s async-first design is helpful in this environment.&lt;/p&gt;

&lt;p&gt;That does not mean every endpoint should be async just because it can be. But when you do have concurrent I/O work, FastAPI makes it easier to design around it cleanly.&lt;/p&gt;

&lt;p&gt;This is especially relevant for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;streaming LLM responses&lt;/li&gt;
&lt;li&gt;orchestration across multiple services&lt;/li&gt;
&lt;li&gt;document processing pipelines&lt;/li&gt;
&lt;li&gt;AI features with retrieval and re-ranking steps&lt;/li&gt;
&lt;li&gt;external provider integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In many AI systems, the model is only one part of the full request path. A lot of the latency lives in the surrounding workflow. Good async support gives you more flexibility when optimizing those paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. FastAPI works well with the broader Python AI ecosystem
&lt;/h2&gt;

&lt;p&gt;This one is obvious, but still important.&lt;/p&gt;

&lt;p&gt;Python remains the most practical language for a lot of AI work because the ecosystem is so strong. Whether you are working with data pipelines, model inference, evaluation tooling, or orchestration, the Python ecosystem is deep.&lt;/p&gt;

&lt;p&gt;FastAPI fits naturally into that world.&lt;/p&gt;

&lt;p&gt;You can use it alongside tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NumPy and pandas&lt;/li&gt;
&lt;li&gt;PyTorch and TensorFlow&lt;/li&gt;
&lt;li&gt;scikit-learn&lt;/li&gt;
&lt;li&gt;Hugging Face transformers&lt;/li&gt;
&lt;li&gt;Celery or task queues&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;vector databases&lt;/li&gt;
&lt;li&gt;observability tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes it easier to keep your AI application logic and service layer close together when it makes sense.&lt;/p&gt;

&lt;p&gt;Sometimes that means faster iteration. Sometimes it means fewer translation layers between experimentation and production.&lt;/p&gt;

&lt;p&gt;That can be a real advantage for smaller teams and fast-moving product groups.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. It encourages better API design for AI features
&lt;/h2&gt;

&lt;p&gt;One mistake I see in early AI projects is exposing model calls too directly.&lt;/p&gt;

&lt;p&gt;The API becomes a thin wrapper over a prompt or inference call, and that usually creates problems later.&lt;/p&gt;

&lt;p&gt;A better pattern is to design the API around the product behavior, not around the model itself.&lt;/p&gt;

&lt;p&gt;For example, instead of creating an endpoint that feels like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;send prompt&lt;/li&gt;
&lt;li&gt;get raw model output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is often better to create an endpoint that reflects the user-facing intent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summarize this document&lt;/li&gt;
&lt;li&gt;classify this message&lt;/li&gt;
&lt;li&gt;extract structured fields&lt;/li&gt;
&lt;li&gt;generate recommendations&lt;/li&gt;
&lt;li&gt;score this content for relevance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FastAPI supports that style well because it makes endpoint design, schemas, and documentation easy to keep aligned.&lt;/p&gt;

&lt;p&gt;That alignment matters.&lt;/p&gt;

&lt;p&gt;It helps you build systems that are easier to test, easier to observe, and easier to evolve when the underlying model or provider changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Great for prototypes, but still solid for production
&lt;/h2&gt;

&lt;p&gt;I think one reason FastAPI has become so popular is that it works across multiple stages of product maturity.&lt;/p&gt;

&lt;p&gt;You can use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a quick internal proof of concept&lt;/li&gt;
&lt;li&gt;an MVP for a startup product&lt;/li&gt;
&lt;li&gt;an internal ML platform endpoint&lt;/li&gt;
&lt;li&gt;a production API that supports user-facing features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That flexibility is valuable because AI products often evolve fast.&lt;/p&gt;

&lt;p&gt;The first version may be a basic prompt flow. The next version may add retrieval. Then evaluation. Then logging. Then guardrails. Then background processing. Then admin tools. Then multiple models.&lt;/p&gt;

&lt;p&gt;FastAPI does not block that evolution.&lt;/p&gt;

&lt;p&gt;It gives you a clean starting point while still supporting production patterns like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dependency injection&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;middleware&lt;/li&gt;
&lt;li&gt;typed request and response models&lt;/li&gt;
&lt;li&gt;background tasks&lt;/li&gt;
&lt;li&gt;health checks&lt;/li&gt;
&lt;li&gt;metrics integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That does not mean every FastAPI codebase is automatically well designed. But the framework makes good structure easier to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Where I would still be careful
&lt;/h2&gt;

&lt;p&gt;I like FastAPI a lot, but I do not think it is magic.&lt;/p&gt;

&lt;p&gt;There are still common mistakes teams make when using it for AI systems.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;putting too much business logic directly in route handlers&lt;/li&gt;
&lt;li&gt;mixing experimental model logic with stable production paths&lt;/li&gt;
&lt;li&gt;skipping background jobs for slow workflows&lt;/li&gt;
&lt;li&gt;exposing raw provider behavior without normalization&lt;/li&gt;
&lt;li&gt;treating validation as optional because “the model can handle it”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework helps, but architecture still matters.&lt;/p&gt;

&lt;p&gt;For production AI systems, I still want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;service boundaries&lt;/li&gt;
&lt;li&gt;clean abstractions around providers&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;li&gt;strong error handling&lt;/li&gt;
&lt;li&gt;versioned APIs when needed&lt;/li&gt;
&lt;li&gt;separation between synchronous and asynchronous flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FastAPI makes these patterns possible. It does not enforce them for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. My practical rule of thumb
&lt;/h2&gt;

&lt;p&gt;When I think about backend frameworks for AI products, I usually ask one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will this help me build a system that is both flexible for experimentation and disciplined enough for production?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FastAPI is one of the few tools that consistently answers yes.&lt;/p&gt;

&lt;p&gt;It gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;speed during development&lt;/li&gt;
&lt;li&gt;strong schema support&lt;/li&gt;
&lt;li&gt;clean Python integration&lt;/li&gt;
&lt;li&gt;useful documentation&lt;/li&gt;
&lt;li&gt;good async capabilities&lt;/li&gt;
&lt;li&gt;enough structure to keep a growing service maintainable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination is hard to beat for a lot of AI applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;AI products do not just need smart models.&lt;/p&gt;

&lt;p&gt;They need dependable systems around those models.&lt;/p&gt;

&lt;p&gt;That means the backend layer has to do real work: validate inputs, shape outputs, protect downstream systems, expose clear contracts, and keep the product stable even when the model behavior is not fully predictable.&lt;/p&gt;

&lt;p&gt;That is why FastAPI is such a strong fit.&lt;/p&gt;

&lt;p&gt;It helps turn AI capabilities into usable product infrastructure.&lt;/p&gt;

&lt;p&gt;And in my experience, that is where a lot of the real engineering value gets created.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Closing question for DEV readers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are building AI products in Python, what matters most to you in a backend framework: speed of development, schema validation, async support, or ecosystem fit?&lt;/p&gt;

</description>
      <category>fastapi</category>
      <category>python</category>
      <category>backend</category>
      <category>ai</category>
    </item>
    <item>
      <title>What “Production-Ready LLM Feature” Really Means</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Fri, 06 Mar 2026 20:14:22 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/what-production-ready-llm-feature-really-means-1hh</link>
      <guid>https://forem.com/jamie_gray_ai/what-production-ready-llm-feature-really-means-1hh</guid>
      <description>&lt;p&gt;When people talk about LLM features, they usually talk about prompts, models, and demos.&lt;/p&gt;

&lt;p&gt;But in real products, that is only the beginning.&lt;/p&gt;

&lt;p&gt;A feature does not become production-ready because it generated a few impressive outputs during testing. It becomes production-ready when it can survive messy user input, system failures, inconsistent model behavior, latency spikes, and changing business expectations without breaking trust.&lt;/p&gt;

&lt;p&gt;That gap between &lt;strong&gt;"it works in a demo"&lt;/strong&gt; and &lt;strong&gt;"it works for real users"&lt;/strong&gt; is where most of the engineering effort actually lives.&lt;/p&gt;

&lt;p&gt;Over the last several years, I have worked across AWS, startups, and AI-focused teams building systems that had to be reliable in real environments. One of the biggest lessons I learned is that an LLM feature is never just a model integration. It is a product surface, a backend system, a reliability problem, and a user trust problem all at the same time.&lt;/p&gt;

&lt;p&gt;In this post, I want to break down what I think production-ready actually means when you are shipping an LLM feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A good prompt is not a production strategy
&lt;/h2&gt;

&lt;p&gt;A lot of early LLM work starts with a prompt that performs well on a few test cases.&lt;/p&gt;

&lt;p&gt;That is a good start, but it is not enough.&lt;/p&gt;

&lt;p&gt;Prompts are fragile. User input changes. Business rules change. Context formatting changes. Upstream data changes. The model provider may even update model behavior underneath you. Something that looked stable on day one can become noisy very quickly.&lt;/p&gt;

&lt;p&gt;That is why I do not think about prompts as the product. I think about them as one layer inside a larger system.&lt;/p&gt;

&lt;p&gt;A production system needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structured inputs&lt;/li&gt;
&lt;li&gt;validation before the model call&lt;/li&gt;
&lt;li&gt;post-processing after the response&lt;/li&gt;
&lt;li&gt;fallback behavior when output quality drops&lt;/li&gt;
&lt;li&gt;logging and evaluation around the full workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model should not be the only thing holding the feature together.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Reliability matters more than cleverness
&lt;/h2&gt;

&lt;p&gt;One of the easiest mistakes in AI product work is over-optimizing for impressive output instead of dependable behavior.&lt;/p&gt;

&lt;p&gt;Users usually do not judge a feature by its best response. They judge it by whether it is consistently useful.&lt;/p&gt;

&lt;p&gt;That changes how I design LLM features.&lt;/p&gt;

&lt;p&gt;I care less about whether the model can occasionally produce something amazing, and more about whether the system can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;return a result within an acceptable time&lt;/li&gt;
&lt;li&gt;avoid obviously wrong or unsafe output&lt;/li&gt;
&lt;li&gt;recover gracefully from provider or network failures&lt;/li&gt;
&lt;li&gt;handle empty or incomplete inputs&lt;/li&gt;
&lt;li&gt;produce results in a format the rest of the product can use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, this means adding engineering layers that are not very glamorous but matter a lot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retries with limits&lt;/li&gt;
&lt;li&gt;timeouts&lt;/li&gt;
&lt;li&gt;schema validation&lt;/li&gt;
&lt;li&gt;output guards&lt;/li&gt;
&lt;li&gt;confidence checks&lt;/li&gt;
&lt;li&gt;deterministic fallbacks&lt;/li&gt;
&lt;li&gt;feature flags&lt;/li&gt;
&lt;li&gt;monitoring and alerting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the part many demos skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Structured output is a huge unlock
&lt;/h2&gt;

&lt;p&gt;I think one of the most important shifts in applied LLM engineering is moving from free-form output to constrained, structured output.&lt;/p&gt;

&lt;p&gt;As soon as an LLM response needs to feed another part of the product, structure becomes critical.&lt;/p&gt;

&lt;p&gt;If a feature needs to power a UI, trigger a workflow, populate a database field, or drive downstream logic, you cannot rely on vague paragraphs and hope everything works out.&lt;/p&gt;

&lt;p&gt;You need predictable output.&lt;/p&gt;

&lt;p&gt;That usually means defining a schema up front and forcing the system to validate against it.&lt;/p&gt;

&lt;p&gt;A simple example in Python might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SummaryResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;risk_level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_llm_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SummaryResult&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;SummaryResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not fancy, but it changes everything.&lt;/p&gt;

&lt;p&gt;Once output is structured, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reject malformed responses&lt;/li&gt;
&lt;li&gt;add fallback behavior&lt;/li&gt;
&lt;li&gt;keep your UI stable&lt;/li&gt;
&lt;li&gt;write cleaner tests&lt;/li&gt;
&lt;li&gt;measure failure rates more clearly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, production readiness starts increasing the moment the system becomes easier to validate.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Evaluation should be continuous, not one-time
&lt;/h2&gt;

&lt;p&gt;A lot of teams evaluate LLM quality once, feel good about the results, and then move on.&lt;/p&gt;

&lt;p&gt;That is risky.&lt;/p&gt;

&lt;p&gt;LLM systems drift in subtle ways. Sometimes the model changes. Sometimes your retrieval layer changes. Sometimes user behavior changes. Sometimes your own prompt edits introduce regressions.&lt;/p&gt;

&lt;p&gt;You need an evaluation loop that continues after launch.&lt;/p&gt;

&lt;p&gt;That does not have to be complicated at first. A practical starting point is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define a small set of representative test cases&lt;/li&gt;
&lt;li&gt;score outputs against the behaviors you care about&lt;/li&gt;
&lt;li&gt;review failures manually&lt;/li&gt;
&lt;li&gt;track quality over time after prompt or model changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I like to treat evaluation as part of the product lifecycle, not just part of experimentation.&lt;/p&gt;

&lt;p&gt;If you do not have a repeatable way to measure quality, you are mostly relying on intuition.&lt;/p&gt;

&lt;p&gt;And intuition does not scale well.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Latency is part of the user experience
&lt;/h2&gt;

&lt;p&gt;Sometimes teams focus so much on output quality that they forget speed is part of quality.&lt;/p&gt;

&lt;p&gt;A response that is technically good but takes too long can still feel broken.&lt;/p&gt;

&lt;p&gt;That is especially true in user-facing products where people expect immediate feedback.&lt;/p&gt;

&lt;p&gt;When I think about production readiness, I always ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is the acceptable latency budget?&lt;/li&gt;
&lt;li&gt;what happens if the provider is slow?&lt;/li&gt;
&lt;li&gt;can we stream partial output?&lt;/li&gt;
&lt;li&gt;do we need caching for repeated requests?&lt;/li&gt;
&lt;li&gt;should this be synchronous or asynchronous?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are product questions as much as backend questions.&lt;/p&gt;

&lt;p&gt;A great LLM feature is not just intelligent. It feels responsive and dependable.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Fallbacks are not a weakness
&lt;/h2&gt;

&lt;p&gt;I actually think fallback logic is one of the clearest signs that a team understands production engineering.&lt;/p&gt;

&lt;p&gt;Not every request needs to go through the full AI path.&lt;/p&gt;

&lt;p&gt;Sometimes the best experience is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a rules-based response for simple cases&lt;/li&gt;
&lt;li&gt;a cached answer for repeated requests&lt;/li&gt;
&lt;li&gt;a smaller model for speed-sensitive tasks&lt;/li&gt;
&lt;li&gt;a human-readable error state when confidence is low&lt;/li&gt;
&lt;li&gt;a safe default when validation fails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fallbacks protect the user experience.&lt;/p&gt;

&lt;p&gt;They also protect trust.&lt;/p&gt;

&lt;p&gt;A feature that occasionally says, "I could not generate a reliable result for this input" is often better than one that confidently returns something weak or incorrect.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The real job is reducing uncertainty
&lt;/h2&gt;

&lt;p&gt;This is the biggest mindset shift for me.&lt;/p&gt;

&lt;p&gt;Building an LLM feature is not just about adding intelligence. It is about reducing uncertainty across the system.&lt;/p&gt;

&lt;p&gt;You are dealing with a probabilistic component inside a product that users expect to behave predictably.&lt;/p&gt;

&lt;p&gt;So the engineering work becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;narrowing input variation&lt;/li&gt;
&lt;li&gt;constraining output shape&lt;/li&gt;
&lt;li&gt;measuring quality&lt;/li&gt;
&lt;li&gt;isolating failures&lt;/li&gt;
&lt;li&gt;protecting the UI and downstream systems&lt;/li&gt;
&lt;li&gt;creating graceful paths when the model underperforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what turns AI from a cool experiment into a dependable feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple architecture I like
&lt;/h2&gt;

&lt;p&gt;When I build or review LLM-backed systems, I usually want the flow to look something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User input enters the API&lt;/li&gt;
&lt;li&gt;Input is validated and normalized&lt;/li&gt;
&lt;li&gt;Context is gathered from trusted sources&lt;/li&gt;
&lt;li&gt;Prompt is assembled in a predictable format&lt;/li&gt;
&lt;li&gt;Model response is generated&lt;/li&gt;
&lt;li&gt;Output is validated against schema&lt;/li&gt;
&lt;li&gt;Business rules are applied&lt;/li&gt;
&lt;li&gt;Result is logged, scored, and returned&lt;/li&gt;
&lt;li&gt;Failures are routed to a fallback path&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing in that flow is magical.&lt;/p&gt;

&lt;p&gt;That is the point.&lt;/p&gt;

&lt;p&gt;The more predictable the system design is, the easier it becomes to maintain quality as the product grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;A production-ready LLM feature is not defined by how exciting the demo looks.&lt;/p&gt;

&lt;p&gt;It is defined by whether the feature is reliable, measurable, maintainable, and useful when real users start depending on it.&lt;/p&gt;

&lt;p&gt;That usually means the most important work is not the prompt itself. It is the surrounding engineering discipline.&lt;/p&gt;

&lt;p&gt;And honestly, that is what makes applied AI interesting to me.&lt;/p&gt;

&lt;p&gt;The challenge is not just generating output. The challenge is building systems that people can trust.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Closing question for DEV readers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What do you think is the biggest gap between an LLM demo and a real production feature: evaluation, reliability, latency, or product design?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>python</category>
      <category>software</category>
    </item>
    <item>
      <title>Navigating Healthcare as a Founding Engineer</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Thu, 05 Mar 2026 14:26:17 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/navigating-healthcare-as-a-founding-engineer-30gf</link>
      <guid>https://forem.com/jamie_gray_ai/navigating-healthcare-as-a-founding-engineer-30gf</guid>
      <description>&lt;p&gt;When I joined a healthcare startup as a founding engineer, I knew the technical challenges would be significant. What I underestimated was just how different the healthcare ecosystem is compared to traditional software environments.&lt;/p&gt;

&lt;p&gt;Despite having years of experience building production systems, healthcare introduced an entirely new layer of complexity—regulatory requirements, sensitive patient data, clinical workflows, and the responsibility of building technology that directly impacts real people’s lives.&lt;/p&gt;

&lt;p&gt;Early on, the learning curve was steep. Building in healthcare isn’t just about writing code; it requires understanding compliance frameworks, data governance, and how clinicians actually interact with technology in real-world environments. There were moments where early implementations had to be rethought, especially when navigating requirements like HIPAA compliance, data security, and system reliability.&lt;/p&gt;

&lt;p&gt;Rather than viewing those challenges as obstacles, I treated them as an opportunity to deepen my understanding of the domain. I spent time working closely with healthcare professionals, studying regulatory requirements, and designing systems that could balance innovation with the strict reliability standards healthcare demands.&lt;/p&gt;

&lt;p&gt;Over time, those efforts translated into a platform the team and our users could trust—one capable of securely processing sensitive data, supporting clinical workflows, and delivering meaningful insights.&lt;/p&gt;

&lt;p&gt;What this experience reinforced for me is that building technology in healthcare requires more than strong engineering skills. It demands patience, domain understanding, and a commitment to building systems that are not only scalable but also responsible.&lt;/p&gt;

&lt;p&gt;Looking back, the early uncertainty was simply part of the process. It pushed me to grow as an engineer and ultimately helped me build technology that contributes to better healthcare outcomes.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>ai</category>
      <category>beginners</category>
      <category>engineer</category>
    </item>
    <item>
      <title>What Is the First Step When You're Stuck? A Practical Guide to Getting Started</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Thu, 05 Mar 2026 14:14:22 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/what-is-the-first-step-when-youre-stuck-a-practical-guide-to-getting-started-30of</link>
      <guid>https://forem.com/jamie_gray_ai/what-is-the-first-step-when-youre-stuck-a-practical-guide-to-getting-started-30of</guid>
      <description>&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;br&gt;
When you're stuck, the solution isn't more thinking—it's taking action. Here are the essential insights for breaking through paralysis and building momentum:&lt;/p&gt;

&lt;p&gt;• Acknowledge you're stuck first: Recognition without judgment is the crucial starting point in any decision-making process.&lt;/p&gt;

&lt;p&gt;• Start with the tiniest possible action: Set a 5-10 minute timer and begin—momentum builds naturally once you're in motion.&lt;/p&gt;

&lt;p&gt;• Shift from "I don't know" to "I can learn": This simple reframe opens possibilities instead of creating dead ends.&lt;/p&gt;

&lt;p&gt;• Track behaviors, not just results: People who monitor progress are 70% more likely to achieve their goals.&lt;/p&gt;

&lt;p&gt;• Use your past wins as evidence: You already have a track record of figuring things out—resourcefulness is a skill you've already proven.&lt;/p&gt;

&lt;p&gt;The key insight? Clarity emerges through action, not analysis. Stop waiting for perfect conditions and take one small step today. Your future self will thank you for starting now rather than waiting for the "right" moment that may never come.&lt;br&gt;
When you're stuck and wondering what is the first step to take, the hardest part isn't figuring out the answer. It's convincing yourself to move at all. Whether you're facing a big decision, starting a new habit, or working through a problem, that initial moment of action feels impossibly heavy.&lt;/p&gt;

&lt;p&gt;Here's what I've learned: clarity doesn't come from more thinking. The only way to get clarity on something is if you get into action. You don't need perfect conditions or complete information. You need a practical system for identifying what's the first step in the decision-making process and a mindset that values progress over perfection.&lt;/p&gt;

&lt;p&gt;In this guide, we'll walk through why starting feels so difficult, how to identify your true first step, and actionable strategies to build momentum even when you don't have all the answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Why Taking the First Step Feels So Hard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Psychology of Starting vs. Continuing&lt;/strong&gt;&lt;br&gt;
Starting something demands a cognitive shift that continuing doesn't require. When I begin a new task, my brain must change states, make decisions, and tolerate uncertainty. Before any progress occurs, effort has already been spent.&lt;/p&gt;

&lt;p&gt;Ambiguity sits at the heart of this friction. At the beginning, the path forward remains unclear. Where do I start? What does success look like? How long will this take? Each unanswered question activates additional mental processing. The brain prefers clarity because it reduces cognitive load. Continuing a task, by the same token, benefits from real-time feedback. Abstraction collapses into something concrete, and momentum replaces hesitation.&lt;/p&gt;

&lt;p&gt;Emotionally, beginnings create vulnerable spaces. Before I start, outcomes stay theoretical. Once I begin, they become measurable. This shift triggers subtle threat responses in the nervous system, which doesn't sharply differentiate between social and physical risks. Evaluation, potential failure, and uncertainty all register as dangers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Reasons People Get Stuck&lt;/strong&gt;&lt;br&gt;
Procrastination reflects struggles with self-control rather than poor time management. For habitual procrastinators, who represent approximately 20 percent of the population, "I don't feel like it" takes precedence over goals and responsibilities.&lt;/p&gt;

&lt;p&gt;The process involves self-deception. At some level, I'm aware of my actions and their consequences, but changing habits requires greater effort than completing the task itself. Procrastinators often lean toward perfectionism. It becomes psychologically more acceptable to never tackle a job than face the possibility of not doing it well.&lt;/p&gt;

&lt;p&gt;Fear of failure drives much of this avoidance. Some people worry so intensely about others' judgments that they risk their futures to avoid evaluation. Others convince themselves they perform better under pressure, though research shows this generally isn't the case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Cost of Waiting for the 'Perfect' Time&lt;/strong&gt;&lt;br&gt;
Perfectionism disguises itself as a noble pursuit, but it only holds us back. What stops us is fear cloaked in the idea of perfectionism because it gives a seemingly logical reason not to ship the work.&lt;/p&gt;

&lt;p&gt;Nothing is ever completely perfect. If I wait until something reaches that impossible standard before putting it into the world, I'll never do it. The quest for perfection keeps us paralyzed. Instead of taking action, we remain frozen by the fear of making mistakes or not being good enough.&lt;/p&gt;

&lt;p&gt;As a result, waiting for the right time becomes dangerous. We get so focused on finding the perfect moment that we never actually start. The regret of waiting too long stings, especially when we know we've missed opportunities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. What Is the First Step in the Decision-Making Process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acknowledge That You're Stuck&lt;/strong&gt;&lt;br&gt;
The first step in the decision-making process is recognizing you need to make a decision. This sounds obvious, but most of us skip right past it. We stay busy, convince ourselves things aren't that bad, or wait for circumstances to magically improve.&lt;/p&gt;

&lt;p&gt;Acknowledging the problem doesn't mean dwelling in it. Ignoring what needs attention invites denial, and denial only allows issues to grow. I need to note the problem exists, accept it without judgment, and shift my focus toward finding solutions. Once identified, I can start looking for answers rather than staring at the obstacle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identify What You Actually Want&lt;/strong&gt;&lt;br&gt;
Knowing what I want is the first and most important step in creating a better future. When I ask myself what I want my life to look like, the answer might not come easily. Most people have a clearer idea of what they don't want.&lt;/p&gt;

&lt;p&gt;I can flip that around. If I don't want to work in a job where no one appreciates me, I want a job that stimulates me intellectually and allows me to be creative. The more specific I get, the better. Deciding what I want now doesn't lock me in forever. As I learn more, I can adjust course. That's not giving up, that's making informed decisions with new data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate the Real Problem from the Excuse&lt;/strong&gt;&lt;br&gt;
Excuses avoid personal responsibility. Explanations help me grow. An excuse shifts blame to something outside my control, keeping me stuck. An explanation builds self-awareness and reveals how I arrived at this point.&lt;/p&gt;

&lt;p&gt;When I catch myself saying "I don't have time" or "I'm not ready," I need to ask whether that's a reason or an excuse designed to remove my accountability. What looks like a problem often masks something deeper. By approaching the situation differently and changing my perspective, I can identify what's actually blocking progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C. Adopting a Resourcefulness Mindset to Move Forward&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You Already Have a Track Record of Figuring Things Out&lt;/strong&gt;&lt;br&gt;
Resourcefulness isn't something you need to develop from scratch. You already possess this skill. Think back to challenges you've faced in your life. How did you handle them? What clever solutions did you find? Even if these moments happened years ago, they prove you know how to figure things out.&lt;/p&gt;

&lt;p&gt;The great news is that resourcefulness combines creativity, adaptability, and forward thinking to find practical solutions, especially when facing limitations or uncertainty. You've already demonstrated this capacity. Every challenge you overcame started as something you hadn't solved before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shifting from 'I Don't Know' to 'I Can Learn'&lt;/strong&gt;&lt;br&gt;
Fixed mindset thinking says "I can't do this." Growth mindset thinking adds one powerful word: "yet". This small shift opens a door of possibility instead of a dead end. When your inner voice says "I'm not good at this," change it to "I haven't learned it yet".&lt;/p&gt;

&lt;p&gt;This reframe isn't about ignoring reality. It's about choosing a more useful interpretation that keeps you in motion instead of stuck. The belief in your capacity to improve actually changes how your neural pathways form during learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building Confidence Through Past Wins&lt;/strong&gt;&lt;br&gt;
Confidence builds through evidence. When you reflect on what you've accomplished, you create your own archive of competence and resilience. Neuroscience shows that acknowledging achievements triggers dopamine release, which creates a positive feedback loop of motivation and self-belief.&lt;/p&gt;

&lt;p&gt;Regularly remind yourself of previous obstacles you navigated. This helps turn isolated successes into a pattern of competence your confidence can stand on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reframing Uncertainty as Opportunity&lt;/strong&gt;&lt;br&gt;
Uncertainty and possibility are two sides of the same coin. History shows that some of the greatest breakthroughs emerge during uncertain times. Instead of seeing change as a threat, ask yourself what opportunities it presents. This mindset shift removes ambiguity and helps you move past uncertainty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;D. Practical Strategies for Taking Your First Step&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Break the Goal into Smaller Segments&lt;/strong&gt;&lt;br&gt;
Breaking down big goals into more manageable chunks had a meaningful and sustained impact, with people who focused on smaller subgoals volunteering 7 to 8 percent more than peers who simply aimed for the big goal. The more flexible your framing, the more durable the benefits over time. Instead of "write the report," try "open the document and type the title".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with the Smallest Possible Action&lt;/strong&gt;&lt;br&gt;
A tiny step lowers the barrier to entry significantly. Set a timer for just 5 to 10 minutes and work until it rings. Nine times out of ten, you'll be in flow and decide to continue. If you struggle to get going, you're not lazy; you just need the right tools to build momentum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Loose Plan Based on What You Know&lt;/strong&gt;&lt;br&gt;
Action plans transform high-level objectives into concrete, assignable steps so you know exactly what to do and when. Explicitly identify tasks needed to complete milestones, then allocate resources and prioritize by importance and sequence. Keep your plan visible and revise it as circumstances change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get Into Action Before You Have All the Answers&lt;/strong&gt;&lt;br&gt;
Rather than wait on information you don't have, gather the contextual information you already possess to narrow your scope of options. Layer in what you know about your skills, resources, and constraints. When you commit early, stakes stay lower and you gain freedom to course correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the 'Next Obvious Step' Method&lt;/strong&gt;&lt;br&gt;
If you always have an obvious next task to return to, you keep momentum and work through your task list. Having clear priorities is half the battle. Keeping these visible ensures you spend less time working out what to do next and more time actually working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track Your Progress to Build Momentum&lt;/strong&gt;&lt;br&gt;
People who track their progress are significantly more likely to achieve their goals, with regular monitoring increasing goal achievement rates by up to 70 percent. Tracking reveals patterns and makes cumulative effort visible and motivating. Focus on tracking your behaviors rather than just results, because you can control your choices and actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Getting unstuck doesn't require perfect conditions or complete information. As I have noted, clarity comes from action, not endless planning. The strategies we've covered give you a practical system for identifying your first step and building momentum from there. Start small, track what works, and adjust as you learn. Waiting for the perfect moment keeps you paralyzed. Take one tiny action today, and you'll be closer to your goal than you were yesterday.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>productivity</category>
      <category>psychology</category>
    </item>
    <item>
      <title>The Journey From Uncertainty to AI Innovation</title>
      <dc:creator>Jamie Gray</dc:creator>
      <pubDate>Thu, 05 Mar 2026 13:57:28 +0000</pubDate>
      <link>https://forem.com/jamie_gray_ai/the-journey-from-uncertainty-to-ai-innovation-210l</link>
      <guid>https://forem.com/jamie_gray_ai/the-journey-from-uncertainty-to-ai-innovation-210l</guid>
      <description>&lt;p&gt;When I first started my career, I knew I was fascinated by technology—but I wasn’t entirely sure where to begin.&lt;/p&gt;

&lt;p&gt;About ten years ago, I was standing at a crossroads. I wanted to become a software developer, but like many people early in their careers, I didn’t yet know what path would take me there. That changed when I landed an internship at Amazon Web Services (AWS), one of the world’s leading cloud platforms.&lt;/p&gt;

&lt;p&gt;My time at AWS was both challenging and incredibly motivating. I was suddenly surrounded by talented engineers working on systems at a massive scale. Every day pushed me to learn faster—about software development, distributed systems, and how high-performing teams collaborate to build reliable technology.&lt;/p&gt;

&lt;p&gt;What started as an internship quickly became a defining experience for me. I wasn’t just learning theory; I was contributing to real systems used around the world. It gave me a deeper understanding of how large technology platforms operate behind the scenes and what it takes to build production-grade infrastructure.&lt;/p&gt;

&lt;p&gt;After that experience, I felt far more confident stepping into the broader tech industry. Over the years, I continued refining my skills and eventually found myself drawn toward startups—environments where things move quickly and where building something meaningful from the ground up is part of everyday work.&lt;/p&gt;

&lt;p&gt;More recently, my focus has shifted toward applied AI. I’ve worked on generative AI systems, machine learning platforms, and data-driven products that bring advanced technology into real-world use. What excites me most is turning complex AI systems into practical tools that people can actually use.&lt;/p&gt;

&lt;p&gt;Today, with more than a decade of experience across large tech companies and fast-moving startups, I still look back at my early days at AWS as a foundational moment in my career.&lt;/p&gt;

&lt;p&gt;I started with uncertainty, like many engineers do. But that experience helped me build the confidence, skills, and curiosity that continue to drive my work today.&lt;/p&gt;

&lt;p&gt;And the journey is still just getting started. 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>developer</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
