科学论文语义搜索服务

一个强大的科学论文语义搜索服务,支持Zotero库集成、增量索引和交叉编码器重排名,适用于研究人员和AI助手快速检索学术文献。

  • by tofunori
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 tofunori/scientific-papers-mcp

使用说明

MCP服务器科学论文

一个强大的模型上下文协议(MCP)服务器,用于在科学论文中进行智能语义搜索 Zotero库集成, 增量索引,以及 交叉编码器重新排序.

🎯 这个MCP做什么

这 MCP科学论文 使Claude和其他人工智能助手能够搜索您的 Zotero图书馆 受Zotero MCP实现启发的高级功能:

  • Zotero图书馆集成:自动为本地Zotero存储建立索引
  • 增量索引:仅处理新的/修改的文档(更新速度快90倍)
  • 智能重复数据删除:按DOI和标题匹配删除重复项
  • 交叉编码器重新排序:元数据增强,精度提高35%
  • 丰富元数据提取:DOI、摘要、关键字、作者、出版信息
  • 混合搜索:结合语义+关键字搜索以获得最佳结果

🚀 主要特点

特性 描述 性能
增量索引 跳过未更改的文档 45分钟→ 30秒用于更新
智能重复数据删除 DOI+模糊标题匹配 索引缩小15-30%
交叉编码器重新排序 用marco重新排名前50名 准确率提高35%
元数据增强 标题2倍,摘要1.5倍权重 更好的引用查询
全文提取 支持OCR回退的PDF 支持扫描纸张
Zotero集成 自动扫描本地存储 不需要API密钥

📦 安装

# Clone repository
git clone <your-repo>
cd scientific-papers-mcp

# Install dependencies
pip install -e .

# Verify installation
python index_zotero_library.py --help

🔧 配置

MCP使用 Voyage AI 默认情况下,为了获得最佳性能。编辑 .env 文件:

# Paths (required)
DOCUMENTS_PATH=C:/Users/YourName/Zotero/storage
CHROMA_PATH=./data/chroma

# Voyage AI (default, recommended)
USE_VOYAGE_API=true
VOYAGE_API_KEY=your_voyage_key_here
VOYAGE_TEXT_MODEL=voyage-context-3
VOYAGE_MULTIMODAL_MODEL=voyage-multimodal-3

# OR use Jina API (alternative)
USE_JINA_API=false
JINA_API_KEY=your_jina_key_here
JINA_MODEL=jina-embeddings-v4

# OR use local model (fallback)
EMBEDDING_MODEL=Qwen/Qwen3-Embedding-0.6B

# Reranking model
RERANKER_MODEL=cross-encoder/ms-marco-MiniLM-L-6-v2

# Indexing options
ENABLE_INCREMENTAL_INDEXING=true
ENABLE_DEDUPLICATION=true
BATCH_INDEXING_SIZE=50

默认行为:Voyage AI(Voyage context-3)在以下情况下自动使用 USE_VOYAGE_API=true。该系统退回到Jina,然后是本地模型。

📁 项目结构

scientific-papers-mcp/
├── .env                           # Configuration (Voyage AI keys, paths)
├── pyproject.toml                 # Dependencies
├── src/
│   ├── config.py                  # Main configuration
│   ├── server.py                  # MCP server (fastmcp)
│   ├── embeddings/
│   │   ├── voyage_text_client.py  # ✅ Voyage AI client
│   │   └── voyage_hybrid_client.py # ✅ Multimodal Voyage client
│   ├── indexing/
│   │   ├── hybrid_search.py       # Search engine (Voyage → Jina → Local)
│   │   ├── zotero_indexer.py      # Zotero integration
│   │   └── ...
│   ├── models/
│   └── utils/
├── data/                          # ChromaDB collection (291MB)
│   └── chroma/
├── index_zotero_library.py        # Initial/full reindexing
├── update_zotero_index.py         # Fast incremental updates
├── validate_chunks.py             # Validation utility
└── tests/                         # Test suite
    ├── test_pdf_extractor.py
    ├── test_voyage.py            # ✅ Voyage AI tests
    └── ...

基本文件:保持 index_zotero_library.py, update_zotero_index.py, validate_chunks.py

已删除文件:旧测试文件(test_jina_*.py, test_qwen_*.py)以及过时的脚本

📚 用法

先决条件

  1. 设置Voyage AI (必填):

  2. 配置Zotero路径:

    • 编辑 .env: DOCUMENTS_PATH=C:/Users/YourName/Zotero/storage

1.首次索引

索引您的整个Zotero库:

# Full indexing (150 docs ~8-10 min)
python index_zotero_library.py

# Test with first 10 documents
python index_zotero_library.py --limit 10

# Force complete reindex (clear old data)
python index_zotero_library.py --force-rebuild

Voyage AI的预期使用时间:150份文档约8-10分钟(旧方法约45分钟)

2.快速更新(日常使用)

仅使用新的/修改的文档更新索引:

# Fast incremental update (30sec - 2min)
python update_zotero_index.py

# With verbose logging
python update_zotero_index.py --verbose

预期时间:

  • 无变化:~5-10秒(仅扫描)
  • 少量更改(1-10个文档):约30秒-2分钟
  • 许多更改(50+个文档):~5-10分钟

3.使用MCP服务器

MCP可通过以下方式在克劳德代码中自动使用 .claude.json:

{
  "mcpServers": {
    "scientific-papers": {
      "type": "stdio",
      "command": "C:/Users/thier/miniforge3/Scripts/scientific-papers-mcp.exe",
      "args": []
    }
  }
}

如果需要,手动启动服务器:

python src/server.py

或使用FastMCP:

fastmcp run src.server:mcp

🔍 搜索功能

MCP工具可用

  1. search_papers -混合语义+关键字搜索

    # Example: Search for glacier albedo research
    {
      "query": "glacier albedo feedback mechanisms",
      "top_k": 10,
      "alpha": 0.7  # 0=keyword only, 1=semantic only
    }
    
  2. search_with_reranking -使用交叉编码器增强搜索

    # 35% better precision with reranking
    {
      "query": "wildfire aerosol deposition on snow",
      "top_k": 5,
      "use_metadata_boost": true  # Boost title/abstract matches
    }
    
  3. search_fulltext -基于正则表达式的全文搜索

    # Find specific terms or patterns
    {
      "query": "albedo.*feedback",
      "regex": true
    }
    
  4. generate_rag_answer -RAG引用的来源

    # Get answer with citations
    {
      "query": "What factors affect glacier albedo?",
      "top_k": 5
    }
    

🏗️ 建筑

使用Voyage AI索引管道

┌─────────────────────────────────────────────────────┐
│         Zotero Library (C:/Users/.../storage)       │
│              ~150 folders with PDFs                  │
└──────────────────┬──────────────────────────────────┘
                   │
                   ▼
      ┌────────────────────────────┐
      │  ZoteroLibraryIndexer      │
      │  ├─ Scan library           │
      │  ├─ Extract metadata       │
      │  │   (DOI, abstract, etc)  │
      │  ├─ Check incremental      │
      │  │   (skip unchanged)      │
      │  └─ Deduplicate            │
      │      (DOI + title match)   │
      └────────────┬───────────────┘
                   │
    ┌──────────────┴───────────────┐
    │                              │
    ▼                              ▼
┌─────────────────┐      ┌──────────────────┐
│  Embeddings     │      │  BM25 Index      │
│  (Voyage AI -   │      │  (Keyword)       │
│   context-3)    │      │                  │
└────────┬────────┘      └────────┬─────────┘
         │                        │
         └──────────┬─────────────┘
                    │
                    ▼
         ┌──────────────────────┐
         │  Hybrid Search       │
         │  (α=0.5 default)     │
         └──────────┬───────────┘
                    │
                    ▼
         ┌──────────────────────┐
         │  Cross-Encoder       │
         │  Reranking           │
         │  (ms-marco-MiniLM)   │
         └──────────┬───────────┘
                    │
                    ▼
         ┌──────────────────────┐
         │  Top-K Results       │
         │  (with metadata)     │
         └──────────────────────┘

关键组件

  1. VoyageTextEmbeddingClient (src/embeddings/voyage_text_client.py)

    • Voyage AI(航行环境-3) 用于情境化嵌入
    • 比OpenAI文本嵌入3大提高14.24%
    • 与SentenceTransformer接口兼容
  2. ZoteroDocument (src/models/document.py)

    • 具有DOI、引用密钥和集合的丰富元数据模型
    • 用于最优嵌入的分层文本组合
    • 重复数据删除的标准化标题
  3. DocumentDeduplicator (src/indexing/deduplicator.py)

    • 基于DOI的精确匹配
    • 模糊标题匹配(相似度>90%)
    • 智能版本选择(已发布>预印本)
  4. IndexingStateManager (src/indexing/indexing_state.py)

    • 跟踪文件修改时间
    • 启用增量更新
    • JSON中的持久状态
  5. CrossEncoderReranker (src/indexing/reranker.py)

    • 重新排名前50名候选人
    • 元数据增强(标题2x,摘要1.5x)
    • 精度提高约35%
  6. HybridSearchEngine (src/indexing/hybrid_search.py)

    • 密集(语义)+稀疏(BM25)搜索
    • 优先级:Voyage AI→ API→ 局部模型
    • search_with_reranking() 追求最佳品质

📊 性能改进

操作 之前 之后 改进 注意事项
嵌入模型 Qwen3(本地) Voyage AI(上下文3) +14%质量 基于API,1024暗
初始索引(150个文档) ~45分钟 ~8分钟 速度提高5.6倍 Voyage AI加速
重新索引(无更改) 45分钟 ~30秒 快90倍 增量更新
索引大小 154个文档 ~130个文档 -15%重复 智能重复数据删除
搜索精度 基线 +35% 重新排名提升 交叉编码器ms marco

🧹 最近更新(2025年11月)

项目清理

代码库已被清理和组织:

  • ✅ 23个文件已删除 (过时的测试、旧脚本、临时文件)
  • ✅ Voyage AI已确认 作为主要的嵌入引擎
  • ✅ 项目结构优化 日常使用
  • ✅ 收藏大小:291 MB英寸 data/chroma/

剩余重要文件

  • index_zotero_library.py -完全(重新)索引
  • update_zotero_index.py -增量更新
  • validate_chunks.py -块验证
  • test_voyage.py -Voyage AI测试参考

已删除文件

  • 旧脚本: index_all.py, fix_and_index.py, setup_mcp.py
  • 过时的测试: test_jina_*.py, test_qwen_*.py, test_complete.py
  • 临时日志和备份文件

看 项目结构 上面的部分是完整的组织目录。

🧪 测试

# Test with 5 documents
python index_zotero_library.py --limit 5

# Test incremental update
python update_zotero_index.py --limit 10

# Clear state and start fresh
python index_zotero_library.py --clear-state --force-rebuild --limit 5

📝 索引状态管理

状态存储在 data/indexing_state.json:

{
  "indexed_files": {
    "C:/Users/.../file.pdf": {
      "date_modified": "2025-11-08T08:21:14",
      "doc_id": "ABC123XY",
      "doi": "10.1000/xyz123"
    }
  },
  "deduplicated_files": {
    "10.1000/xyz123": ["file1.pdf", "file2.pdf"]
  },
  "statistics": {
    "total_indexed": 150,
    "last_full_reindex": "2025-11-08T08:00:00",
    "last_incremental_update": "2025-11-08T08:21:14"
  }
}

🔄 推荐工作流程

  1. 首次设置:

    python index_zotero_library.py
    
  2. 每日/每周更新 (使用MCP前):

    python update_zotero_index.py
    
  3. 添加多篇论文后 (>20):

    python update_zotero_index.py
    
  4. 如果有什么东西坏了:

    python index_zotero_library.py --clear-state --force-rebuild
    

🛠️ 故障排除

问题:“未检测到任何更改”,但我添加了论文

解决方案:增量索引器检查文件修改时间。如果您在不修改文件的情况下移动了文件,请运行:

python index_zotero_library.py --force-rebuild

问题:结果中存在重复论文

解决方案:在索引过程中运行重复数据删除。重新运行:

python index_zotero_library.py --force-rebuild

问题:搜索返回不相关的结果

解决方案:使用重新排序以提高精度:

search_with_reranking(query="your query", top_k=5, use_metadata_boost=True)

📚 高级配置

禁用功能

# Disable deduplication
python index_zotero_library.py --no-dedup

# Disable incremental indexing (always reindex)
# Edit src/config.py:
ENABLE_INCREMENTAL_INDEXING=False

自定义批量大小

python index_zotero_library.py --batch-size 100

不同的嵌入模型

编辑 src/config.py:

EMBEDDING_MODEL="Qwen/Qwen3-Embedding-0.6B"              # State-of-the-art 2025 (default)
EMBEDDING_MODEL="jinaai/jina-embeddings-v3"              # Excellent alternative
EMBEDDING_MODEL="intfloat/multilingual-e5-large"         # Solid multilingual
EMBEDDING_MODEL="BAAI/bge-large-en-v1.5"                 # English only, high quality

🤝 贡献

这一实施的灵感来自 Zotero MCP 该项目已针对本地Zotero库进行了调整,并具有增强的功能。

📄 许可证

MIT许可证-有关详细信息,请参阅许可证文件

🙏 致谢