ЁЯз╡ Our Angular app had intermittent infinite loading тАФ blank screen, no API calls, just a spinner forever.
Root cause? ChunkLoadError.
Nginx was caching index.html for 30 days. After every deploy, browsers served stale index.html pointing to old chunk files that no longer existed on the server.
Fix: Cache-Control: no-store on index.html. Cache static assets separately with max-age.
One config change. Problem gone.
Never cache index.html in a SPA. Cache the assets, not the entry point.
#Angular #DevOps #Nginx #ChunkLoadError #Frontend #Kubernetes #WebDev
"How does chunking work in your RAG pipeline?"
The problem first:
A PDF page has 2000 characters. If I pass the full page to the LLM тАФ it gets 15 prompts when it only needs 1. Noisy context, higher hallucination risk, wasted tokens.
So I chunk it down.
How it works:
Sliding window across the text:
chunk_size = 500 chars
chunk_overlap = 100 chars
step = 400 chars (500 - 100)
Chunk 1: chars 0 тЖТ 500
Chunk 2: chars 400 тЖТ 900 тЖР overlaps by 100
Chunk 3: chars 800 тЖТ 1300 тЖР overlaps by 100
Why overlap?
Answers often sit at chunk boundaries. Without overlap you split a sentence in half and retrieval misses it.
Two details that matter in production:
Word boundary fix тАФ never cut mid-word. Find the last space before the chunk end, slice there.
Metadata on every chunk тАФ every chunk carries source, page_number, chunk_index.
When retrieval returns a wrong answer, I trace it back to the exact page instantly.
Why not just use LangChain's splitter?
It works, but returns plain strings тАФ no metadata.
In production when something breaks, you need to know where that chunk came from.
Plain strings give you nothing to debug with.
#debugging
#pipeline
#AI
ЁЯЪи A Kerala man applied for a government job in 2005 and has received an appointment letter as a part-time junior Arabic teacher in 2026. 20 years later. ЁЯЩП
python-dotenv тЖТ secrets safe
pydantic тЖТ data safe
ollama тЖТ local LLM, zero cost
langchain тЖТ document + RAG plumbing
PyMuPDF тЖТ clean PDF text
rank-bm25 тЖТ keyword search
sentence-transformers тЖТ local embeddings + reranking
chromadb тЖТ dev vector DB
qdrant-client тЖТ prod vector DB
langgraph тЖТ agent brain
ragas тЖТ proof it works
fastapi тЖТ expose it to the world
rich + loguru тЖТ see what's happening
#LLM
#AI
#Engineering
#Pipeline
#RAGA
#Learning
#langgraph
#Python
is it True?ЁЯзРЁЯзРЁЯзР
If I were optimizing for a job in 2026
I would honestly do:
Current RAG Project
тЖУ
RAGAS
тЖУ
Qdrant
тЖУ
LangGraph
тЖУ
Build One Serious Agent
тЖУ
Deploy
тЖУ
Observability
and stop there.
That portfolio is stronger than:
10 LangChain tutorials
50 prompt engineering projects
combined.
#AI
#Engineering
#LLM
#Learning
#Jobrelevant
Before coding, understand the core LangGraph idea:
State = shared data moving through the graph
Node = function that reads/updates state
Edge = path from one node to another
Conditional edge = branch based on state
#llm#langgraph#AI#Engineering#Production#RealWorld
#Langchain
ЁЯФН BM25 vs. Vector Search: What is the difference?
If you are building an AI search engine, you will hear about BM25 and Vector Search.
What do they actually do?
Here is the simple breakdown.
1я╕ПтГг BM25 = The Keyword Matcher
BM25 is a traditional, keyword-based search.
It does not understand "meaning." It only looks for exact words.
How it scores things:
Did you use the exact word?
How many times did you use it?
How rare is that word in the whole database? (Rare words score higher than common words like "the").
Example:
You search: "car repair manual"
Document A says: "This is a car repair manual." -> High BM25 Score (Exact match!)
Document B says: "An automobile maintenance guide."
-> Zero BM25 Score (Different words, even though the meaning is identical).
2я╕ПтГг Vector Search = The Meaning Matcher
Vector search is the modern, AI-powered way.
It converts text into numbers (called embeddings).
It does not care about exact words; it cares about the context and meaning.
How it scores things:
Are these concepts mathematically close to each other in meaning?
Example:
You search: "car repair manual"
Document B says: "An automobile maintenance guide."
-> High Vector Score (The AI knows "automobile" = "car" and "maintenance" = "repair").
Document C says: "The car repair shop is closed."
-> Lower Vector Score (It has the exact words, but the AI knows the context is about business hours, not a manual).
ЁЯТб Why we use both (Hybrid Search)
If Vector Search is so smart, why keep BM25?
Because Vector search can sometimes "hallucinate" meaning and miss exact part numbers or names.
BM25 is perfect for exact matches (like searching for a specific ID: "User_8472").
Vector Search is perfect for broad concepts (like searching "How do I reset my password?").
The Winning Strategy:
Run BM25. Run Vector Search.
Combine their lists using RRF (Reciprocal Rank Fusion) so you get the best of exact keywords AND deep meaning!
ЁЯТб The One-Line Interview Answer:
RRF combines search rankings without trusting incompatible raw scores.
#LLM
#Engineering
#AI
#RRF
#AIengineering
Current mood ЁЯзР
PDF тЖТ Chunks тЖТ Embeddings тЖТ ChromaDB тЖТ Retrieval тЖТ Ollama тЖТ Answer
All local.
No OpenAI.
No Anthropic.
No external APIs.
Just learning how production-grade RAG systems actually work.
LLM Engineering journey has officially begun ЁЯЪА
#AIEngineering#RAG #Ollama #Python