Галоўная / Артыкулы

PageIndex: Безвектарны РАГ на адмысловай аснове з дрэўяным індэксам

PageIndex заменяе базу дадзеных вектараў на індэкс дрэва, кіроўваны LLM. Як працюе гэты метод RAG, апоўнены выкладкамі, з кодам на Python, падключэннем MCP і ціфрамі кантрольных тэстаў.

Выдавец: REACTAPP.TOP14 хв чытання3118 слоў

Крыніцы: PageIndex: The RAG Framework That Threw Out Vector Databases and Still Hit 98.7% Accuracy

Уявіце сабэкстракцыйны фрэймворк RAG, які зовсім не вікорыстоўвае вектарныя базы дадзэння, і які паказвае рэзультат тэста, да якога ніякая сістэма, апаратная на эмбедынгах, не можа нават падыйсці. Гэта PageIndex — праект з відкрытым кодам ад VectifyAI. У FinanceBench, стандартным тэсце для адпаведзення на запытанні ў фінансовых дакументах, звычны RAG на эмбедынгах показвае рэзультаты ад 30 да 50 процэнтав. PageIndex паказвае 98,7 процэнта. Ён не досяг гэтага рэзультата за дапамогою лепшага модэлю эмбедынга — ён досяг гэтага, адмовіўшыся ад эмбедынгаў.

Гэты рэзультат заслуговае на ўважлівыя перагляды, адтолькі ўпыткі адпаведзення на запытанні ў фінансовых дакументах SEC ёсць аднамі з найжорсткіяў тэстаў адзысквання інфармацыі ў практычным AI. Яны выклікаюць багаташагоныя мірыванні, перэходы між раздзеламі і патрэбу ў точных цыфрах. Найлепшыя сістэмы, якія існуюць, не вікорыстоўваюць ні вектараў, ні чанкавання, ні вектарныя базы дадзэння.

У гэтым артыкуле паказана, што робіць PageIndex, як ён практычна пабудаваны, працуючы код на Python, дзе ён прадстаўляе ся як лепшы раўнэй, а дзе — ні.

Стэна, якую часта перакладчыка зустрэчае

Кожны, хто стварыў RAG для матэрыялу, дыягональны ў болейшым меры, чым пост у блогу, знае проблемы. Пользоватэль запытае сістэму, адаснованую на 200-стороннім годовым адчытніку, як загальны чысты дохід у фінансовым годзе 2024 паўтараецца па адносу да фінансовага году 2023. Стандартны працэс выглядае так:

  1. Раздзеліце дакумент на часткі фіксаванага розмеру, зазвычай 300–500 токенав.
  2. Вбудуўце кожную частку за дапамогою модэлю, такога як text-embedding-3-large.
  3. Зберагучы вектары ў Pinecone, Weaviate, Milvus, Chroma, pgvector або падобных сервісах.
  4. Пад час запытку вбудуўце запіт і выкарыстоўваючы косай схожасць, знайдзіце k найбліжэйшых вектараў.
  5. Перадайце этыя часткі LLM, каб той напісаў адпаведны адказ.

Для короткіх, неструктураваных матэрыялаў, такіх як посты у блогу, запыткі падтрымкі і інструкцыі да продукту, гэта чудова. Але дакументы фармату 10-K разбіваюцься на часткі прыгадным спосабам.

Запіт не выглядае як адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна адпаведна а

Няма запамятовання між раундамі. Калі попераднее поведамленне стосавалася актываў, а наступна запітае «а як ўжо забаваннямі?», сістэма спрытнашукаўця спрацьвоўвае як абавесць новы запіт. Нічога не паведамляе яе пра тое, што выкарыстоўвальнік, верагодна, мае на увазе тую ж частку таго ж справаздачы.

Межавыя апісанні залішаюцца непазорнымі. Падазроўваючы, што сторана 12 паказвае чытальнікам на Дадатак G, а гэты дадатак знаходзіцца на сторане 87, тэкст дадатка не мае семантычнага перакрыцця з первісным запітам, таму вектарны RAG ніколі не будзе следаваць за паказаннем. Введэнне метададзей межавых апісанняў у фрагменты ёсць альтэрнатыва, але яна нестабільна і не падлягае масштабаванню.

Гэтыя не ўсё рэдкія крайнія кейсы. Яны вынікаюць з самай архітэктуры. Як сказаў спадзячы-заснавальнік VectifyAI Мінгцянь Чжан у аанунсе праекту, тое, што на самае справе патрэбна для спрытнага шукання, — цэлае рэлевантнасць, а рэлевантнасць выкалічваецца за дапамогою разумовых працэсаў.

Што такое PageIndex

PageIndex — гэта безвектарная, апартыянарная праметка RAG, выданая компаніяю VectifyAI у верасні 2025 года, створаная Чжанам і Ю Тангам. Яна ліцензаваная па стандарце MIT, і колькасць файлаў у ўтрэбніку быстра зрасла: да канца марца 2026 года ў яй было 23 000 „звёзд“ і майжэ 2 000 копій.

Яе цэнтральная ідэя паходзіць з AlphaGo. У працоўцы замест таго, каб абсалютна перасканаваць прастор і пораўняваць кожны фрагмент за дапамогою вектарнай сэмабільнасці, выкарыстоўваецца навучаная стратэгія для інтэлігентнага навігавання. PageIndex прыменяе гэты падход да дакументаў, маючы тры значныя характэрыстыкі:

  • Няма вектарнай базы дадзеных. Структура дакументаў і апартыянарнае мышленье LLM заменяюць пошук за сэмабільнасцю, таму няма Pinecone, няма Chroma і няма эмбедынгаў.
  • Няма чанкавання. Дакументы застаюцца арганізаваныя як натуральныя часткі: раздзелы, параграфы і табліцы, а не як дыктарыянныя вікна з 500 токенамі.
  • Навігацыя у стылі чалавека. Яна працюе як чалавек, які ручнаа шукае інфармацыю ў дакуменце: адзіраеся на змест, знаходзіць раздзіл, які, верагатна, мае адказ, і чытае яго.

Этот метод складаецца з двух крокаў.

Крок 1: іерархічны дрэва-індэкс

Працэс перадачы дакумента не стварае жадных эмбеддынгаў. PageIndex аналізуе структуру дакумента і стварае іерархічнае дрэва, якое фактычна ўособлівае змест у фармаце, зручным для LLM. Кожны вузел мае заглавле, короткі апіс раздзіла, дыяпазон сторанак і дзеціны вузлы для падраздзілаў, якія можаць быць глыбока ўпакоўваныя за патрэбай.

Дакумент SEC на 50 сторанак можа стварыць дрэва з 30 да 50 вузлаў, якія зберагаюцца як адна JSON-об’ект. Нічога не знаходзіцца ў базе дадзенаў у вектарнай форме — там толькі JSON. Весь об’ект помішчаецца ў адны акна кантэксту LLM, і можна адкрыць будзь-кі вузел і прачытаць яго. Вузел выглядае так:

{
  "node_id": "0006",
  "title": "Financial Stability",
  "start_index": 21,
  "end_index": 22,
  "summary": "Covers the Federal Reserve's financial stability oversight...",
  "sub_nodes": [
    {
      "node_id": "0007",
      "title": "Monitoring Financial Vulnerabilities",
      "start_index": 22,
      "end_index": 28,
      "summary": "Describes the Fed's vulnerability monitoring framework..."
    },
    {
      "node_id": "0008",
      "title": "Domestic and International Cooperation",
      "start_index": 28,
      "end_index": 31,
      "summary": "Federal Reserve collaboration with international bodies..."
    }
  ]
}

Кожны node_id паводзіць на неасоблёваны тэкст той часткі: тэкст, табліцы і з’явы. LLM можа запрашваць тэкст будзь-каго вузла, калі гэта неабходна.

Архітэктурны прынцып заключаецца у тым, дзе знаходзіцца гэты індэкс. База дадзэйна на адпрацоўку вектараў зберагае аддзельны, статычны індэкс эмбеддзінга паўтараючыся за межамі самага модэлю. Тут дрэва JSON знаходзіцца ў актыўным кантэксце LLM пад час выканання задач. VectifyAI называе гэты індэкс індэксам у кантэксце, і модэль не проста яго запытвае, але і аналізуе яго ў рэальны час.

Шаг 2: пошук у дрэве, керованы аналізам

Калі прыходзіць запіт, PageIndex дае LLM дрэво, у яком ўказаны толькі заглавы і апісанні, без самога тэксту, і фактычна запытае, дзе шукаць, вяручыся на гэтую структуру і запіт. Мадэль чытае заглавы і апісанні вузлаў, выявляе тыя раздзелы, якія, верагодна, маюць адпаведны адказ, і вяртае спіс ID вузлаў. Пасля чаго сістэма запрашае рэальны контэнт для гэтых вузлаў.

Працэс пошуку ўскладненыя цыклам:

  1. Аналізуеце зместовую табліцу, ўбачыбачыяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя

    Гэта іншая парадыгма, чым вектарны пошук. База дадзейнаў вектараў вырахоўвае косінусавую сэмабільнасць для кожнага фрагмента паралельна, што ўскораняе працэс, але дае поверхневыя рэзультаты. PageIndex жа выкарыстоўвае ЛІІ для аналізу, дзе, верагодна, знаходзіцца адпаведны адказ. Па ходу мадэль можа аналізаваць перакіраныя звязкі, разбіраць, што запіт пра даны дадатку належыць да вузла дадатку, і усвядомляць, што багатыя запыты вымагаюць контэнту з двух раздэлаў. Кожны крок таксама залеўвае след аналізу, таму можна пабачыць, якія вузлы былі адвідаваны і чаму. Так пракцэс выкарыстоўвання дадзейнаў перастае быць „чорным яшчыкам“.

    Прыклад Дадатку G

    Дэманстрацыя, створаная на адынстанцыі MCP ад VectifyAI, паказвае, чаму гэта мае значэнне. Касціваець запытаеся пра суму адкладзіных актываў у гадовым адчытніку Федэральнай рэзервной службы. У галоўной часты, на сторунках 75–82, обгаваруецца змяна адкладзіных актываў, але сума ніколі не наводзіцца. Аднак на сторунцы 77 ёсць рэчы, якія пазначаюць, што табліца 5.3 структуруе дохады, выдаткі і распадзелы, а Дадатак G дае болей дакладную інфармацыю.

    Vector RAG застаецца тут. Дадатак G — гэта табліца цыфр, якая не мае сэмантычнай супарадненасці з запытам пра адкладзіныя актываў, таму база дадзеных яе ігнаруе. PageIndex працюе інакш. LLM чытае дрэво, пераходзіць да фінансовага раздзелу, знаходзіць апісанне пра Дадатак G, следуе за яным па дрэве, выкарыстоўвае правыя табліцы і вяртае точную цыфру, пры чым след абдумавання паказвае кожны крок.

    Python, ад пачатку да канца

    Код, які вы кануце, адаптаваны з офіцыяльнага кнігі прыемаў PageIndex, з каментарыямі, якія паказваюць алгорытм выканання. Пачніце з інсталяцыі:

pip install pageindex openai

Імпорт:

import os
import json
import asyncio
from pageindex import PageIndexClient
from openai import AsyncOpenAI

Потым — абанты і кліенты. Ключ API атрыбуецца з панелі керування PageIndex:

# Grab an API key from https://dash.pageindex.ai/api-keys
PAGEINDEX_API_KEY = os.environ["PAGEINDEX_API_KEY"]
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]pi_client = PageIndexClient(api_key=PAGEINDEX_API_KEY)
openai_client = AsyncOpenAI(api_key=OPENAI_API_KEY)

Стварыце дрэво

З’явіце неабяжлівыя засобы:

import pageindex.utils as utils

З’явіце PDF і дазвольце PageIndex стварыць дрэво. Індэксаванне займае трохі часу, таму скрыпт чакае, пакуль ён не будзе готавы, і выдрукоўвае рэзультат:

# Upload a PDF; PageIndex handles the tree generation
doc = pi_client.upload("annual_report_2024.pdf")
doc_id = doc["doc_id"]# Tree generation takes a bit, so we poll
while not pi_client.is_retrieval_ready(doc_id):
    print("Still indexing...")
    import time; time.sleep(5)# Grab the tree and take a look
tree = pi_client.get_tree(doc_id, node_summary=True)["result"]
print("Document Tree:")
utils.print_tree(tree)

У выдрукаваным дакуменце паказаны ўсі раздэлы, падраздэлы і дыяпазоны сторанак, што дазволяе адразу з’ясаваць, чы правільна дрэва адобразіла макет.

Дазвольце LLM шукаць у дрэве

Гэта ключовы крок. Функцыя прымеўае дрэва і запіт:

async def find_relevant_nodes(tree: dict, query: str) -> list:
    """LLM reasons over tree structure to identify relevant nodes."""

Унутрэ ўсё первасортнае тэкста адключаецца, каб захаваць токены, адтуды што модэлю патрэбны толькі загаловкі і апісанні. У запытэ модэль выступае як эксперт з пошуку дакументаў, яму прыказваюць следаваць за перакіранымі лінкамі, і прасаюць падаць JSON, які містыць яго аргументацыю плюс спіс ID-аў вузлаў:

    # Strip raw text to save tokens; the LLM only needs titles and summaries
    tree_without_text = utils.remove_fields(
        tree.copy(), fields=["text"]
    )    search_prompt = f"""
    You are a document retrieval expert. Given a question and
    a hierarchical tree structure of a document, identify all
    nodes likely to contain the answer.    Each node has a node_id, title, and summary.
    Follow cross-references if a section mentions another.    Question: {query}    Document tree structure:
    {json.dumps(tree_without_text, indent=2)}    Reply in this JSON format only:
    {{
        "thinking": "<reasoning about which nodes are relevant>",
        "node_list": ["node_id_1", "node_id_2"]
    }}
    """    response = await openai_client.chat.completions.create(
        model="gpt-4.1",
        messages=[{"role": "user", "content": search_prompt}],
        temperature=0,
        response_format={"type": "json_object"},
    )    result = json.loads(response.choices[0].message.content)
    print(f"LLM reasoning: {result['thinking']}")
    return result["node_list"]

З’явіць контэнт і адказ

Наступная функцыя збірае неапдэтаваны тэкст для выбраных вузлоў:

def collect_node_content(tree: dict, node_ids: list) -> str:
    """Pull raw text from the nodes the LLM selected."""
    all_nodes = utils.flatten_tree(tree)
    context_parts = []

Потым тэлы цыклу сабірае кантэкст, пры чым кожны раздзел пазначаецца загалом і дыяпазонам сторанак, а весь працэс заключаецца ў цэлыяе: выбіраюцца вузлы, запрашваецца контэнт, ствараецца адказ з цітатамі, і адказ вяртаецца разам з выкарыстоўванымі вузламі.

    for node in all_nodes:
        if node["node_id"] in node_ids:
            title = node.get("title", "Untitled")
            pages = f"pages {node.get('start_index', '?')}-{node.get('end_index', '?')}"
            text = node.get("text", "")
            context_parts.append(
                f"[{title} | {pages}]\n{text}"
            )
    return "\n\n---\n\n".join(context_parts)
async def answer_query(tree: dict, query: str) -> dict:
    """Full vectorless RAG pipeline: tree search + answer generation."""    # Step 1: LLM picks the nodes
    node_ids = await find_relevant_nodes(tree, query)    # Step 2: Fetch content from those nodes
    context = collect_node_content(tree, node_ids)    # Step 3: Generate answer with citations
    answer_prompt = f"""
    Answer the question using only the provided context.
    Cite specific pages and sections in your answer.    Context:
    {context}    Question: {query}
    """    response = await openai_client.chat.completions.create(
        model="gpt-4.1",
        messages=[{"role": "user", "content": answer_prompt}],
        temperature=0,
    )    return {
        "answer": response.choices[0].message.content,
        "retrieved_nodes": node_ids,
        "context_length": len(context),
    }
# Run it
query = "What was the total value of deferred assets in 2023?"
result = asyncio.run(answer_query(tree, query))
print(result["answer"])
print(f"Nodes used: {result['retrieved_nodes']}")

Падзеце ў MCP

Для Claude, Cursor чы рэгулярнага агента, які падтрымлівае MCP, PageIndex падключаецца безпосерэдня праз хоставаны сервер:

{
  "mcpServers": {
    "pageindex": {
      "type": "http",
      "url": "https://api.pageindex.ai/mcp",
      "headers": {
        "Authorization": "Bearer your_api_key"
      }
    }
  }
}

Таксама існуе местны сервер MCP для аплодавання файлаў з дыска, і ён патрабуе Node.js 18 або новейшай версіі:

{
  "mcpServers": {
    "pageindex": {
      "command": "npx",
      "args": ["-y", "@pageindex/mcp"]
    }
  }
}

Цыфры ў кантэксце

Главныя паказнікі апранутыя FinanceBench, якая выкарыстоўвае рэальныя дакументы SEC, укладзеныя як 10-K, 10-Q, так і 8-K, і прыймае толькі точныя адпаведзі. Агент фінансовага аналізу Mafin 2.5 ад VectifyAI, створаны на базе PageIndex, быў працаваны на всій базе дадзенаў. Звярнутая точнасць:

Сістэма Точнасць Розмах пакрыцця бенчмаркамі
Mafin 2.5 (PageIndex) 98,7% 100%
Традыцыяны вектарны RAG апошні 50% змінюецца
GPT-4o без RAG апошні 31% 100%
Perplexity апошні 45% змінюецца

Разлік у апошні 49 пунктавых прыцэпаў па адносу да традыцыянага вектарнага RAG — гэта не маленькі прагрэс. Гэта абсалютна іншая катэгорыя рэзультатаў. Тры фактары яшчэ раз выступаюць:

  • Следуючыя междувыкліканыя апавязы. Указванні ў самым дакуменце, такія як "дывіцеся Дадатак G", пераводзяцца па структуры дрэва. Пошук на адпоўнасць не ведае пра іх.
  • Зберэнне структуры. Табліцы маюць заголовкі, прымечанні і зв’язкі межаў клетак. PageIndex зберагае іх як вузлы дрэва, тады калі працэс разбівання на часткі іх знішчае.
  • Багатыятковая логіка. Запыт, які паўставае ў зв’язку з паўранку 2023 і 2024 гадоў і прадастаўляецца ў разных частках дакумента, практычна адмаўляецца за дапамогою ітэратыўнага цыклу.

Дзе ён не дастатні

PageIndex ўражае сваім практычным прызначэннем, але ён не можа заменіць вектарны RAG у всіх сітуацыях.

  • Ён медленней. Кожны запрашэнне выклікае калькі LLM: чытанне індэкса, аналіз вузлаў, запрашэнне контэнту, перакананне ў достатку інфармацыі, можа, петля. Vector RAG адпавядае за мілісэкунды, а PageIndex — за секунды. Соўтаўнік-заснавальнік зазначыў, што чынючы, што запрашэнні выконваюцца падчас самага стварэння рэзультата, час на першы токен можа быць падобны да часу звычайнага калькі LLM, але абшчая затрэмтванасць застаецца вышэй.
  • Ён коштуе больш. Неякі калькі інферэнса на кожны запрашэнне проты аднаго запрашэння на аднае імбеддынгаванне. Пры вялікім об’ёме расчыткі стаюць складнымі.
  • Ён створаны для глыбіны, а не для шыроты. Ён адзінакава справляецца з глыбокым выкарыстоўваннем інфармацыі з аднаго дужа дзяўнага дакумента. Пошук 10 000 короткіх дакументаў адразу — гэта там, дзе векторныя базы дадзеных прадкладваюць ся, а стварэнне і аналіз дрэва для кожнага з іх не ёсць практычным.
  • Структура мае важна значэнне. Добрая, чыста дакументацыя, паданая у SEC, ствараяць высокаяяяяяя якосць структуры дакумента. Некорэктна, паспраўленая сканаваная версія без логічных раздэлаў дае паспраўленыя тэблы зместу, і ўсё, што знаходзіцца пасля, страждае. Для такіх случаў існуе рэжым на адной зоры, але структураваныя дакументы застаюцца оптымальным выборам.
  • Логіка LLM таксама не ідэальна. Метод Vector RAG даўа паспраўленыя рэзультаты, таму што эмбедынгі толькі апрыксама відбіваюць значэнне. PageIndex таксама даўа паспраўленыя рэзультаты, калі логіка ўхвату інформацыі ёсць апрыксамованай: мадэль можа перайсці да некорэктнага раздэла, неправяма прачытаць падсумак або праігнораваць значыцыцкі падузел. Гэтыя неякосці лёгкіяяяяяя для адгукнення і, можа, простыяяяя для дыбаггінгу, але яны такія ж трапляюцца.
  • Адзін показнік. FinanceBench ацэнюе якасць апрацоўкі запытанняў у добра структураваных дакументах, засланых да SEC. Рэзультаты апрацоўкі запытанняў, якія ўскладненыя, стосуюцца калькольных домэнаў і ў якіх ёсць неяснасці, у дужа разных тыпах дакументаў, не былі незалежна параболены на тым жа рэвэле. 98,7 процента — гэта рэальнае значэнне, але важна ведаць, што самэ гэта ацэнюе.
  • Калі яго вжываць

    Выбірайце PageIndex, калі:

    • дакументы ў довгім фармаце, структураваныя і професійныя: годовыя звясткі, контракты, дакументы, засланыя для рэгулявання, тэхнічныя інструкцыі
    • точнасць важнейша за швальнасць, напрыклад, калі неправільны адказ можа коштаць грошы або стварыць рызык несанкцыянацыі
    • запытанняям трэбая багатаэтапная аналіза або перэход між разнымі часткамі дакумента
    • вам патрэбныя лёгкія для аўдыту следы, адколькі кожны адказ супроводжваецца аналізам і пасыланнямі на відпаведныя элементы, што ценяцца ў рэгулююцыхся галузях

    Застаўцеся з вектарным RAG, калі:

    • Падобнае сітуацыя выклікае патрэбу ў адказах за час, меншы за секунду, пры вялікай колькасці запытанняў.
    • Вы шукаеце ў вялікай канцэнтрацыі короткіх дакументаў.
    • Дакументы ў такім случае не маюць структуры або ўжо ў форме дыялогу.
    • Точнасць у 90 процэтаў ўжо ўсё ў парадку.
    • Галоўным абмежэннем ёсць вартасць адпаведзення на адзін запыт.

    Гібрыдны падход, верагодна, недастатнька доследжаны. Іспользуйце векторны пошук, каб выявіць, які дакумент у вялікай канцэнтраціі ёсць значным, а пасля перадайце яго на апрацоўку у PageIndex для глыбокай аналізы.

    Што новага з моменту запуску

    Праект развіваецца стрэмгана з сэптэбра 2025 года.

    Агентны RAG без вектараў. Няўянейшая версія паў’язвае самастойна розмешчаны PageIndex з SDK OpenAI Agents. Агенту даўнаецца тры інструменты (get_document(), get_document_structure() і get_page_content()), і ён сам аналізуе структуру, выклікаючы неабходныя інструменты і запрашаючы контэнт без ручнага выбору вузлаў. Гэта прыклад, з якога трэба выйсці для стварэння агентных рабочых практык:

    pip install openai-agents
    python3 examples/agentic_vectorless_rag_demo.py
    

    Рэжым на адказе візуальнай аналізы, без OCR. Тэпер шлях апрацоўкі дакументаў, які выкарыстоўвае візуальную аналізу, прымыкае без OCR. Адпраўкі сторанак ідуць безпасцерожна да модэлю, які працуе з візуальнымі дадзеннямі, а структура дакумента формуецца на адказе таго, што модэль бачыць на сторанцы. Гэта мае значэнне для фінансавых дакументаў, дзе распаковка балансу мае такі ж значэнне, як і тэкст. Графікі, табліцы з злучанымі клеткамі і прымечанні застаюцца недыскрэтаванымі, таму што нічога спачатку не ператвараецца ў тэкст.

    SDK на TypeScript, pageindex-js-sdk, з’явіўся на пачатку 2026 года для інтэграцыі з Node.js і інструментамі для дакументаў у інтэрнэце. Пашырэнне для нарадчага стола .mcpb, якое можна запусціць адной клікам, інсталюе PageIndex у Claude Desktop, пры чым OAuth адбываецца аўтаматычна. ChatIndex, аддзельны рэпазітарый з январа 2026 года, прыменяе тую ж ідэю індэксавання структуры да дзейнароў дзяўнікаў.

    Шырэйшыя змяны

    PageIndex являецца частыней шырэйшага пераходу ад пасыўнага выкарыстоўвання інструментаў для пошуку, якія знаходзяць все, што выглядае падобна, да актыўнага, самастоятэльнага пошуку, які аналізуе, дзе трэба шукаць. Гэта вялікія відчутныя ў інструментах для програмавання. Claude Code і Cursor адступілі ад вектарных тэхналогій RAG для коду на корыстцу актыўнага аналізу кодавой базы, і каманда PageIndex спакушаецца, што дакументы таксама будуць следаваць за гэтым напрамкам. Для структураваных дакументаў такое прыпусканне здаецца правдападобным.

    Вектарныя базы дадзеных не знікнуць. Яны быстрыя, дышэчныя і дастаткова якісныя для вельмі шырокага спектру задач. Але там, дзе правільнасць, працяйнасць і глыбокое разумеўце дакументаў ёсць непрыемлемымі, як у фінансавых аўдытах, правовых розследаваннях, медычных запісах і дотрыманні рэгуляцый, пошук на адной засадзе логічных выводам ёсць прыродна лепшым рашэннем.

    Код і дакументы знаходзяцца на https://github.com/VectifyAI/PageIndex, а дакументацыя — на https://docs.pageindex.ai/.

    Супаўязаныя матэрыялы

  • pgvector або SQL Server 2025 як сховішчы вектараў у RAG: налаштаванне, запыты і аспекты, якія трэба врачыць — Іспытанне PostgreSQL з pgvector і вбудованымі вектарамі SQL Server 2025 для RAG: налаштаванне, алгорытмы пошуку на адносе косай косы, з’еднанне з дадзеннямі бізнесу, а таксама шасць аспектаў, якія трэба уніксаваць у прымернай версіі SQL Server.
  • Разбіўка на часткі «бацька-дзеця» і іерархічны індэксаванне для лепшага пошуку ў RAG — Чаму маленькія часткі даюць правільны рэзультат, але не даюць правільнай адпаведзі, і як разбіўка на часткі «бацька-дзеця», розшырэнне без дуплікацыі і іерархічны індэксаванне вярна відновляюць кантэкст пад час пошуку ў RAG.
  • Як працюе RAG: эмбеддынгі, базы вектарных дадзеных і чанкаванне — Адступіце за адным фрагментам тэксту ад токенізацыі па шляху да абшукаў на адпаведнасць косайну, і пазнайсце, чаму чанкаванне і мадэлі эмбеддынгу вялікага значэння вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага розміру вялікага
  • RAG без фрэймворка: чанкі, рэйтынг, бюджэт, прампт — адказанне пра RAG як просты выбор токэнаў: короткі прыклад на Python з рэйтынгам на адпаведнасць словам, механізам контролю бюджэту токэнаў, а таксама тое, што на самай працы павышае якасць інтэграцыі эмбедынгаў і сховішчаў вектараў.