← 文章 / AI技术
pageindex 44分钟前 · 2026-10-01 10:19:14 · 1 阅读

PageIndex Flash 发布:本地极速树状索引引擎,革新长文档 RAG 检索

PageIndex Flash: 面向长文档的极速树状索引引擎,支持在 PageIndex SDK 中本地运行

我们正式发布 PageIndex Flash,一款专为长篇幅文本型 PDF设计的极速树状索引引擎。它完全在你的本地机器上运行,文档数据不出本机,且目前已集成至 PageIndex SDK 中可用。

PageIndex Flash 直接读取 PDF 自身的版面布局来构建层级树状索引,而非依赖视觉模型从零推断全文大纲。这一设计变革使得索引构建变得快速、低成本且可预测,足以应用于你持有的每一份文本型文档。

PageIndex Flash 已完全开源,并成为 SDK 本地模式的默认索引器,将完整的基于推理的 RAG 工作流带到你的本地机器上。你可以构建树状索引、存储文档、执行基于推理的检索,并借助你偏好的 LLM 和 API 密钥与长文档交互,支持页级引用且无需向量数据库。

GitHub 仓库Colab 笔记本快速上手

一条命令即可安装:

pip install -U pageindex

PageIndex Flash 专为本地运行设计。它使用你自己的模型 API 密钥,所有索引保留在你的本地磁盘上,且无需向量数据库,非常适合处理私有及受监管的文档工作流。本地流水线直接读取 PDF 并跳过 OCR 步骤,因此仅支持文本型 PDF。对于扫描件或以图片为主的文档,我们建议使用 PageIndex Cloud,它会在构建树状索引前执行 OCR 和图像理解。

什么是 PageIndex?

大多数 RAG 系统会把文档切成固定大小的块,再通过向量相似度来检索。这种方式有用,但相似不等于相关。在长篇专业文档里,真正回答问题的段落,用词可能和问题完全不同;而语义上相近的段落,含义虽然接近,却未必与任务真正相关。财报、法规、技术手册和教科书这类文档,往往需要结合上下文、领域知识和多步推理,才能找准证据。

PageIndex 采用了另一条思路。它把每份文档组织成层级树形索引,然后让 LLM 在这棵树上推理——就像人类读者借助目录和章节结构翻到正确的页码。这样,检索就拆成了两个阶段:先建树,再搜树:

阶段一 —— 为文档构建树形索引输入 report.pdf —— 一份 120 页的纯文本 PDF,在本地完成索引一份 120 页的 PDF 进来了——有标题、章节、页码,但机器没法直接导航。 阶段二 —— 在树中搜索相关信息查询 2023 年的营业利润率是多少?在文档哪里写的?问题来了。不需要 embedding,也不需要分块索引——只需要文档树。2023 年营业利润率为 18.4%。<cite doc="report.pdf" page="43"/>

在 SDK 中使用 PageIndex Flash

我们开发了 PageIndex Flash,用来加速纯文本 PDF 的树形索引构建。它现在是 PageIndex SDK 本地模式的默认索引方式:

import os
from pageindex import PageIndexClient

os.environ["OPENAI_API_KEY"] = "your-openai-key"

client = PageIndexClient(
    index="gpt-5.6-luna",
    chat="gpt-5.6-sol",
)

doc_id = client.submit_document("report.pdf")["doc_id"]

messages = "What benchmarks are used?"

for chunk in client.chat(messages, doc_id=doc_id, stream=True):
    print(chunk, end="", flush=True)

索引构建和文档检索的需求不同,所以 SDK 允许分别配置。

  • 索引模型负责生成节点摘要并协助优化树结构,用一款基础、高性价比的模型通常就够了。
  • 对话模型负责搜索树、判断相关性、阅读证据并给出最终答案,建议在准确率和成本预算内选最强的模型。

这种分离设计既降低了一次性的索引成本,又不影响后续检索的质量。同时,它也允许在更换对话模型时无需重建文档索引。

PageIndex Flash 正是围绕这一分离机制构建的。由于 PDF 布局已提供结构化信息,索引模型无需重构大纲,只需总结那些已定位的章节。因此,一个低成本模型就足以生成一棵在检索中表现稳定的树,而在此阶段升级到更大的模型带来的收益微乎其微。

在基准测试中,我们采用了廉价模型 gpt-5.6-luna 作为索引模型——与上方代码片段所示一致。使用它进行索引的成本约为每页 $0.001。一本 1000 页的教科书首次索引成本略高于 1 美元,之后同一棵索引树即可服务于所有查询。

在涵盖 9 至 1098 页的基准文档中,索引耗时约13 秒至 4.5 分钟。

Indexing time against document length

该索引树包含标题、页码范围、摘要及嵌套章节。它充当专为 LLM 搜索优化的目录,同时便于开发人员理解。

查询成本与准确性

PageIndex OSS 基准测试评估了上述相同的本地配置:使用 PageIndex Flash 索引的 PageIndexClient()。

该基准测试包含 34 份 PDF(共 1945 页)上的 62 个查找问题,数据源自 MMLongBench-Doc-V2。所有答案均为正文中陈述的事实,因此错误结果反映的是检索或阅读失败,而非开放式推理分歧。

Query accuracy against average cost per question

在同一模型内,增加推理努力程度会形成清晰的准确性阶梯,而成本水平保持相对一致。切换到更大的模型可进一步提升性能边界,但通常会使单问题成本增加一个数量级。这为团队提供了实用的部署调优方式:先根据目标预算选择模型家族,再根据所需准确性调整推理努力程度。

在树结构上进行检索,比直接把整份文档塞给模型要便宜得多。原生喂入同一份 PDF,52 页的文件成本高出 2.1 倍,420 页时则高出 16.6 倍;而一旦超过约 800 页,内容甚至无法再装进上下文窗口。

每次查询的成本,PageIndex 检索与原生 PDF 输入,按文档长度划分

完整结果、源文档以及基准测试执行工具,都可以在 基准测试仓库 中找到。

扫描版及图片密集型 PDF:使用 PageIndex Cloud

直接从 PDF 中提取结构,是 PageIndex Flash 提速的关键,但也将其限制在了基于文本的文件上。扫描页没有文本层,也没有标题元数据——它只是一张文档图片,而非文档本身——因此 PageIndex Flash 无内容可解析。要在这一情况下恢复大纲,需要调用视觉模型来阅读页面并识别其布局,这正是构建索引树之前,PageIndex Cloud 所执行的操作。同理,若文档的含义主要承载在图表、表格和示意图而非正文中,也适用此方案。

针对这类文档,我们推荐使用 PageIndex Cloud,切换起来只需修改一行代码。将 index 指向 cloud,配置好 PageIndex API key,其余工作流完全保持不变:

import os
from pageindex import PageIndexClient

os.environ["PAGEINDEX_API_KEY"] = "your-pageindex-key"
os.environ["OPENAI_API_KEY"] = "your-openai-key"

client = PageIndexClient(
    index="cloud",
    chat="gpt-5.6-sol",
)

doc_id = client.submit_document("report.pdf", wait=True)["doc_id"]

messages = "What benchmarks are used?"

for chunk in client.chat(messages, doc_id=doc_id, stream=True):
    print(chunk, end="", flush=True)

这两种模式的区别,不仅在于索引运行在哪里:

能力本地云端
最佳适用场景带有真实文本层的文本型 PDF扫描件、图片密集型及大型文档集合
索引本地运行由 PageIndex Cloud 管理
存储本地存储托管云存储
对话模型你的模型你的模型
引用页级行级
OCR 和图像理解—支持
多文档规模手动处理PageIndex File System
MCP server—支持

将 PageIndex 集成到你的 Agent 工作流

PageIndex 可以轻松接入你已有的 agent,而无需接管其控制流程。本地模式和云端模式暴露相同的接口,因此无论索引是在你机器上由 PageIndex Flash 构建,还是由 PageIndex Cloud 构建,下面的集成代码都完全一样。

以 OpenAI Agents SDK 为例,客户端负责提供工具定义、配套的系统指引,以及作为对话开头的文档上下文,直接复用前面的 client 和 doc_id:

from agents import Agent, Runner

agent = Agent(
    name="PageIndex",
    instructions=client.agent_instructions(),
    tools=client.as_openai_tools(),
    model="gpt-5.6-sol",
)

messages = [
    {"role": "user", "content": client.document_context(doc_id)},
    {"role": "user", "content": "What benchmarks are used?"},
]

result = Runner.run_sync(agent, messages)

document_context(doc_id) 将所选文档的上下文作为单独的第一条用户消息传入。as_openai_tools() 以模型提供商自己的工具格式返回树搜索工具,agent_instructions() 则提供指导模型如何遍历树的提示词——这样 agent 就能基于文档结构进行推理,而你无需编写任何检索逻辑。

同一个客户端还支持 Anthropic SDK tool runner、Claude Agent SDK、LangChain 和 PydanticAI,并且可以将工具暴露为普通 Python 函数,用于不在上述列表中的其他框架。各变体的详情请参阅 agent 集成文档。

完全开源

PageIndex Flash 完全开源,本地模式的其他部分也是如此。PageIndex Flash 的索引构建、基于推理的树搜索、文档对话和页级引用都放在 GitHub 上的 PageIndex 仓库中,你可以逐行阅读检索逻辑、离线运行整个流水线,并将其适配到自己的 agent 中。

完整的 API 文档见官方文档。若希望在不安装任何软件的情况下体验基于推理的检索功能,可直接打开PageIndex Chat。如需将索引和存储迁移至托管服务,请申请PageIndex Cloud API 密钥。

GitHub 仓库Colab 演示 Notebook快速开始
原始来源: pageindex

评论 (0)