Skip to content

ascendho/VisionDoc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

页证智答

image-20260503161620235

ColPali + MUVERA + Qdrant 驱动的多模态文档检索与问答系统。上传 PDF、图片或 PPTX 文件后,系统会将每页统一渲染为图像并建立视觉索引;当前网页端默认沿用 MUVERA 单向量 FDE Prefetch + ColPali 多向量 Rerank 的两阶段检索路径,再由豆包多模态大模型生成答案,并附上原页截图供溯源。最新 20 题 benchmark 显示:两阶段路径在当前小规模语料上能够稳定取得 90% final page Hit@30.7667 final page MRR,也体现出“轻量召回 + 精排复核”的双路检索设计思路;但单向量 MUVERA FDE 在本轮检索消融中取得了更高的 raw Hit@3 和 MRR。因此,两阶段路径更适合表述为具备工程扩展潜力的检索架构,而不是已被当前实验充分证明的最优默认策略。

🌟 核心特性

  • 视觉文档支持:PDF / PNG / JPG / JPEG / WEBP / PPTX,统一渲染为页面图像进入索引
  • 可切换检索架构:支持 two_stage(MUVERA 单向量 FDE Prefetch + ColPali Rerank)、colpali_onlymuvera_only 三种模式;当前网页端默认走 two_stage,其主要价值在于把轻量召回与视觉精排解耦,为更大规模语料预留扩展空间;在最新同进程 20 题 benchmark 上,two_stagecolpali_only 检索质量持平,而 muvera_only 的 raw Hit@3 更高、平均检索延迟更低
  • 归一化相关性得分:MaxSim 原始分除以查询 token 数,得分落在 0–1 区间;默认采用 score >= 0.60 作为正式证据阈值,并补入少量 near-threshold 页面,减少 final evidence 丢页
  • 复合问题支持:对以强分隔符拆出的多个子问题分别检索,再合并证据页,减少多问合并时只覆盖单一主题的问题
  • 多文档作用域查询:Scope Bar 支持同时选中多个文档进行对话,也可切回全库检索
  • 原页图片溯源:每条回答附带匹配页面缩略图网格(最多 5 列自适应),点击大图查看;卡片显示文档名、页码与相关性得分
  • 现代化 UI:欢迎页 → 聊天页平滑过渡,暗色模式,Markdown 渲染,一键复制回答

🛠️ 技术栈

层次 技术
视觉嵌入模型 ColPali v1.3(vidore/colpali-v1.3),128-D 多向量
加速检索 MUVERA 固定维度单向量 FDE(fastembed,当前参数 30720-D),Prefetch 倍率 10×
向量数据库 Qdrant(本地 Docker 或云端),单向量 FDE 检索 + ColPali MaxSim 多向量精排
大语言模型 豆包 Seed 2.0 Pro(doubao-seed-2-0-pro-260215),Volcengine ARK API
后端框架 FastAPI + uvicorn
前端 原生 HTML/JS + Tailwind CSS CDN + marked.js
PDF 解析 pdf2image + Poppler
文档转图 pdf2image + Poppler;PPTX 通过 LibreOffice soffice 先转 PDF
图像处理 Pillow(图片缓存与标准化)

📂 项目结构

RAG/
├── backend/                       # FastAPI 后端
│   ├── main.py                    # 应用入口,挂载静态前端
│   └── api/routes/
│       ├── health.py              # 健康检查
│       └── rag.py                 # 上传、对话、文件管理接口
├── benchmarks/                    # benchmark 定义与样本文档
│   ├── README.md
│   ├── rag_eval_small_draft.json
│   └── sample-documents/
├── data/                          # 本地运行产物(默认忽略)
│   ├── eval_runs/                 # 评测结果输出
│   └── qdrant/                    # embedded Qdrant 数据与原始上传文件
├── docs/                          # 项目说明文档
│   ├── system_workflow.md         # 系统流程、性能耗时与 API
│   ├── evaluation_guide.md        # 评测指标、脚本与 faithfulness 说明
│   └── project_pitch.md           # benchmark 结果与项目介绍表述
├── frontend/                      # 前端客户端
│   ├── index.html                 # 单页 HTML(Tailwind 样式)
│   └── app.js                     # 所有交互逻辑
├── scripts/                       # benchmark 起草与评测脚本
│   ├── bootstrap_rag_benchmark.py
│   ├── build_retrieval_ablation_summary.py
│   └── run_rag_eval.py
├── src/                           # AI 核心逻辑
│   ├── config.py                  # 环境变量、运行目录与模型配置
│   ├── llm_generator.py           # 调用豆包视觉 LLM 生成答案
│   ├── doc_processor.py           # 视觉文档 → 页面图像缓存(PDF/图片/PPTX)
│   └── vector_store.py            # ColPali + MUVERA + Qdrant 封装
├── tests/                         # 回归测试
├── assets/                        # README 配图等静态资源
├── README.md
└── requirements.txt

从这一版开始,仓库会把持久化运行数据统一放到 data/ 下;如果根目录里还残留旧的 qdrant_local/eval_runs/,首次运行配置或评测脚本时会自动迁移到新位置。

🚀 快速启动

1. 准备环境(推荐 Python 3.10+)

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

macOS 需要安装 Poppler 和 LibreOffice:

brew install poppler
brew install --cask libreoffice

PPTX 支持依赖 LibreOffice 提供的 soffice 转换能力;如果本机没有该命令,上传 PPTX 会直接返回可操作的错误提示。

2. 配置环境变量

在项目根目录创建 .env 文件(或直接在 src/config.py 中设置):

ARK_API_KEY=your_volcengine_ark_api_key
DOUBAO_MODEL_NAME=doubao-seed-2-0-pro-260215
QDRANT_URL=http://localhost:6333
COLLECTION_NAME=colpali-rag-collection

3. 启动 Qdrant

docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/data/qdrant:/qdrant/storage:z \
    qdrant/qdrant

推荐把 Docker 版 Qdrant 作为默认运行路径。若 QDRANT_URL 不可达,后端会自动回退到仓库内的 data/qdrant/ embedded 存储,方便本地开发或离线调试;但做 benchmark 时,建议先确认当前实例实际连接的是 Docker 暴露的 6333 端口。

4. 运行服务

python -m uvicorn backend.main:app --reload --port 8000

打开浏览器访问 http://localhost:8000

📖 使用说明

  1. 上传文件:点击左侧上传按钮,支持 PDF、PNG、JPG、WEBP、PPTX 格式
  2. 多文档管理:点击右上角文件图标查看已加载文档,可下载原文件或删除
  3. 作用域选择:上传 2 个及以上文档后,输入框上方出现 Scope Bar,可点击选中特定文档进行对话
  4. 提问:在输入框输入问题,回车或点击发送;回答下方附有相关页面截图,点击可全屏查看

📚 详细文档

README 现在只保留项目入口信息;系统流程、评测细节和项目表述拆到了 docs/ 下:

🔄 系统概览

  • 上传后端会把 PDF / 图片 / PPTX 统一转换为页面图像;PPTX 会先转成 PDF,再复用 PDF 转页图链路。
  • 每页会同时写入 ColPali 原始多向量和 MUVERA 固定维度单向量 FDE,便于支持 two_stagecolpali_onlymuvera_only 三种检索模式。
  • 当前网页端默认走 two_stage:先用 MUVERA FDE 做 Prefetch,再用 ColPali 多向量 MaxSim 精排;当前小规模 benchmark 尚未证明该路径优于另外两种模式。
  • 对话链路包含轻量 guard、复合问题拆分、多轮上下文桥接、阈值证据筛选、near-threshold 补偿和 top-1 fallback。
  • 完整端到端流程、性能拆解和 API 表见 docs/system_workflow.md

⚙️ 核心 API

方法 路径 说明
POST /api/rag/upload 上传文件并立即返回 task_id,后台异步索引
GET /api/rag/jobs/{task_id}/events 通过 SSE 订阅上传任务进度
POST /api/rag/chat 发起对话查询

完整 API 列表见 docs/system_workflow.md

📊 评测与结果概览

  • 当前正式 benchmark 为 20 题,覆盖 3 份真实 PDF / PPTX 文档。
  • 默认 two_stage 最近一轮完整结果:final_page_hit_at_3 = 0.90final_page_mrr = 0.7667citation_has_gold_evidence_rate = 0.90answer_contains_gold_answer_rate = 0.85automatic_faithfulness_avg = 1.00
  • automatic_faithfulness = 1.00 只表示回答能被返回证据页直接支撑,不代表系统整体事实正确率 100%。
  • 最新同进程检索消融显示:two_stagecolpali_only 的 raw Hit@3 / MRR 持平,muvera_only 的 raw Hit@3、MRR 和平均检索延迟最好。
  • 详细指标定义、评测命令和输出文件说明见 docs/evaluation_guide.md;当前结果和简历表述见 docs/project_pitch.md

About

基于 ColPali + MUVERA + Qdrant 的多模态视觉文档问答系统,支持 pdf、图片及 pptx 文档

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors