heyingyue's picture
Add docs/ADR.md
1ffc301 verified
# ScholarMind 技术选型决策记录 (ADR)
## ADR-001: PDF解析引擎选择 MinerU 2.5 VLM
### 背景
需要解析1000+篇学术PDF论文,包含大量公式、表格、复杂多栏布局。
### 决策
主引擎: MinerU 2.5 VLM;快速通道: PyMuPDF (纯数字PDF)
### 依据
| 指标 | MinerU 2.5 | Marker | Nougat | 要求 |
|------|-----------|--------|--------|------|
| 文本精度 (Edit Distance↓) | **0.047** | 0.080 | 0.365 | <0.1 |
| 公式识别 (CDM↑) | **88.46** | 17.6 | 15.1 | >70 |
| 表格识别 (TEDS↑) | **88.22** | 67.6 | 39.9 | >75 |
| 吞吐 (A100 pg/s) | 2.12 | ~5 | ~0.5 | >1 |
MinerU 2.5 在所有关键指标上全面领先,是学术论文解析唯一达到生产级精度的开源方案。
### 来源
- OmniDocBench (CVPR 2025, arxiv:2412.07626)
- MinerU 2.5 论文 (arxiv:2509.22186)
---
## ADR-002: 知识抽取采用两阶段策略 (GLiNER + LLM)
### 背景
需要从论文中抽取学术实体(方法、数据集、指标等)和关系,支持本地和API模型。
### 决策
Stage 1: GLiNER (零样本NER, 440M参数, 本地)
Stage 2: LLMGraphTransformer (关系抽取, 本地/API LLM)
Stage 3: Graphusion (实体融合+冲突消解)
### 依据
- **GLiNER vs ChatGPT NER**: GLiNER F1=47.8 vs ChatGPT F1=36.5 (20个NER基准平均)
- **GLiNER**: 零样本、自定义标签、440M参数本地运行,不依赖API
- **LLMGraphTransformer**: LangChain原生集成,支持strict_mode约束抽取schema
- **Graphusion**: 比naive抽取在下游QA准确率提升9.2% (arxiv:2410.17600)
### 替代方案
- REBEL (seq2seq, 400M): 在Wikipedia上训练,不适合学术文本
- ReLiK: 学术界SOTA但生态集成不如LangChain方案
- 纯LLM抽取: 成本高(1000篇×API费用), 且小模型(<13B)噪声大
### 来源
- GLiNER (arxiv:2311.08526)
- Graphusion (arxiv:2410.17600)
- SciER数据集 (arxiv:2410.21155)
---
## ADR-003: 图数据库选择 Neo4j 5.x Community
### 背景
存储学术知识图谱,支持实体/关系查询、子图检索、向量搜索。
### 决策
Neo4j 5.x Community Edition
### 依据
- **LangChain/LlamaIndex原生集成**: 开箱即用的GraphRAG支持
- **Cypher查询语言**: 最成熟的图查询生态
- **向量索引**: Neo4j 5.x 原生支持向量索引,无需额外组件
- **全文索引**: 内置Lucene全文搜索
- **APOC/GDS插件**: 社区检测、PageRank等图算法
- **生态工具**: Neo4j Browser (可视化), neo4j-labs/llm-graph-builder (参考实现)
### 替代方案
- ArangoDB: 多模型优势,但LangChain集成不如Neo4j
- NebulaGraph: 更适合10亿+节点规模,当前场景(~100K节点)不需要
- Kuzu: 嵌入式轻量,但生产特性(HA、备份)不足
### 规模评估
1000篇论文预计: ~50K实体节点, ~200K关系边 → Neo4j Community轻松承载
---
## ADR-004: 向量数据库选择 Qdrant
### 背景
存储文本嵌入向量,支持Dense+Sparse混合检索。
### 决策
Qdrant (Rust核心, 原生Hybrid搜索)
### 依据
- **性能**: 3000+ RPS, p99<10ms (HNSW+标量量化)
- **原生Hybrid**: 同一Collection支持Dense+Sparse向量,无需外部BM25
- **简单部署**: 单Docker容器,无Zookeeper/etcd依赖
- **Disk-based HNSW**: 内存友好,适合1M+向量
- **Payload过滤**: 支持元数据过滤(paper_id, section, year等)
### 替代方案
- Milvus: 更适合>10M向量的分布式场景,运维复杂度更高
- Weaviate: API设计好但资源占用较高
- ChromaDB: 无分片/HA,不适合生产
- FAISS: 仅库不是服务,需要自建API层
### 规模评估
1000篇论文 × ~40 chunks/paper × 1536维 = ~40K向量 → Qdrant单节点轻松承载
---
## ADR-005: 检索策略采用三路混合 + RRF + Cross-Encoder
### 背景
学术问答涉及事实查询、多跳推理、全局分析等多种类型。
### 决策
1. 三路检索: Dense向量 + Sparse BM25 + 知识图谱
2. 融合: Reciprocal Rank Fusion (RRF)
3. 重排: BAAI/bge-reranker-large (Cross-Encoder)
4. 查询增强: HyDE (假设文档嵌入)
### 依据
- **RAG+GraphRAG融合 > 单一方案**: +6.4%准确率 (arxiv:2502.11371)
- **bge-reranker-large**: 实验验证的共识最优重排器 (arxiv:2502.11371)
- **HyDE**: 零成本+10 NDCG提升 (arxiv:2212.10496)
- **256 token分块**: 实验验证最佳分块大小 (arxiv:2502.11371)
- **RAPTOR层次树**: 专为层级文档设计, +20%准确率 (arxiv:2401.18059)
---
## ADR-006: Agent编排选择 LangGraph
### 背景
需要多Agent协作处理复杂学术问答,支持条件分支和循环。
### 决策
LangGraph (有状态图Agent编排)
### 依据
- **有状态图**: 天然支持条件路由、循环(自检→补充检索)
- **持久化**: 可持久化Agent状态,支持长对话
- **流式输出**: 原生支持SSE/WebSocket流式
- **LangChain生态**: 与LangChain检索器、工具无缝集成
- **生产级**: LangGraph Server提供REST API部署
### 替代方案
- smolagents: 更简单但缺乏复杂状态管理
- AutoGen: 偏向多Agent对话,不如图结构灵活
- CrewAI: 角色定义好但底层编排不如LangGraph灵活
---
## ADR-007: LLM接入层选择 LiteLLM
### 背景
需要同时支持本地(vLLM/Ollama)和外部API(OpenAI/Anthropic/DeepSeek),不同任务使用不同模型。
### 决策
LiteLLM Proxy Server (统一OpenAI兼容接口)
### 依据
- **统一接口**: 100+ LLM提供商统一为OpenAI格式
- **路由策略**: latency-based, cost-based, model-specific
- **Fallback**: 本地模型失败自动切换API
- **成本追踪**: 内置token计数和费用统计
- **缓存**: Redis缓存重复请求
- **速率限制**: 防止API配额耗尽
### 任务-模型映射
| 任务 | 模型选择 | 原因 |
|------|---------|------|
| 知识抽取(NER/RE) | 本地 Qwen2.5-14B | 批量处理,成本敏感 |
| 答案生成 | GPT-4o-mini | 生成质量要求高 |
| 意图分类 | 本地 Llama-3.1-8B | 简单任务,延迟敏感 |
| 实体融合 | GPT-4o-mini | 需要强推理能力 |
| HyDE查询改写 | 本地 Llama-3.1-8B | 简单改写,延迟敏感 |