Le Do Nghiem

Le Do Nghiem

AI Engineer

About meBooksSnippetsBlog

© 2026 Le Do Nghiem. All rights reserved.

Contact |

Back to Blog

Shipping LLM Features in 2026: A Checklist I Use Before Every Deploy

Le Do Nghiem
Le Do NghiemAI Engineer
2026-06-29 12 min read
Share

Introduction

Getting a chatbot to work on your laptop feels great. Shipping it to real users is a different story.

In 2026, adding an LLM to a product is easier than ever. But "it runs in the demo" is not the same as "people can trust it in production." I learned that the hard way-and now I use a simple checklist before every deploy.

This post is that checklist. It works whether you are building RAG over your docs, a chat UI in Next.js, or a small agent with LangGraph. No ML lab required. Just clear thinking and a few habits that save you from painful surprises later.


The mindset before the checklist

Do we actually need an LLM?

Before you install LangChain, ask three honest questions:

  1. Can a search bar or a FAQ page solve this?
  2. Can a template or rule handle most cases?
  3. Does the user really need natural language-or do they need a faster button?

If the answer to all three is "maybe not," pause. LLMs are powerful, but they are also slow, costly, and sometimes wrong. Use them when the job needs language, summarization, or flexible reasoning-not because "everyone has AI now."

Define what "done" means for v1

Write one sentence: who uses this, when, and what success looks like.

Example: "Visitors can ask questions about my blog posts and get answers based only on what I wrote-not the whole internet."

Also write what failure looks like. Wrong answers? Slow replies? High cost? Pick the top two risks and design around them.

For v1, you do not need perfect accuracy. You need clear limits, good fallbacks, and a way to improve after launch.


Phase 1 - Problem and product fit

Run through these before writing much code.

The user job is specific

What: One clear job, not "add AI to the app."

Why: Vague goals lead to vague prompts and unhappy users.

How I verify: I can explain the feature in one sentence to a non-technical friend.

Red flag: The only goal is a marketing badge that says "Powered by AI."

Input and output are defined

What: Know what goes in (text, files, context) and what comes out (plain text, JSON, stream, citations).

Why: The API and UI depend on this contract.

How I verify: I sketched the happy path and the error path on paper.

Red flag: "The model will figure it out."

Data boundaries are documented

What: List trusted sources-your MDX files, database tables, internal APIs.

Why: Without boundaries, the model will guess-and sound confident doing it.

How I verify: I wrote down what is in scope and out of scope.

Red flag: The system can answer questions about anything.

There is a human fallback

What: A path when AI is unsure: show sources, suggest contact, or escalate.

Why: Trust beats cleverness in production.

How I verify: I tested questions the system should refuse-and the UI handles it calmly.

Red flag: Every wrong answer looks like a bug with no way out.

Non-goals are written down

What: What v1 will not do (multi-agent, fine-tuning, voice, etc.).

Why: Scope creep kills LLM projects fast.

How I verify: Non-goals are in the README or ticket, not just in my head.


Phase 2 - Architecture and data (RAG and context)

Most production LLM features need good context. Bad data beats a bad model almost every time.

Retrieval strategy is chosen on purpose

What: Decide: RAG, long context, or both.

Why: Dumping entire docs into the prompt does not scale. Tiny chunks with no metadata retrieve the wrong stuff.

How I verify: I drew a simple flow: question → retrieve → augment → answer.

Red flag: "We will just paste everything into the prompt."

Chunking and metadata are tested

What: Try chunk size, overlap, and fields like title, slug, and tags.

Why: Retrieval quality lives or dies here.

How I verify: I ran 10 real questions and checked if the right chunks came back.

Red flag: Raw markdown with no structure.

Vector store fits your setup

What: Pick Qdrant, pgvector, Milvus, or similar-and know how you back up and filter.

Why: Dev on laptop and prod on cloud should not be a surprise mismatch.

How I verify: I can re-index all content with one command or script.

Red flag: Embeddings only exist on one developer's machine.

Prompts enforce grounding

What: Tell the model: answer only from context, cite sources, say "I don't know" when needed.

Why: This cuts hallucinations more than swapping models.

How I verify: Off-topic questions get a polite refusal, not a made-up essay.

Freshness plan exists

What: When you publish new content, how do embeddings update?

Why: Stale RAG is worse than no RAG-confident wrong answers.

How I verify: I added a step to the publish flow (even if manual at first).


Phase 3 - Agents and orchestration (if you use them)

Agents are trendy. They are also easy to overbuild.

Agent complexity is justified

What: Start with one chain. Add agents only when you need tools and branching.

Why: Simple flows are faster, cheaper, and easier to debug.

How I verify: I listed each tool and explained why a single LLM call cannot do it.

Red flag: Twelve tools for a FAQ lookup.

Tool contracts are strict

What: Define inputs, outputs, timeouts, and errors for each tool (Zod or similar helps).

Why: Loose tools become security and reliability holes.

How I verify: Bad tool input returns a clear error, not a stack trace to the user.

Max steps and stop conditions exist

What: Cap loops in LangGraph or your own orchestrator.

Why: Runaway agents burn money and time.

How I verify: I forced a path that would loop and confirmed it stops.

Tool failures degrade gracefully

What: Retry a little, then tell the user what happened.

Why: Production is messy; APIs fail.

How I verify: I unplugged a tool on purpose and the UI still made sense.


Phase 4 - API, backend, and Next.js

This is where my software engineering background pays off. LLM features are still web features.

Secrets stay on the server

What: API keys for Azure OpenAI, OpenAI, etc. only in server env vars.

Why: Keys in the browser will leak.

How I verify: Nothing sensitive in client bundles or public repos.

Streaming UX is implemented

What: Stream tokens to the UI; show loading and cancellation.

Why: Waiting 30 seconds for a blank screen feels broken.

How I verify: I tested slow responses and mid-stream navigation away.

Timeouts and limits are set

What: Max message length, max tokens, request timeout.

Why: One huge paste should not take down your API bill.

How I verify: I sent an oversized input and got a clean error.

Rate limiting is in place

What: Per IP or per user limits on public endpoints.

Why: Bots love free LLM APIs.

How I verify: I hit the endpoint repeatedly and got throttled.

Model routing is explicit

What: Dev might use Ollama locally; prod uses Azure OpenAI-with separate config.

Why: Accidentally shipping dev config to prod is a classic mistake.

How I verify: Environment names are obvious in logs (without printing secrets).

// app/api/chat/route.ts - minimal pattern
import { NextResponse } from "next/server";

export async function POST(request: Request) {
  const controller = new AbortController();
  const timeout = setTimeout(() => controller.abort(), 30_000);

  try {
    const { message } = await request.json();
    if (!message?.trim() || message.length > 4_000) {
      return NextResponse.json({ error: "Invalid message" }, { status: 400 });
    }

    // retrieve context, call model, stream response...
    return NextResponse.json({ reply: "..." });
  } catch {
    return NextResponse.json({ error: "Something went wrong" }, { status: 500 });
  } finally {
    clearTimeout(timeout);
  }
}

Phase 5 - Security and privacy

You do not need a legal team to get the basics right.

PII handling is defined

What: Decide what you log-and what you never log.

Why: Prompts often contain emails, names, and private details.

How I verify: Logs redact or skip user content where possible.

Prompt injection is considered

What: Untrusted user text should not override system rules or trigger dangerous tools.

Why: "Ignore previous instructions" is not a joke in production.

How I verify: I tried a few injection-style prompts and the system held its ground.

Vendor and data policy is clear

What: Know your provider's region, retention, and training opt-out (Azure OpenAI, etc.).

Why: Your users' data passes through their stack.

How I verify: Links to policy docs are in the project notes.

Users see an honest disclaimer

What: Short note: AI can be wrong; check important facts.

Why: Sets expectations and builds trust.


Phase 6 - Evaluation without a ML team

You do not need a benchmark leaderboard. You need repeatable checks.

Golden questions exist (10–30 is enough)

What: Real questions users might ask, with notes on what a good answer looks like.

Why: "Feels fine" is not a test plan.

How I verify: Spreadsheet or markdown file in the repo.

QuestionGood answer should…Pass?
What is this blog about?Mention AI / software topics from my posts☐
Who wrote post X?Correct author or say not found☐
Random off-topic triviaRefuse or say not in knowledge base☐

Regression runs before deploy

What: Re-run golden questions when you change prompts, chunks, or models.

Why: Small prompt edits can break unrelated answers.

How I verify: Last deploy note says "golden set: 28/30 pass."

Hallucination and refusal are spot-checked

What: Deliberately ask things not in your data.

Why: Confident wrong answers destroy trust faster than "I don't know."

Edge cases are listed

What: Empty input, huge paste, other languages, nonsense strings.

Why: Users will try all of these on day one.


Phase 7 - Cost, latency, and observability

LLM features have a meter running. Treat cost like any other cloud bill.

Cost per session is estimated

What: Rough math: tokens in + tokens out × price.

Why: Surprise invoices hurt.

How I verify: I tested a typical session and wrote down the number.

Latency is measured

What: Time to first token and total time-including retrieval.

Why: Slow AI feels broken even when answers are good.

How I verify: p95 noted somewhere (even a sticky note counts at first).

Logging and tracing exist

What: request id, model name, token counts, retrieval hit count-not raw secrets.

Why: You cannot fix what you cannot see.

There is a kill switch

What: Feature flag or env var to turn AI off without redeploying everything.

Why: Bad deploys happen; midnight pages should be rare.

How I verify: I turned the feature off once in staging and the app still worked.


Phase 8 - Launch and after

Staged rollout

What: You first, then friends, then everyone.

Why: Real traffic finds bugs demos never will.

Feedback in the UI

What: Thumbs up/down or a simple "was this helpful?"

Why: Free signal for what to fix next.

Incident playbook (one page)

What: If the model is down, rate-limited, or answers are wrong-what do you do?

Why: Panic is optional; a short doc helps.

Prompt and model versions are tracked

What: Date and note when you change system prompt or swap models.

Why: "What changed last Tuesday?" should be answerable.


One-page checklist (copy and use)

## Before build
- [ ] User job is one clear sentence
- [ ] Input/output contract defined
- [ ] Data boundaries written
- [ ] Human fallback exists
- [ ] Non-goals listed

## Before deploy
- [ ] Retrieval/chunking tested on real questions
- [ ] Secrets only on server; rate limits on
- [ ] Streaming + timeouts + error states work
- [ ] Golden set run (note pass count)
- [ ] Off-topic questions refused correctly
- [ ] Cost and p95 latency noted
- [ ] Kill switch tested
- [ ] Disclaimer shown to users

## After launch
- [ ] Feedback collected
- [ ] Logs reviewed weekly
- [ ] Prompt/model changes documented

Example: blog Q&A in five minutes

Here is how I would map this checklist to a small feature-chat that answers from my own blog posts:

  1. Job: Visitors ask about topics I already wrote about. Not general ChatGPT.
  2. Architecture: MDX files → chunks → embeddings in Qdrant → Next.js API route → stream to UI.
  3. Pre-deploy: Fifteen golden questions; at least two must be refused (off-topic). Note cost per session and p95 latency.
  4. Launch: Feature flag on one page first. Thumbs up/down on each reply.

That is a real v1. Not flashy-but shippable, measurable, and improvable.

My older post on building AI apps with Next.js and LangChain was a good starting point for a simple chat endpoint. This checklist is what I wish I had before calling that endpoint "production."


What I still get wrong

A few honest mistakes I keep learning from:

  • Shipping before a golden set. Users find wrong answers before I do.
  • Agents too early. A graph with five tools for a job that needed search + one LLM call.
  • Ignoring cost until the invoice arrives. Token math is boring; overages are not.

The checklist does not make you perfect. It makes surprises smaller and fixes faster.


Conclusion

Shipping LLM features in 2026 is not about chasing the newest model. It is about treating AI like any other product feature: clear problem, tight scope, real tests, and respect for your users' time and trust.

Keep this checklist somewhere handy. Run through it before deploy-even if you skip a few items at first, write down which ones and why. That honesty is part of shipping, too.

Next up in my queue: a full walkthrough of production RAG on this very blog-ingest, Qdrant, Azure OpenAI, and the golden set in code. If that sounds useful, follow along here or on GitHub.

Happy shipping-and may your refusals be polite and your citations be real.

On this page

  • Introduction
  • The mindset before the checklist
  • Do we actually need an LLM?
  • Define what "done" means for v1
  • Phase 1 - Problem and product fit
  • The user job is specific
  • Input and output are defined
  • Data boundaries are documented
  • There is a human fallback
  • Non-goals are written down
  • Phase 2 - Architecture and data (RAG and context)
  • Retrieval strategy is chosen on purpose
  • Chunking and metadata are tested
  • Vector store fits your setup
  • Prompts enforce grounding
  • Freshness plan exists
  • Phase 3 - Agents and orchestration (if you use them)
  • Agent complexity is justified
  • Tool contracts are strict
  • Max steps and stop conditions exist
  • Tool failures degrade gracefully
  • Phase 4 - API, backend, and Next.js
  • Secrets stay on the server
  • Streaming UX is implemented
  • Timeouts and limits are set
  • Rate limiting is in place
  • Model routing is explicit
  • Phase 5 - Security and privacy
  • PII handling is defined
  • Prompt injection is considered
  • Vendor and data policy is clear
  • Users see an honest disclaimer
  • Phase 6 - Evaluation without a ML team
  • Golden questions exist (10–30 is enough)
  • Regression runs before deploy
  • Hallucination and refusal are spot-checked
  • Edge cases are listed
  • Phase 7 - Cost, latency, and observability
  • Cost per session is estimated
  • Latency is measured
  • Logging and tracing exist
  • There is a kill switch
  • Phase 8 - Launch and after
  • Staged rollout
  • Feedback in the UI
  • Incident playbook (one page)
  • Prompt and model versions are tracked
  • One-page checklist (copy and use)
  • Example: blog Q&A in five minutes
  • What I still get wrong
  • Conclusion
Share
Previous Post

AI Isn't Replacing Engineers - It's Replacing the Old Workflow