Built a causal graph RAG — +0.33 on multi-hop vs flat RAG with Haiku
Been working on a RAG system that builds a directed causal graph from documents instead of chunking. The idea: when someone asks "what ultimately caused X?", flat RAG fails because the cause and effect live in different chunks with no shared vocabulary. If you follow the graph edges instead, you get the full chain.
Benchmark: 54 questions across two domains (subprime mortgage crisis, Chernobyl), three question types (fact lookups, multi-hop, root-cause), Claude Haiku for generation, Sonnet as judge, paired Wilcoxon against a strong BM25+dense flat baseline.
Results:
- Multi-hop: +0.33 (p=0.002)
- Root-cause: +0.22 (p=0.006)
- Fact lookups: +0.01 (statistical tie — graph doesn't hurt)
The fact-lookup tie was the thing I cared most about honestly. Earlier versions had a -0.03 regression on facts which made the system impractical. Fixed that with a score gate that falls back to flat coverage when no chain clears a relevance threshold.
Coverage sentence retrieval is hybrid BM25+dense RRF (k=60). Chains are ranked with a 5-channel RRF: name match, VSA hypervector similarity, BM25, dense, path signature. Entity normalization merges near-duplicate nodes before indexing.
Graph traversal (root cause, impact, shortest path) needs no LLM — instant BFS, useful for on-call engineers who need answers before reading the document.
Repo: https://github.com/linga009/causal-graph-rag
Happy to discuss methodology — especially whether the judge setup is sound, that's always the sketchy part of LLM-as-judge evals.