That Arrow in Every RAG Diagram Cost Us Three Weeks.
Part 2 of a series on building a production banking AI chatbot. By the time the classifier and the semantic cache were both live, I genuinely thought the hard part was behind us. Routing was fast. Caching worked. The demo looked clean. Then the AI team asked me a question that sounded almost administrative. AI Lead: "Can you send over the loan policy PDFs? We need to load them into the knowledge base." "Sure," I said. "Give me an hour." That hour turned into three weeks. Chapter 1 — The PDF That Broke Everything The first document I opened was a loan eligibility policy. Twelve pages. Looked simple enough on screen — headings, a couple of tables, some fine print at the bottom of each page. I ran it through a basic PDF-to-text extractor, the kind that takes minutes to wire up. Skimmed the output. It was garbage. Not wrong garbage — worse. It was confidently wrong. Two columns of a table had been extracted side by side into one long, meaningless sentence. A header that said "Eligibility Criteria" had merged directly into the paragraph below it with no space, so it read Eligibility Criteriaapplicants must be . Numbers from a rate table were scattered through the text with no column headers attached, so a 7.2% interest rate sat next to a completely unrelated clause with nothing telling the retriever they weren't related. Me, in the team channel: "Uh. Has anyone actually looked at what comes out the other side of PDF extraction?" AI Lead: "...No. Why?" I sent a screenshot. Nobody replied for a while. A PDF looks like a document to a human because a human's eyes fill in the layout — the columns, the spacing, which number belongs to which row. To a naive extractor, a PDF is just characters scattered across a page with x-y coordinates. It has no idea "5.5%" and "Senior Citizen FD" are supposed to be read together. It just knows they happened to be near each other on page 4. If the extraction was garbage, everything built on top of it — chunking, embeddings, retrieval — was g