Naive RAG, a router, three dead-end router designs — cut, one at a time, as better evidence arrived.
The Naive RAG vs GraphRAG evaluation exposed RAGAS's blind spots. This is what happened after: the router built on top of it, the jury harness that replaced it, and the GraphRAG-only system that came out the other side.
↑ Builds on Naive RAG vs GraphRAG Evaluation → Methodology: Is the judge itself reliable?
Final Decision: GraphRAG Only
CUT, NOT HIDDEN · REAL NUMBERS · SELF-HOSTEDTry the final AeroOps system →(opens the live AeroOps app in a new tab)
FAISS · BM25 · embeddings
naive_rag.py — a DOC_CONFIG filename mismatch that left 2 of 7 documents with no title metadata in production[T17](opens pre-fix naive_rag.py at the last commit before archiving, on GitHub), and a page-number off-by-one that made every citation naive_rag.py ever showed a real user one page wrong.[T18](opens pre-fix naive_rag.py at the last commit before archiving, on GitHub)
One more bug worth naming, found separately: a retrieval bug in graphretriever_v5.py's path-traversal logic could occasionally state two unrelated facts as if one caused the other — a structural co-occurrence edge narrated as a real causal link. Found and fixed before this simplification.[T19](opens the fix on GitHub)
GraphRAG alone, self-hosted, in production
Self-hosted Neo4j Community Edition, same EC2 instance as the app (replaces AuraDB free tier). Through the live public /query endpoint, cross-checked against LangSmith with zero mismatches. 1 of 45 (MH01) excluded — a pre-existing API-layer bug unrelated to retrieval quality. n=44.[T21](opens the raw batch run on GitHub)
Why RAGAS Got Demoted, Not Rejected
JUDGE INSTABILITY · STRUCTURAL BLINDNESS · REFUSAL ARTIFACTRAGAS wasn't thrown out — it was demoted from sole authority to one signal among several, once three separate, independently-diagnosed failure modes were understood.
The largest single-item swing in the dataset
Same identical answer, scored three times, nothing regenerated between runs.[T1](opens run 1 record on GitHub)[T2][T3]
Faithfulness
0.667 SWING · LARGEST IN DATASET
Structural blindness to graph-verified multi-hop claims
RAGAS Faithfulness checks whether a claim traces to one literal chunk of retrieved text. It has no visibility into the graph traversal that actually backs a multi-hop claim.
The refusal-artifact bug
RAGAS scores a refusal as trivially faithful — no claims made, none can be unfaithful. On items where naive RAG refused, that artificial ~1.0 beat GraphRAG's real, cited answer. build_router_ground_truth.py's own header names AF03 as one of the two cases that surfaced this.[T10](opens sourcing note on GitHub)
router_ground_truth.json's labeling logic — if exactly one backend refuses, the other wins outright, RAGAS isn't consulted for that item. 9 of 45 labels flipped.[T10]The Agentic Detour
5 ROUNDS · A REASONABLE DECISION AT THE TIMEThe router's original target said naive won specific categories outright. Building a router in response was the right call given that evidence — the mistake would have been never revisiting it once better evidence arrived.
router_ground_truth.json, by router design round.[T11](opens sourcing note on GitHub)Round 2's entity count was diagnosed as an alias-inflation artifact of ENTITY_MAP, not a real property of the question. Round 3's comparison-language rule was 4/4 wrong as a standalone signal. Round 4 gained 10.6 points purely from fixing the refusal-artifact bug in the ground truth itself (§T2) — not from a better router. Round 5 dropped the semantic layer entirely after it returned a confident-looking match at similarity 0.07–0.19 on out-of-domain junk queries.
The Jury Harness
BLINDED · 3-MODEL MAJORITY VOTE · ANSWER QUALITY ONLYA panel of independent judges scoring by majority vote — the same principle behind "Panel of LLM evaluators" (PoLL) in evaluation literature† — reused this project's own established method: the gold set's jury_agreement field was itself built by 3-model majority vote (Opus 5, GPT-5.6, Qwen), reprised here to score naive/GraphRAG/agentic's answers, blinded, answer-quality only.[T16](opens the jury prompt on GitHub)
Every category, naive vs. GraphRAG
n=2 is small enough that a coin flip wouldn't be surprising as noise on its own — but it isn't contradicted by the larger sample, it's corroborated: naive's overall 0.511 vs. GraphRAG's 0.867 holds across all 45 items, not just the 2 the router sent its way.
Net Result
DECISION RECORDNaive RAG and the agentic router are gone from the live system. Three router designs were built, measured, and discarded in sequence as better evidence arrived — not reversed on a hunch. What's left is a single GraphRAG pipeline, verified end-to-end on infrastructure this project fully owns, with real per-query cost and latency pulled from an actual production run, not estimated.[T23](opens Net Result sourcing on GitHub)