• Bonus 2 — Local News RAG: Recency-Aware Answers & Multi-Source Citations

    The last piece Bonus 1 left us able to fetch, dedup, and retrieve today’s news. But retrieval just hands back a pile of articles — we still have to turn them into an answer. And news answers aren’t like support answers. They have to reckon with time. Think about the difference. “How do refunds work?”…


  • Bonus 1 — Local News RAG: Pointing the Pattern at Live Data

    Same skeleton, live target You just built a support bot over static documents. This bonus proves the pattern is bigger than one project: we’ll aim the exact same RAG skeleton at live news, building an assistant that answers questions about today’s local news with citations back to the source articles. Almost everything carries over unchanged…


  • Episode 8 — Evaluating & Shipping

    From “seems good” to “measurably good” to “live” For two episodes I’ve been repeating the same nag: measure it, don’t assume it. Now we build the thing that measures — and then we put Nimbus HelpDesk AI online. Here’s why evaluation matters more in RAG than in normal software. In a normal app, a function…


  • Episode 7 — Improving Quality: Hybrid Search, Reranking & Guardrails

    “Works on my questions” isn’t “works” Episode 6 gave us a real, grounded, cited bot. Now let’s try to break it — because your customers certainly will. Break #1 — the exact term. A customer types: “I’m getting error ERR_402 at checkout.” Semantic search struggles here. Embeddings are brilliant at meaning, but “ERR_402” has no…


  • Episode 6 — Generation: Grounded Answers with Citations

    The last mile Five episodes of groundwork come together here. We can load documents, chunk them, embed them, store them, and — as of last episode — retrieve() the most relevant, quality-checked passages for any question (or honestly return nothing). But retrieval just hands us raw chunks of text. A customer doesn’t want three passages…


  • Episode 5 — Retrieval: Top-K, Thresholds & Filtering

    Our search is fast, but it isn’t smart After Episode 4, MySQL ranks our chunks quickly and returns the top 3. Let’s test it with a question Nimbus’s knowledge base can’t possibly answer: php episode-04/search.php "What’s the weather in Mumbai today?" #1 score=0.081 [refund-policy.md] Customers may request a full refund within 14 days of purchase……


  • Episode 4 — Scaling the Vector Search in MySQL

    The problem hiding in our search Episode 3 ended on a high: ask “how do I get my money back?” and the refund policy comes back as the top match. Retrieval works. But look closely at what search.php actually does: $rows = db()->query(‘SELECT source, content, embedding FROM chunks’)->fetchAll(); That line says: “give me every single…


  • Episode 3 — Embeddings & Your First Similarity Search

    The gap we have to close At the end of Episode 2 we had chunks.json: our documents sliced into clean, tagged passages. But those chunks are still just text, and text has a frustrating limitation for search. A customer might ask: “How do I get my money back?” The relevant chunk says: “Customers may request…


  • Episode 2 — Preparing the Knowledge Base: Loading & Chunking Your Docs

    Where we left off In Episode 1 we cheated. We pasted Nimbus’s refund policy into the prompt by hand and watched the model answer from it. That proved the core idea of RAG — but it doesn’t scale. Nimbus has dozens of help articles, a refund policy, an FAQ, and a features guide. You can’t…