← BACK TO INSIGHTS
AI ENGINEERING2026-09-17•9 min read

PageIndex Reality Check

PageIndex promises retrieval without embeddings: index a document as a tree of its own sections and let an LLM reason its way to the right one. I measured it against six conventional pipelines on the same corpus, the same questions and the same judge. It lost, and the way it lost is more interesting than the fact that it did.


PageIndex Reality Check


PageIndex promises retrieval without embeddings. Instead of chunking a document and scoring vectors, you index it as a tree of its own sections, and at query time an LLM reasons its way down that tree, the way a person turns to the right chapter instead of running a search. The pitch is good. The published numbers are striking.


I put it into my RAG Lab next to six conventional pipelines and measured it for three days. It lost. This is what the measurements say, what closed part of the gap, and what did not.


The setup


  • 11 PDFs, 2,298 chunks, 100 synthesized questions: 50 single-hop, 50 multi-hop.
  • DeepEval with six metrics, plus retrieval-level metrics DeepEval does not cover, above all whether the chunk that actually answers the question made it into the final context.
  • Everything local: a pinned Qwen3.8 Flash across two DGX Sparks both generates and judges, nomic-embed-text handles embeddings.
  • Every approach sees the same chunks, the same questions, the same judge.

  • Where it landed


    ApproachCompositeGold-chunk hit
    RAG + Reranker0.84094%
    Corrective RAG0.82792%
    HyDE0.82689%
    Plain hybrid RAG0.82490%
    Agentic RAG0.82290%
    GraphRAG0.82190%
    PageIndex Hybrid0.70666%
    PageIndex0.68057%

    The six vector pipelines sit within 0.019 of each other. PageIndex sits 0.14 below all of them. That is not a tuning gap, that is a different league.


    The gap, decomposed


    The useful question is not how far behind it is, but which of its two mechanisms loses. So I measured three configurations on the same questions, retrieval only.


    ConfigurationGold chunks found, of 100
    Plain hybrid search over the whole corpus91
    The same search, restricted to the documents the model chose78
    Full PageIndex: tree navigation inside those documents59

    Routing to documents costs 13 hits. Navigating to sections costs 19 more. The second number is the method's core mechanism, and it is the expensive one.


    The failure trace says the same thing from another angle: of the misses, the large majority are the right document with the wrong section. Candidates that only the tree surfaced contributed exactly one gold chunk across 100 questions.


    Round 2: the obvious fixes


    Some of the gap was my own fault, and worth fixing before drawing conclusions.


  • The embedding model requires task prefixes that my client never sent. Fixing that lifted every approach by 1 to 3 points of retrieval, and barely moved any composite.
  • PageIndex trimmed and merged chunks by vector similarity alone. Switching to the same keyword-plus-vector score the hybrid search uses was a clear gain.
  • When the model named more sections than the branch limit keeps, the code kept the first two in document order rather than the two best. Ranking before cutting was worth 7 hits on its own.
  • Two changes that reduced how many documents get opened both looked sensible and both made multi-hop questions worse. Measured, reverted, documented.

  • Result: 50% to 57% gold-chunk hit, 0.651 to 0.680 composite. Real, and nowhere near enough.


    Round 3: does walking the tree twice help?


    My implementation descends greedily: two sections per hop, no backtracking, no second look. Upstream's own documented prompt is less greedy than that, it puts the whole tree in one call and asks for every section that might hold the answer, and their production service combines that with a value-based Monte Carlo tree search. So iterating is not a deviation from the method. It is closer to it.


    Navigation strategyGold chunks found
    Greedy descent, two sections per hop59
    Whole tree in one call65
    Beam search with backtracking54
    Navigate, grade the result, re-enter rejected branches59
    Tree as a re-ranking prior, excluding nothing89

    Re-entry fired on 16 of 100 questions and changed no result, for 35% more model calls. Beam search scored below the greedy descent it replaced. Seeing the whole tree at once is a genuine improvement, and still lands 13 hits below simply searching those same documents without a tree.


    The only configuration that got close to plain search was the one that stopped excluding anything: keep corpus-wide candidates and let the tree merely add a bonus to chunks in chosen sections. That is not navigation any more, and at 89 it still does not beat 91.


    Round 3b: the one change that worked


    If the tree cannot pick sections well, maybe the problem is what it gets to look at. During navigation the model sees a section's title and a summary. A summary compresses thousands of characters into two or three sentences and throws away exactly the rare token the question turns on.


    So I showed it each candidate section's best-scoring sentence instead.


    CompositeGold-chunk hitLatency
    PageIndex baseline0.68057%60.6 s
    Evidence-augmented navigation0.74268%43.6 s

    Better on every axis, and faster, because navigation stops sooner when the evidence is in front of the model. It also beats my tree-plus-vector hybrid variant without doing any vector search at all.


    Two other ideas from the same round failed cleanly. Ranking documents by score instead of asking the model never fails to pick a document and finds both gold documents on 35 multi-hop questions against 14, better even than plain search, but it retrieves no better chunks at any budget. And splitting sections into one node per chunk, from 516 nodes to 2,710, made the model choose worse among near-identical snippets: retrieval fell to 46.


    Measuring this honestly


    The pinned model is not deterministic under concurrent load. Two identical runs of the same code flipped 11 of 100 questions. Most of the differences in this article are smaller than that.


    So the harness replays model calls from a cache: identical prompts return the identical answer they returned before, and only genuinely new prompts hit the model. Two runs then differ by the code alone. The first change I measured looked like a regression of 4 questions until I did this, and turned out to be noise in both directions.


    Every claim above is a paired comparison with that replay in place, and the kill criterion was written down before the runs, not after.


    What this is not


    It is not a refutation of PageIndex. The corpus is 11 thematically overlapping AI papers, and the questions were synthesized from individual chunks, which makes them lookup questions that share rare tokens with their answer. That is the ideal case for keyword and vector matching and close to the worst case for reasoning over structure. The published headline number for the method comes from financial filings, where a section heading really is the answer's address.


    It is also not a tree-quality problem. I rebuilt the trees: rejected two unusable tables of contents, cut a 482-page book's root from 99 children to 41, and fixed summaries that described the previous section. The result moved by one hit.


    Over to you


    The honest summary is that on this corpus, structure-first retrieval cannot usefully exclude and cannot usefully re-rank, and the one thing that helped was giving the model real evidence at the moment it decides.


    If you have run PageIndex or another structure-first retriever on real documents, I would like to hear what actually helped you. Did evidence in the navigation prompt move your numbers too? Did you find a document type where the tree genuinely wins? Or did you hit the same ceiling and stop?


    The whole lab is public, including the harness, the variants, the negative results and the commit messages that record what was reverted and why: github.com/pauloesterwitz/RAG-Lab


    Paul Oesterwitz

    Paul Oesterwitz

    AI & SAP Consultant · PhD Researcher