自动化论文搜索、筛选与下载管线,用于为大模型后训练数据收集具有边际知识、逻辑复杂性和高质量的学术论文。
uv sync复制 .env.example 为 .env,填入你的 API Key:
cp .env.example .envAIHUBMIX_API_KEY=sk-your-key-here # 必填,用于 Gemini LLM 筛选
UNPAYWALL_EMAIL=your@email.com # 推荐,用于查找付费论文的开放获取版本
NCBI_API_KEY= # 可选,提高 PubMed 速率限制(10 req/s vs 3 req/s)
S2_API_KEY= # 可选,提高 Semantic Scholar 速率限制
# 运行全部学科
uv run python -m src.main
# 只运行指定学科
uv run python -m src.main --disciplines medicine computer_engineering
# 从中间结果恢复(搜索/去重阶段已完成时跳过重复执行)
uv run python -m src.main --resume搜索(多源并行)
→ 去重 + 元数据预筛
→ LLM 粗筛(并行批次,含学科归属验证)
→ 并发下载 PDF + 提取全文
→ LLM 精筛(并行,读全文)
→ 保留通过论文的 PDF,删除其余
| 搜索源 | 策略 | 适用学科 |
|---|---|---|
| arXiv | 按学科分类标签浏览(date 排序) | CS、物理、数学、金融 |
| PubMed | 按 MeSH 术语浏览,限英文 | 医学、公共卫生 |
| Semantic Scholar | 按期刊/会议名浏览(bulk API)+ 关键词补充 | 全学科 |
各学科可在 taxonomy.yaml 中用 sources_enabled 字段覆盖全局数据源配置。
- 粗筛:10 篇/批,并行发送,每篇评分四个维度(1-5):
novelty:知识新颖性complexity:逻辑复杂度quality:论文质量discipline_fit:学科归属(低于阈值直接淘汰,解决如语言学搜到 LLM 方法论文的问题)
- 精筛:并行逐篇评估(1-10),读取 PDF 全文(不截断),输出 ACCEPT/REJECT 及推荐出题方向
按优先级逐渠道尝试:直接 OA 链接 → Unpaywall → arXiv → PMC
图片型 PDF(无文本层,需 OCR)自动丢弃。
所有参数在 config.yaml 中配置:
| 参数 | 说明 |
|---|---|
search.time_range_years |
搜索最近 N 年的论文 |
search.max_results_per_source |
每个源每个子类别最大结果数 |
search.s2_request_interval |
S2 请求间隔(秒),无 key 时建议 2-5 |
prefilter.max_citation_count |
引用数上限(排除已成主流的论文) |
prefilter.exclude_pub_types |
排除的发表类型(如 Review、Editorial) |
filter.coarse.min_discipline_fit |
学科归属最低分(1-5),低于则淘汰 |
filter.coarse.keep_top_n_per_discipline |
粗筛后每学科保留数 |
filter.fine.target_per_discipline |
精筛后每学科最大保留数 |
filter.fine.min_score |
精筛最低平均分(1-10) |
filter.fine.total_target |
总目标论文数(仅用于末尾警告) |
concurrency.llm_workers |
LLM 并行调用数(粗筛+精筛) |
concurrency.download_workers |
PDF 并行下载数 |
每个学科和子类别映射到具体的搜索源参数:
linguistics:
label: "语言学"
sources_enabled: [arxiv, semantic_scholar] # 可覆盖全局数据源
search_hints: "..." # 搜索方向提示(送入 LLM)
discipline_fit_hints: "..." # 学科边界说明(区分跨界论文)
subcategories:
morphology:
label: "形态学"
arxiv_categories: ["cs.CL"]
pubmed_mesh: ["Psycholinguistics"]
s2_fields: ["Linguistics"]
venues: ["Language", "Morphology", ...]
keywords: ["undocumented language morphology", ...]只需在 taxonomy.yaml 中添加新条目,无需修改代码。
| 学科 | 子类别数 | 主要搜索源 |
|---|---|---|
| 医疗 | 6 | PubMed + S2 |
| 金融 | 6 | arXiv (q-fin) + S2 |
| 天文/地理 | 2 | arXiv (astro-ph) + S2 |
| 计算机工程 | 8 | arXiv (cs.*) + S2 |
| 语言学 | 6 | arXiv (cs.CL) + S2 |
output/
└── {discipline}/
├── 1_search_results.json # 原始搜索结果
├── 2_deduped.json # 去重 + 预筛后
├── 3_coarse_filtered.json # 粗筛后(按分数排序)
├── 4_fine_filtered.json # 精筛后(含完整评分和推荐出题方向)
└── pdfs/ # 通过精筛的论文 PDF
uv run python -m pytest tests/ -v