这个工具从一个简单的想法开始:自动追踪压气机领域的最新论文,省去手动查文献的麻烦。从第一行代码到现在的完整系统,经历了多次数据源迁移、API 限速对抗、前端重设计,以及一个越来越完整的 AI 反馈闭环。这里记录了整个过程。
压气机稳定性是一个发文量适中、高度专业的细分领域。相关论文主要集中在 AIAA 和 ASME 的四本期刊里,但没有一个工具能自动追踪这些期刊、筛选相关论文、用中文告诉你"这篇在说什么"。
目标很明确:每天自动拉新论文,AI 分析内容和相关度,用网页展示结果。
第一版用 arXiv 和 Semantic Scholar 作为数据来源。实际运行时,5 个关键词搜索全部返回 429(Too Many Requests),0 篇论文入库。arXiv 不收录 AIAA/ASME 期刊论文;Semantic Scholar 对批量请求非常不友好。
OpenAlex 是一个开放的学术元数据库,支持按期刊 ISSN 过滤,API 慷慨且无需注册。第一次运行拿到 206 篇候选论文,彻底解决了限速问题。
这次迁移也重新设计了抓取逻辑:不再靠关键词在全库搜索,而是先锁定期刊、再在期刊内搜索关键词,精度大幅提升。
最初用 Python 内置的静态文件服务器,只能读文件,无法写回。要实现"写评价"功能,必须有一个能接收 POST 请求的服务器。于是写了 server.py,用 Flask 替代静态服务器。
替换时需要先杀掉旧进程释放 8000 端口——这就是你在开发过程中看到大量 taskkill 命令的原因,不是在删什么重要东西,只是在踢走占位的旧进程。
流水线在处理中文日志时多次因为 UnicodeEncodeError 崩溃,原因是 Windows 默认终端用 GBK 编码,而脚本输出了 UTF-8 字符。第一次批量处理跑到 36 篇时中断,修复编码后才顺利跑完全部 187 篇。
最初 DeepSeek 只生成一段中文综述。扩展为六个字段:中文综述、研究方法、创新点、主要结论、局限性、相关度理由。同时新增全文模式:如果能获取 PDF,优先基于全文分析;否则基于摘要。
尝试用 Unpaywall 获取开放获取 PDF,结果发现 AIAA/ASME 期刊几乎全是付费墙,实际获取 0 篇。代码仍然保留,等待未来通过机构账号接入。
在每篇论文卡片里可以写评价,评价保存到 annotations.json。下次流水线运行时,系统会把这些评价注入 DeepSeek 的系统提示词,让 AI 参考用户历史判断来校准新论文的相关度。
这是这个工具最核心的设计:用的越多,越符合你的研究口味。
自动识别的高频作者(标 ★)点击后没有论文显示。根因:tag_groups() 只把预设课题组的名字写进 paper.groups 字段,★ 作者的名字从来没写进去。过滤逻辑检查 p.groups.includes(activeGroup),当然找不到。
修复方案:前端过滤时检测 groupMeta.preset === false,改为在 p.authors 里做字符串匹配,绕过 groups 字段。
原版进度面板直接把 Python 日志文本堆出来,不直观。重新设计为三步骤可视化:抓取 → AI 分析(含标题滚动和进度条)→ 写入,完成后显示"新增 N 篇 · 跳过 M 篇"汇总。原始日志折叠到底部,需要时可以展开。
每张 Group 卡片加 ✎ 按钮,可以修改名称、机构、PI 姓名。自动识别的 ★ 孙大坤 可以直接改成"孙大坤课题组 · 北航",paper 数(7篇)保持不变,过滤逻辑自动适配 custom_groups.json 里的 pis 字段匹配作者。
打开浏览器 → 点击右上角"▶ 更新检索" → 等待几分钟 → 新论文自动入库、AI 分析完成、Groups 更新。不需要打开终端,不需要写代码,刷新浏览器后进度状态自动恢复。
fetch_papers.py 里 authorships 列表有一个 [:4] 切片,导致每篇论文只保存前 4 位作者。发现问题的契机:Dakun Sun 的论文通常排在最后的 Xiaofeng Sun 从未出现在作者列表里。
修复分两步:①删掉 [:4],让未来抓取获取全部作者;②写了 backfill_authors.py,通过 DOI 逐篇重新查询 OpenAlex,把已有 242 篇论文的作者列表全部补全(105 篇有更新)。
原版流水线完全串行:每条 OpenAlex 请求之间 sleep(1),DeepSeek 调用逐篇等待。重构为:
fetch_papers.py 用 ThreadPoolExecutor(8) 并发所有 keyword×journal 查询,Unpaywall 也并发(10线程);process_with_ai.py 用 ThreadPoolExecutor(5) 并行调用 DeepSeek。整体流水线速度提升约 5-8 倍。
原有关键词漏掉了整个进气畸变方向,以及 fan(而非 compressor)的激盘模型文献。补入 4 个关键词:inlet distortion compressor、circumferential distortion compressor、actuator disk model fan、total pressure distortion turbomachinery。每次查询上限从 25 提高到 50。
新增 AI CHAT 标签页。可以直接问"库里有没有做激盘模型的论文"、"Dakun Sun 的研究方向是什么"——系统先在本地论文库做关键词检索,把最相关的 8 篇连同摘要送给 DeepSeek,回答实时流式输出。
从 OpenAlex 抓取 1970–2025 年历史论文(2000+ 篇),按 10 个研究话题 × 5 年间隔构建热力图。每个格子由 DeepSeek 生成中文综述。
布局从单栏改为左右分栏(60/40):左侧热力图全宽,右侧常驻详情面板。使用期刊风格的单色绿渐变色阶,全局统一缩放。顶部双行表头(年代 + 5 年细分),底部时间轴箭头。
原始 18 个关键词过于具体(如"circumferential distortion compressor"),要求所有词同时出现,漏掉大量论文。重构为 17 个短词优先(如"tip clearance"、"distortion"),靠 AI 评分过滤不相关内容。论文库从 400 篇增至 2500+。
通过网络调研,把自动识别的 55 个 ★ 作者条目合并为 23 个有实际归属的课题组。按地区分组(北美 / 欧洲 / 中国 / 工业界),每张卡片显示 PI 姓名。修复了 PI 匹配逻辑中子串方向反转的 bug。
代表性课题组:Cambridge Whittle Lab(98 篇)、MIT GTL(85 篇)、Purdue Compressor Lab(50 篇)。
2500+ 篇论文 · 23 个课题组 · 10 个研究话题 · 50 年历史趋势 · AI 对话检索 · GitHub Actions 自动更新。
接下来的可能方向:对接机构账号获取全文、增加邮件推送、接入更多期刊。
基于论文库(— 篇)的智能检索助手 · DeepSeek 驱动 · 优先检索已有论文,找不到时告知
一个面向压气机气动热力学领域的自动化学术监控系统。每天自动抓取 AIAA / ASME 四本核心期刊的最新论文,由 DeepSeek AI 做深度分析,并通过本页面呈现结果。
系统分为三个独立模块,按顺序串联运行:
调用 OpenAlex API,按期刊 ISSN 精确过滤,增量拉取 2020 年至今的新论文。每篇记录标题、摘要、作者、DOI、发表日期、期刊名。
调用 DeepSeek(deepseek-chat)对每篇新论文进行分析,生成中文综述、研究方法、创新点、主要结论、局限性和相关度评分(0–5 分)。低于阈值(默认 2 分)的论文会被过滤。
如果用户写过评价标注,这些内容会自动注入 AI 的系统提示,使相关度判断越来越符合个人研究偏好。
合并新旧论文、按日期倒序、只保留最新 500 篇,同时匹配课题组标签、统计高频作者,写入 data/papers.json 和 data/groups.json。
| 期刊 | 出版商 | ISSN |
|---|---|---|
| Journal of Turbomachinery | ASME | 0889-504X |
| J. Eng. Gas Turbines and Power | ASME | 0742-4795 |
| Journal of Propulsion and Power | AIAA | 0748-4658 |
| AIAA Journal | AIAA | 0001-1452 |
关键词在 scripts/config.py 的 KEYWORDS 列表中配置,目前包含:压气机稳定性、叶尖间隙、机匣处理、旋转失速等核心方向。
实时过滤,同时匹配标题、中文摘要、作者名。
入库日期(默认)/ 发表日期 / 相关度,三种排序方式。
可筛选"只看未读"或"只看已读",配合已读标记使用。
点击顶部标签栏按研究方向分类过滤(叶尖间隙 / 失速 / 数值模拟…)。
每张论文卡片包含:
| 字段 | 说明 |
|---|---|
| 相关度徽章 | 核心方向高度相关相关对应 5 / 4 / 3 分,左侧彩色竖条为视觉辅助 |
| ◈ 期刊名 | 来自 OpenAlex 的发表期刊全称 |
| 课题组标签 | 论文作者匹配预设课题组后自动打上 |
| 中文综述 | DeepSeek 基于摘要生成的 80–150 字中文概述 |
| 研究方法 / 创新点 / 主要结论 / 局限性 | DeepSeek 深度分析的四个结构化字段 |
| 入库日期 | 本系统首次检索该论文的日期 |
| 标记已读 | 点击切换已读状态,状态持久保存在服务器端 |
| 写评价 | 可针对论文写个人评注,下次运行流水线时 AI 会参考这些评价调整相关度判断 |
追踪重要课题组的发文动态,分为两类:
在 config.py 中手动配置 PI 姓名,系统按作者名匹配。目前包含 Greitzer(MIT)、Nicole L. Key(Purdue)、Chunill Hah(NASA Glenn)等 6 个课题组。
在现有论文库中,发文量 ≥ 3 篇且不在预设名单中的作者,会被自动识别为值得追踪的高频作者,以 ★ 标记。
点击任意课题组卡片,Papers 标签页会自动切换并过滤出该组的论文。
scripts/config.py 的 RESEARCH_GROUPS 列表中补充 name、institution、pis 三个字段,下次运行流水线后生效。在论文卡片底部点击"+ 写评价",输入你对这篇论文的评价,例如:"这篇关于非对称机匣处理的方法和我们的思路很接近,重点关注其实验验证部分。"
下次运行 run_pipeline.py 时,系统会读取所有带评价的标注,将其整合进 DeepSeek 的系统提示词,让 AI 参考你的历史评价来校准新论文的相关度判断。
随着标注积累,AI 对"你认为相关"的论文会逐渐形成更准确的判断,减少噪音,聚焦核心方向。
| 想改的内容 | 动哪个文件 | 改哪里 |
|---|---|---|
| 关键词(搜索词) | scripts/config.py | KEYWORDS 列表 |
| 监控的期刊 | scripts/config.py | TARGET_JOURNALS 列表 |
| 预设课题组 | scripts/config.py | RESEARCH_GROUPS 列表 |
| AI 分析的分类标签 | scripts/config.py | CATEGORIES 列表 |
| 相关度阈值 / 抓取数量 | scripts/config.py | MIN_RELEVANCE、MAX_PAPERS_PER_QUERY |
| AI 提示词 / 分析字段 | scripts/process_with_ai.py | ABSTRACT_TEMPLATE / FULLTEXT_TEMPLATE |
| 论文卡片显示内容 | index.html | renderPaper() 函数 |
| 过滤 / 排序逻辑 | index.html | render() 函数 |
| 配色 / 字体 / 布局 | index.html | 顶部 <style> 里的 CSS 变量(:root) |
| 后端 API 端点 | scripts/server.py | 用 @app.route() 新增路由 |
| AI 对话的系统提示 | scripts/server.py | CHAT_SYSTEM 字符串 |
打开 scripts/config.py,在 KEYWORDS 列表末尾追加一行:
关键词用英文,OpenAlex 会在四本期刊的标题+摘要里搜索。保存后点"▶ 更新检索",新关键词匹配到的论文会被抓取并经 AI 分析入库。
在 config.py 的 TARGET_JOURNALS 里加一行,需要提供期刊的 ISSN(在期刊官网或 OpenAlex 上查):
ISSN 是唯一标识,必须正确,否则过滤后返回 0 篇。可以先去 api.openalex.org/works?filter=primary_location.source.issn:XXXX&per-page=3 验证一下。
在 config.py 的 RESEARCH_GROUPS 末尾追加:
pis 是匹配列表,系统会检查论文作者字段里是否包含任意一个 PI 姓名(大小写不敏感)。建议同时加"姓 首字母"和"全名"两种格式,覆盖不同数据库的记录方式。修改后需重跑流水线(标签在入库时打)。
也可以直接在网页的 GROUPS 标签页点 ✎ 按钮在线编辑,编辑结果存入 data/custom_groups.json,不需要重跑流水线,立即生效。
打开 scripts/process_with_ai.py,找到 ABSTRACT_TEMPLATE(仅有摘要时用)或 FULLTEXT_TEMPLATE(有全文时用)。
JSON 格式里每个字段后面的注释是字数要求,可以改。比如要让"创新点"更聚焦:把 "40~70字,与前人工作相比的核心创新点" 改成 "40~70字,重点说明与 Moore-Greitzer 框架相比的创新"。
打开 index.html,搜索 function renderPaper。这个函数负责把一篇论文的 JSON 数据渲染成 HTML 卡片。
每个字段的 key 和 papers.json 里的字段名对应,比如 p.summary_zh 是中文综述,p.method 是研究方法,p.relevance 是相关度分数。想隐藏某个字段,删掉对应的 HTML 模板字符串即可。
在 index.html 里搜索 function render()。这个函数读取当前的过滤条件(搜索词、标签、已读状态、课题组),过滤 papers 数组,再排序,最后调用 renderPaper 逐篇渲染。排序逻辑在 sortSel.value 的 switch 块里。
在 index.html 顶部的 <style> 里找 :root { }。所有颜色都是 CSS 变量,改 --bg(背景)、--gold(金色强调)等即可全局生效。
每篇论文是一个 JSON 对象,包含以下字段:
| 字段名 | 来源 | 说明 |
|---|---|---|
| id | 系统生成 | 标题的 MD5 哈希前 12 位,用于去重 |
| title | OpenAlex | 英文论文标题 |
| abstract | OpenAlex | 英文摘要(从倒排索引还原) |
| authors | OpenAlex | 作者列表(全部,不截断) |
| date | OpenAlex | 发表日期,格式 YYYY-MM-DD |
| url | OpenAlex | DOI 链接 |
| venue | OpenAlex | 期刊全称 |
| pdf_url | Unpaywall | 开放获取 PDF 链接(目前大多为空) |
| fetched_at | 系统生成 | 首次入库日期,用于"NEW"标记 |
| groups | run_pipeline | 匹配到的预设课题组名称列表 |
| summary_zh | DeepSeek | 80–150 字中文综述 |
| method | DeepSeek | 研究方法描述 |
| innovation | DeepSeek | 创新点 |
| conclusions | DeepSeek | 主要结论 |
| limitations | DeepSeek | 局限性 |
| tags | DeepSeek | 从 CATEGORIES 里选的 1–3 个分类标签 |
| relevance | DeepSeek | 0–5 分,低于 MIN_RELEVANCE 的论文不入库 |
| relevance_reason | DeepSeek | 相关度评分理由(一句话) |
| has_fulltext | DeepSeek | 是否基于全文分析(目前均为 false) |
最常见原因:所有抓回来的论文 ID 已存在于 papers.json,全部被增量跳过。在终端直接运行 python fetch_papers.py 看原始抓取数量;如果有新论文但没入库,通常是 MIN_RELEVANCE 阈值过高(DeepSeek 给分低于 2)。
先确认它在四本目标期刊之一。如果是,说明关键词没有覆盖它的标题/摘要——把论文里的核心术语加入 KEYWORDS,再更新检索即可。也可以通过 AI CHAT 提问,AI 会告诉你库里有没有,以及是否需要新关键词。
检查 .env 文件里 DEEPSEEK_API_KEY 是否正确,账户是否有余额。API 调用失败时该篇论文会被跳过(不中断整体流程),日志会打印警告。
在终端运行:
找到 PID 后:
再重新启动 python server.py 即可。
删除 data/papers.json,重新运行流水线。所有论文会被重新抓取并经 AI 分析。注意:annotations.json(你写的评价)不会被清空,建议先备份。
每个版本做了什么、遇到什么问题、为什么这么决策,详见 BUILD 标签页。
| 配置项 | 说明 |
|---|---|
| DEEPSEEK_API_KEY | 在 .env 文件中设置,访问 platform.deepseek.com 获取 |
| GITHUB_TOKEN | 在 .env 文件中设置,用于抓取 GitHub 仓库数据(可选) |
| MIN_RELEVANCE | config.py 中,低于此分数的论文被过滤,默认 2 |
| MAX_PAPERS_PER_QUERY | config.py 中,每个关键词 × 期刊组合最多抓取篇数,当前 50 |
访问 http://localhost:8000。服务器提供静态文件 + 标注 API + AI 对话,需要保持运行状态。
把散落的脚本整理成 scripts/ 和 data/ 两个目录。配置好 .env 文件存放 DeepSeek API Key,用 arXiv + Semantic Scholar 作为数据来源跑第一次流水线。
arXiv 和 Semantic Scholar 都在大量请求时返回 429(限速)错误,5 个关键词全部失败,0 篇论文入库。问题根本在于这两个 API 对高频调用不友好。
换成 OpenAlex API:按期刊 ISSN 精确过滤 AIAA/ASME 四本核心期刊,不需要注册、不限速、直接返回结构化数据。第一次运行拿到 206 篇候选论文。
用 Python 内置的 python -m http.server 在本地起了一个静态文件服务器,把 data/papers.json 渲染成网页。这个服务器只能提供文件,不能处理任何"写"操作。
使用 frontend-design 插件做了深色航空风格的 UI 设计,选用 Cormorant Garamond + IBM Plex Mono 字体组合。
原来 DeepSeek 只生成一段中文综述。扩展为六个字段:中文综述、研究方法、创新点、主要结论、局限性、相关度理由。同时尝试用 Unpaywall 获取全文 PDF(AIAA/ASME 期刊几乎全付费,实际获取 0 篇,代码备用)。
要实现标注功能(把评价写回磁盘),就必须有一个能接收 POST 请求的服务器,而 python -m http.server 做不到这一点。于是写了 scripts/server.py,用 Flask 框架替代原来的静态服务器。
替换时需要先杀掉旧进程才能让新服务器占用同一个端口(8000)。Windows 上用的命令是 taskkill /F /PID <进程号>,这就是你看到的那些 TASKKILL 操作的来由——不是在删什么重要东西,只是把占着端口的旧服务器进程关掉。
在 config.py 里配置 6 个预设课题组的 PI 姓名,流水线运行时自动按作者名匹配并打标签。同时统计高频作者(≥ 3 篇)自动生成 ★ 条目。标注功能上线:在网页写下评价 → 保存到 annotations.json → 下次流水线自动注入 DeepSeek 的系统提示,形成个性化反馈闭环。
每篇论文记录首次入库日期(fetched_at),方便区分"新来的"和"老论文"。在网页端增加"标记已读"按钮,状态持久保存在服务器端,支持按已读/未读筛选。修复了 ★ 自动作者点击后无论文显示的 bug(原因是作者名只存在 authors 字段里,没有写回 groups 字段,过滤逻辑需要特殊处理)。
以前更新论文需要打开终端、切换目录、手动运行 Python 脚本。现在 Flask 服务器新增了两个 API 接口:/api/pipeline/run 触发流水线、/api/pipeline/status 返回实时日志。右上角"▶ 更新检索"点击即可触发,右侧面板滑出显示进度,完成后一键刷新数据不重载页面。流水线运行在 Flask 后台线程里,关掉浏览器不会中断。
进度面板从纯文字日志升级为三步骤可视化(抓取 → AI 分析 → 写入),含论文标题滚动、进度条和完成汇总。原始日志折叠到底部。
课题组支持在线编辑:每张 Group 卡片右上角有 ✎ 按钮,可修改名称、机构和 PI 姓名。特别是自动识别的 ★ 作者,可以直接编辑成正式课题组名称,编辑后 paper 数不变,过滤逻辑自动适配。编辑记录存在 data/custom_groups.json。
修复了关闭进度面板后按钮卡死在 disabled 状态的 bug。现在关掉面板后按钮变为绿色"⟳ 运行中…",仍可点击重新打开面板续看进度。刷新浏览器后页面会自动检查服务器端流水线状态,如果还在运行,进度面板自动弹出、按钮自动变绿,不会丢失进度视图。