引言
你是否對長篇專業文檔的向量數據庫檢索準確性感到失望?傳統的基于向量的RAG系統依賴于語義相似性而非真正的相關性。但在檢索中,我們真正需要的是相關性——這需要推理能力。當處理需要領域專業知識和多步推理的專業文檔時,相似度搜索常常不盡人意。
基于推理的RAG提供了更好的選擇:讓大語言模型能夠思考和推理,找到最相關的文檔部分。受AlphaGo啟發,Vectify AI提出使用樹搜索來執行結構化文檔檢索。
PageIndex 是一個文檔索引系統,它從長文檔構建搜索樹結構,為基于推理的RAG做好準備。
由Vectify AI開發。
PageIndex是什么
PageIndex能將冗長的PDF文檔轉換為語義樹結構,類似于*“目錄”*但專為大語言模型(LLMs)優化。
它特別適用于:財務報告、監管文件、學術教科書、法律或技術手冊,以及任何超出LLM上下文限制的文檔。
主要特點
-
層次樹結構
讓大語言模型能夠邏輯性地遍歷文檔——就像一個智能的、為LLM優化的目錄。 -
精確頁面引用
每個節點都包含其摘要和開始/結束頁面的物理索引,實現精準檢索。 -
無需人為分塊
不使用任意分塊。節點遵循文檔的自然結構。 -
適用于大規模文檔
設計用于輕松處理數百甚至上千頁的文檔。
PageIndex格式
以下是輸出示例。查看更多示例文檔和生成的樹結構。
...
{"title": "金融穩定性","node_id": "0006","start_index": 21,"end_index": 22,"summary": "美聯儲...","nodes": [{"title": "監測金融脆弱性","node_id": "0007","start_index": 22,"end_index": 28,"summary": "美聯儲的監測..."},{"title": "國內和國際合作與協調","node_id": "0008","start_index": 28,"end_index": 31,"summary": "2023年,美聯儲與..."}]
}
...
其實看到這里,我們會發現RAG之前很多框架或者算法都有類似的思想:
- 例如LlamaIndex的Node實現
- 比如Raptor的層級聚類
- 還有Mineru的PDF轉換生成Markdown,然后我們可以解析成類似具有章節信息的json數據
那PageIndex的亮點在哪里呢,其實在最后一部分“使用PageIndex進行基于推理的RAG”的實現,相比之前的Advanced和Modular RAG,Agentic RAG更加智能,接著我們往下看怎么實現的?
使用方法
按照以下步驟從PDF文檔生成PageIndex樹結構。
1. 安裝依賴項
pip3 install -r requirements.txt
2. 設置OpenAI API密鑰
在根目錄創建一個.env
文件并添加你的API密鑰:
CHATGPT_API_KEY=你的openai密鑰
3. 對PDF運行PageIndex
python3 run_pageindex.py --pdf_path /path/to/your/document.pdf
你可以通過額外的可選參數自定義處理過程:
--model 使用的OpenAI模型 (默認: gpt-4o-2024-11-20)
--toc-check-pages 檢查目錄的頁數 (默認: 20)
--max-pages-per-node 每個節點的最大頁數 (默認: 10)
--max-tokens-per-node 每個節點的最大token數 (默認: 20000)
--if-add-node-id 添加節點ID (yes/no, 默認: yes)
--if-add-node-summary 添加節點摘要 (yes/no, 默認: no)
--if-add-doc-description 添加文檔描述 (yes/no, 默認: yes)
云API (測試版)
不想自己部署?試試Vectify AI的PageIndex托管API。托管版本使用Vectify AI自定義的OCR模型更準確地識別PDF,為復雜文檔提供更好的樹結構。
在這個表單留下你的郵箱,免費獲得1,000頁處理額度。
案例研究:Mafin 2.5
Mafin 2.5是一個專為財務文檔分析設計的最先進基于推理的RAG模型。它基于PageIndex構建,在FinanceBench基準測試中達到了驚人的98.7%準確率——顯著優于傳統的基于向量的RAG系統。
PageIndex的分層索引使得能夠精確導航和提取復雜財務報告(如SEC文件和財報披露)中的相關內容。
👉 查看完整基準測試結果,了解詳細比較和性能指標。
使用PageIndex進行基于推理的RAG
使用PageIndex構建基于推理的檢索系統,無需依賴語義相似度。非常適合需要細微區分的領域特定任務。
🔖 預處理工作流示例
- 使用PageIndex處理文檔,生成樹結構。
- 將樹結構及其對應的文檔ID存儲在數據庫表中。
- 將每個節點的內容存儲在單獨的表中,通過節點ID和樹ID進行索引。
🔖 基于推理的RAG框架示例
- 查詢預處理:
- 分析查詢以確定所需知識
- 文檔選擇:
- 搜索相關文檔及其ID
- 從數據庫獲取相應的樹結構
- 節點選擇:
- 搜索樹結構以識別相關節點
- LLM生成:
- 從數據庫獲取所選節點的相應內容
- 格式化并提取相關信息
- 將組裝的上下文與原始查詢一起發送給LLM
- 生成有依據的回答
🔖 節點選擇的示例提示
prompt = f"""
給你一個問題和一個文檔的樹結構。
你需要找出所有可能包含答案的節點。問題: {question}文檔樹結構: {structure}請用以下JSON格式回復:
{{"thinking": <關于在哪里尋找的推理過程>,"node_list": [node_id1, node_id2, ...]
}}
"""
看到合理我們自然明白了,PageIndex不需要切塊向量是因為通過將文檔轉換為節點,然后用大模型進行選擇,之前RAG是檢索+排序=現在的LLM Judge。
同時這個問題就是,當多文檔或者文檔篇幅比較多的時候,LLM去做選擇成本比較高的。