传统RAG的问题
坦率地说,基于向量的RAG存在扩展性问题。你将文档分块,嵌入所有内容,存储在向量数据库中,并希望语义相似性能够找到正确的上下文。但当你处理以下内容时:
- 数百份技术文档
- 交叉引用的内容(引用、相关章节)
- 层次信息(章节 → 节 → 小节)
向量搜索开始感觉像是在一堆针中寻找一根针。要么扩大你的上下文窗口,要么错过文档之间的关键关系。
引入无向量RAG
PageIndex架构提出了一种聪明的替代方案:将文档解析为层次JSON树,让LLM直接导航结构。没有嵌入。没有相似性搜索。只有纯粹的结构推理。
但原始方法有一个限制——它将所有内容保存在内存中。尝试同时加载数百个文档树,你会看到你的RAM挥手告别。
为什么我选择将其放在Neo4j上
我将无向量的RAG概念赋予了一个持久的基础:Neo4j图数据库。以下是变化之处:
1. 大规模持久内存
不再将JSON树加载到内存中,层次结构存储在Neo4j中。现在,您可以在不费吹灰之力的情况下查询数百万个文档。大型语言模型(LLM)从文档根节点开始,只沿着它需要的分支向下遍历。
2. 跨文档关系
这就是强大的地方。想要将文档A中的引用链接到文档B中的源头吗?只需创建一个[:REFERENCES]边。LLM可以在检索过程中遍历这些关系,为您提供一个真实的推理知识图谱——这是向量搜索无法复制的。
3. 令牌高效检索
LLM充当智能导航者。给定一个查询,它会:
-
- 识别相关的根节点部分
-
- 向Neo4j查询子节点
-
- 迭代深入,直到找到答案
-
- 完全忽略不相关的分支
与将整个文档直接放入提示中相比,这节省了大量的上下文令牌。
工作原理
图结构
每个文档在Neo4j中变成一棵树:
(Document)-[:HAS_SECTION]->(Chapter)-[:HAS_SUBSECTION]->(Section)-[:HAS_SUBSECTION]->(Subsection)
中央文档节点连接到顶级章节,这些章节递归地连接到子部分。每个节点可以存储摘要、页面引用和元数据。
三步工作流程
第一步:解析文档
uv run python main.py --pdf_path /path/to/document.pdf
_structure.json 文件,其中包含层次树。Markdown 也被支持:
uv run python main.py --md_path /path/to/document.md
第 2 步:导入到 Neo4j
uv run python -m src.database.ingest --json_path ./results/document_structure.json
JSON树将转化为您图数据库中的节点和关系。
第3步:使用代理检索进行查询
uv run python -m src.agent.retriever \
--doc_name document_structure.json \
--query "第2节的关键发现是什么?"
大型语言模型(LLM)识别相关部分,遍历图形,并返回带有页面参考的精确答案。
内部机制
技术栈
- Neo4j — 用于持久存储的图数据库
- LiteLLM — 统一的LLM接口(默认通过Groq使用
llama-3.3-70b) - PyMuPDF / PyPDF2 — PDF解析
- uv — 超快速的Python包管理
代理检索循环
检索器(src/agent/retriever.py)实现了一个多步骤推理过程:
- 根分析 — LLM 检查顶层部分以识别候选项
- 迭代深入 — 对于每个候选项,从 Neo4j 获取子节点
- 相关性过滤 — LLM 决定进一步探索哪些分支
- 答案提取 — 一旦到达叶节点,提取答案
这与向量搜索根本不同。它不是“寻找相似的片段”,而是“导航到正确的位置”。
何时使用这种方法
| 场景 | 向量 RAG | 图形驱动的无向量 RAG |
|---|---|---|
| 单文档的简单问答 | ✅ | ✅ |
| 跨文档推理 | ❌ | ✅ |
| 层次内容(手册、规格) | ⚠️ | ✅ |
| 引用/参考追踪 | ❌ | ✅ |
| 高效的令牌检索 | ⚠️ | ✅ |
| 大规模文档集合 | ❌ | ✅ |
接下来是什么
这只是基础。以下是我的计划:
- 跨文档集合的多跳推理
- 动态引用提取以自动构建
[:REFERENCES]边 - 混合搜索结合图遍历与可选的向量回退
- 流式响应以实现实时导航反馈
最终思考
向量嵌入不会消失,但它们并不是唯一的工具。对于结构化、层次化或交叉引用的内容,图驱动的无向量RAG为您提供:
- 可扩展性 — 数百万文档,零内存问题
- 推理能力 — 遍历关系,而不仅仅是相似性
- 效率 — 精确的上下文检索,最小的令牌浪费
有时,前进的最佳方式是回归结构。
🔗 项目仓库: https://github.com/TejasS1233/vectorless_RAG
💬 有问题或想法? 在评论中留言 – 我很想听听您在大规模RAG方面的思路。
如果您觉得这有用,请关注我以获取更多关于实用AI架构的深入探讨。接下来:构建跨文档图的多跳推理。