# 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 | 简单改写,延迟敏感 |