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