File size: 6,031 Bytes
1ffc301 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | # 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 | 简单改写,延迟敏感 |
|