dalgona039/TreeRAG
GitHub: dalgona039/TreeRAG
TreeRAG 是一个将 PDF 文档索引为层次化树状结构的 RAG 系统,通过深度遍历和页码级引用实现精确可溯源的问答检索。
Stars: 6 | Forks: 0
# TreeRAG
TreeRAG 是一个层次化的 RAG 系统,它将 PDF 文档索引为树状结构的 JSON,并通过可溯源到页码的引用来回答问题。
该项目包含:
- 用于上传、索引、聊天、树结构、缓存和图谱 API 的 FastAPI 后端
- 具备 DFS/Beam 遍历、可选上下文压缩以及可选交叉引用解析的 TreeRAG 推理器
- 用于多文档聊天和树结构探索的 Next.js 前端
- 用于 BM25、FlatRAG、TreeRAG-DFS、TreeRAG-Beam 及相关基线的基准/评估脚本
## 为什么选择 TreeRAG
传统的扁平检索通常会丢失章节层级。TreeRAG 保留了文档结构,并且仅遍历相关的分支。
核心理念:
- 从 PDF 构建具备页码感知的层次化索引
- 将查询路由到一个或多个已索引的文档
- 遍历树节点(DFS 或 Beam Search)
- 通过来源依据和引用提取生成答案
- 缓存响应并执行 API 速率限制,以确保稳定的服务
## 主要特性
- 具备自动文档路由的多文档查询
- 深度遍历模式(TreeNavigator 或 BeamSearchNavigator)
- 在最终生成前进行可选的上下文压缩
- 从生成的答案中提取引用
- 基于节点依据置信度的幻觉警告层
- 带有统计信息和清除端点的内存响应缓存
- API 速率限制(SlowAPI)
- 使用 Celery/Redis 的可选异步索引任务端点
- 推理图谱构建/加载端点
## 技术栈
后端:
- Python
- FastAPI
- google-genai (Gemini API)
- pypdf
- slowapi
- Redis + Celery(可选的异步任务队列)
前端:
- Next.js 16
- React 19
- TypeScript
评估:
- pytest
- benchmarks/ 下的基准测试脚本
## 仓库结构
- src/
- api/: REST 路由及请求/响应模型
- core/: 索引器、推理器、遍历、Beam Search、压缩器、基线
- middleware/: 安全标头
- repositories/: 会话持久化
- utils/: 缓存、文件验证、幻觉检测
- benchmarks/: 评估运行器、数据集、分析、指标
- frontend/: Next.js 应用
- data/
- raw/: 上传的 PDF
- indices/: 生成的索引 JSON 文件和图谱文件
- benchmark_reports/: 基准测试输出
## 前置条件
- Python 3.11+(本仓库中已使用 Python 3.13 测试)
- 用于前端的 Node.js 20+
- Gemini API key
## 快速开始(本地)
### 1) 创建环境并安装后端依赖
```
cd /Volumes/a3122a1/TreeRAG
python3 -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install -r requirements.txt
```
对于需要额外指标包的基准测试脚本:
```
pip install rouge-score rank-bm25 scipy
```
### 2) 配置环境变量
在仓库根目录创建 .env:
```
GOOGLE_API_KEY=your_key_here
```
可选的 Gemini 弹性控制(建议在免费层使用):
```
GEMINI_MIN_INTERVAL_S=13
GEMINI_MAX_RETRIES=5
```
注意事项:
- GEMINI_MIN_INTERVAL_S 通过限制请求间隔来减少 429 爆发错误
- 代码同样会在 src/config.py 中通过退避机制重试配额类错误
### 3) 运行后端
```
source .venv/bin/activate
python main.py
```
后端端点:
- API 基础地址: http://localhost:8000/api
- OpenAPI 文档: http://localhost:8000/docs
- 健康检查: http://localhost:8000/health 和 /health/deep
### 4) 运行前端
```
cd frontend
npm install
npm run dev
```
前端默认 URL: http://localhost:3000
## 快速开始(Docker)
```
cd /Volumes/a3122a1/TreeRAG
# 确保 .env 包含 GOOGLE_API_KEY
docker-compose up --build -d
```
服务:
- frontend: 3000
- backend: 8000
- redis: 6379
- celery-worker(compose 中包含的可选 worker 服务)
有关操作命令,请参阅 DOCKER.md。
## 基本 API 流程
1. 上传 PDF
```
curl -F "file=@/absolute/path/to/doc.pdf" http://localhost:8000/api/upload
```
2. 创建索引
```
curl -X POST http://localhost:8000/api/index \
-H "Content-Type: application/json" \
-d '{"filename":".pdf"}'
```
3. 查询聊天
```
curl -X POST http://localhost:8000/api/chat \
-H "Content-Type: application/json" \
-d '{
"question":"핵심 내용을 요약해줘",
"index_filenames":["_index.json"],
"use_deep_traversal":true,
"max_depth":5,
"max_branches":3,
"domain_template":"general",
"language":"ko"
}'
```
## 主要 API 端点
文档和聊天:
- GET /api/
- POST /api/upload
- POST /api/index
- POST /api/chat
- GET /api/indices
- GET /api/pdfs
- GET /api/tree/{index_filename}
- GET /api/pdf/{filename}
会话:
- GET /api/sessions
- PUT /api/sessions
缓存:
- GET /api/cache/stats
- POST /api/cache/clear
推理图谱:
- POST /api/graph/build/{document_name}
- GET /api/graph/{document_name}
异步任务(需要 Celery 可用):
- POST /api/tasks/index
- POST /api/tasks/index/batch
- GET /api/tasks/{task_id}
- DELETE /api/tasks/{task_id}
- GET /api/tasks/
## 遍历与推理行为
推理器类: src/core/reasoner.py
- 遍历算法:
- DFS (TreeNavigator)
- Beam Search (BeamSearchNavigator)
- 可选的上下文压缩
- 用于节/章引用的可选引用解析器
- 领域 prompt 模板:通用、医疗、法律、金融、学术
- 语言指令:ko/en/ja
- 缓存 key 包含 prompt 缓存版本和遍历设置
## 基准测试与评估
主要运行器:
- benchmarks/run_real_evaluation.py
示例(低成本的方向检查):
```
source .venv/bin/activate
export GEMINI_MIN_INTERVAL_S=13
python benchmarks/run_real_evaluation.py \
--systems bm25,flatrag,treerag_beam \
--limit 3 --mode online \
--output data/benchmark_reports/direction_check.json
```
脚本辅助工具:
```
bash scripts/run_online_direction_check.sh
```
注意事项:
- 在线模式会快速消耗 Gemini 配额,尤其是 TreeRAG-Beam
- 免费层的限制可能会导致 429/503 错误以及部分内容为空的答案
- 如果由于配额耗尽导致结果行为空,请在进行模型质量比较时将该次运行视为无效
## 测试
运行所有测试:
```
source .venv/bin/activate
pytest
```
运行特定测试:
```
pytest tests/test_config_resilient.py -v
```
pytest 配置位于 pytest.ini 中。
## 安全与验证
已实施的安全防护措施包括:
- 上传文件验证(扩展名、MIME、大小、路径遍历)
- 安全标头中间件
- API 速率限制
- 通过 repository 层实现会话持久化
为了保持本地开发环境的整洁,请运行:
```
bash setup-git-hooks.sh
```
## 故障排除
### 1) 429 RESOURCE_EXHAUSTED
症状:
- 基准测试中出现空响应或失败响应
- 日志中频繁出现配额错误
措施:
- 设置 GEMINI_MIN_INTERVAL_S=13(或更大)
- 减少 benchmark limit 和/或测试系统
- 在低成本检查中禁用 LLM judge
- 如果超出每日限额,请在配额重置后重试
### 2) 503 UNAVAILABLE
症状:
- 瞬时的模型过载错误
措施:
- 稍后重试(服务端拥堵)
- 保持开启重试(GEMINI_MAX_RETRIES)
### 3) 未找到已索引的文档
措施:
- 验证文件是否成功上传至 data/raw
- 为每个上传的 PDF 调用 /api/index
- 检查 data/indices 下的文件
### 4) 前端无法调用后端
措施:
- 确保后端正在 8000 端口上运行
- 在使用 Docker/生产环境时验证 NEXT_PUBLIC_API_BASE_URL
## 许可证
MIT(详见 LICENSE)。
## 致谢
本项目受树状结构和无向量 RAG 方法的影响,并作为用于层次化文档推理与评估的工程/研究代码库进行开发。
标签:AV绕过, DLL 劫持, FastAPI, RAG系统, 人工智能, 大语言模型, 安全规则引擎, 搜索引擎查询, 文档检索, 用户模式Hook绕过, 请求拦截, 逆向工具