1. 项目缘起一个信息过载研究者的自救每天早晨我打开邮箱和学术订阅列表面对的是几十甚至上百封来自arXiv、PubMed、各大顶会官网的论文推送。标题一个比一个吸引人摘要一个比一个“颠覆性”但我的时间和精力是有限的。作为一名在AI药物发现AIDD领域摸爬滚打了快十年的从业者我深知这个领域的交叉性和迭代速度——计算机科学、生物信息学、计算化学、药理学的最新进展都可能在一夜之间改变我们的工具链和思考方式。但问题来了我如何从这信息的洪流中精准地捞出那几颗真正对我有价值的珍珠手动筛选耗时耗力依赖同事转发又难免有信息差和延迟。这就是“科研小工具AIDD领域每日论文简报”诞生的背景。它不是什么复杂的AI系统而是一个高度定制化、自动化、且完全由我掌控的信息过滤与摘要流水线。它的核心目标只有一个在每天早晨的第一杯咖啡时间用一份不超过5分钟就能读完的简报告诉我过去24小时内AIDD领域最值得关注的3-5篇论文的核心是什么以及为什么它可能与我手头的项目相关。这个工具彻底改变了我的文献追踪习惯从被动接收转为主动获取让我能始终站在领域前沿的浪尖上而不会被海浪淹没。今天我就把这个“自救方案”的完整构建思路、技术选型、踩过的坑以及实际效果毫无保留地分享出来。2. 核心需求拆解我们到底需要什么样的“简报”在动手写任何一行代码之前明确需求是关键。一个通用的“论文推送”和一个高效的“领域简报”有本质区别。我花了些时间梳理总结出这个简报工具必须满足的五个核心特性2.1 源头的覆盖度与权威性简报的质量首先取决于信息源。AIDD的论文分散在多个平台预印本平台arXiv的cs.LG机器学习、q-bio.BM生物分子、q-bio.QM定量生物学等板块是最新方法学的风向标。传统期刊Nature系列如Nature Machine Intelligence, Nature Communications、Cell系列、以及JMC、JCIM等专业期刊发表经过同行评议的、更成熟的工作。会议论文集NeurIPS、ICML、ICLR、RECOMB等会议的论文往往代表着最前沿的算法尝试。 工具需要能同时监控这些源头并优先处理来自顶会/顶刊的论文以确保信息的“信噪比”。2.2 内容的相关性过滤超越关键词匹配这是整个工具的灵魂。如果只是用“AIDD”、“AI”、“Drug Discovery”作为关键词去搜你会得到大量噪音比如纯生物实验的论文、不相关的AI应用等。真正的相关性过滤需要多层逻辑核心关键词库建立包括“molecular property prediction”、“de novo molecular design”、“binding affinity prediction”、“ADMET”、“generative model”、“graph neural network”、“transformer”、“protein-ligand docking”等在内的核心术语库。排除关键词库同样重要。需要排除诸如“clinical trial”临床试验、“epidemiology”流行病学、“plant biology”植物生物学等明显不相关的领域词汇。语义相似度仅有关键词不够。例如一篇论文的标题是《一种基于等变图网络的三维分子生成方法》它可能不直接包含“de novo design”但其内容高度相关。因此需要利用嵌入模型Embedding计算论文摘要与一组“领域核心概念描述”的语义相似度。2.3 信息的结构化与可读性简报不是论文列表而是精炼的摘要。对于每一篇入选的论文简报需要自动提取并结构化呈现几个关键信息标题与链接直达原文。一句话核心贡献用最直白的语言说明这篇论文到底新在哪里。例如“提出了一个考虑分子三维构象旋转等变性的生成模型在多个基准上超越了现有方法。”方法类型快速分类如“生成模型/GNN”、“预测模型/Transformer”、“数据集/基准”。潜在应用点结合我的研究方向提示这篇论文可能对我当前工作的启发。例如“其等变性的设计思路或许可以借鉴到我们正在进行的蛋白-配体结合构象预测项目中。”置信度/热度标识简单标注如“ 高热度arXiv评论多”、“⭐ 值得精读方法新颖”、“ 基准刷新性能SOTA”。2.4 推送的稳定与轻量化稳定性需要能7x24小时无人值守运行网络波动、API限制、源网站改版都不能导致整体崩溃。轻量化最终推送形式最好是邮件或Telegram/钉钉等即时消息内容简洁支持快速跳转避免使用需要额外登录的复杂平台。2.5 可维护与可扩展性我的研究兴趣可能会变领域热点也会迁移。因此过滤规则、关键词库、甚至信息源都必须能够以低成本的方式进行修改和扩展。工具应该是一个“乐高积木”而不是一个“黑盒子”。3. 技术架构选型为什么是“脚本组合”而非“一体化平台”明确了需求后下一个问题是如何实现市面上有一些通用的文献管理或学术追踪工具如Feedly, Google Scholar Alerts但它们都无法满足上述高度定制化的需求。我也考虑过自己搭建一个完整的Web应用但很快否定了这个想法原因如下过度工程化我的核心需求是信息处理流水线而不是一个需要用户界面、数据库和用户管理系统的Web产品。维护成本高一个完整的Web应用需要关心部署、监控、安全更新等一系列运维问题这对于一个个人效率工具来说得不偿失。灵活性差Web应用的工作流一旦固化修改起来可能涉及前后端多处改动。因此我选择了“基于云函数的脚本组合”方案。其核心思想是将整个流水线拆解成多个独立、单一职责的模块脚本每个模块完成一项特定任务模块之间通过文件或简单的消息队列连接。这个方案的优势非常明显高内聚低耦合每个脚本独立开发、测试和运行一个脚本的失败不影响整个流水线可以设计重试或降级策略。语言选择自由不同任务可以用最适合的语言。比如数据抓取用Pythonrequests,BeautifulSoup文本处理用PythonspaCy,transformers定时任务和编排用云服务。成本极低大部分脚本可以部署在按量付费的云函数如AWS Lambda, Google Cloud Functions上每天运行几分钟费用几乎可以忽略不计。易于调试和扩展每个脚本都有清晰的输入输出出错了很容易定位。要增加新的数据源或过滤规则只需新增或修改一个脚本即可。我的最终架构如下图所示此处以文字描述[定时触发器] - [数据采集脚本群] - [原始数据存储] - [核心过滤与摘要脚本] - [简报生成脚本] - [推送脚本] - [我的邮箱/Telegram]整个流程由云平台上的定时任务如Cron Job驱动每天在固定时间如UTC 0点触发。4. 模块实现详解从爬虫到推送的每一个齿轮下面我深入每个模块分享具体实现中的技术细节和那些“教科书上不会写”的实操经验。4.1 数据采集稳定比聪明更重要数据采集是整个系统的上游必须稳定可靠。我放弃了复杂的动态网页抓取如Selenium因为对于学术网站静态内容足够且更稳定。以arXiv为例的采集脚本要点import requests import feedparser from datetime import datetime, timedelta import time def fetch_arxiv_papers(categories[cs.LG, q-bio.BM, q-bio.QM, physics.bio-ph], days_back1): 获取arXiv过去几天内指定分类的论文 base_url http://export.arxiv.org/api/query? papers [] for category in categories: # 构造查询搜索特定分类按更新时间排序限制数量 query fsearch_querycat:{category}ANDlastUpdatedDate:[{get_yesterday_date()}]ANDsubmittedDate:[{get_yesterday_date()}]sortBylastUpdatedDatesortOrderdescendingmax_results100 url base_url query try: response requests.get(url, timeout30) response.raise_for_status() feed feedparser.parse(response.content) for entry in feed.entries: paper { title: entry.title, link: entry.link, summary: entry.summary, authors: [author.name for author in entry.authors], published: entry.published, primary_category: entry.tags[0][term] if entry.tags else , source: arXiv } papers.append(paper) time.sleep(3) # 礼貌性延迟避免请求过快 except requests.exceptions.RequestException as e: print(fError fetching arXiv category {category}: {e}) # 记录日志但不终止整个流程继续尝试下一个分类 continue return papers def get_yesterday_date(): 返回YYYYMMDD格式的昨天日期 yesterday datetime.utcnow() - timedelta(days1) return yesterday.strftime(%Y%m%d)踩坑经验与注意事项遵守Robots协议与设置延迟几乎所有学术网站都有robots.txt。arXiv允许API调用但也要设置请求间隔如time.sleep(3)这是对公共资源的尊重也能避免IP被临时封禁。健壮的错误处理网络请求可能失败网站结构可能微调。必须用try...except包裹核心请求和解析逻辑并记录详细的错误日志。一个数据源的暂时失败不应导致整个日报夭折。使用官方API/Feed优先arXiv、PubMed都提供了优秀的API或RSS订阅源。这比解析HTML页面稳定得多。对于没有官方API的可以寻找是否有第三方维护的结构化数据源。存储原始数据采集到的原始论文信息元数据摘要一定要保存下来例如存为JSON文件或写入简单的SQLite数据库。这有两个好处一是过滤算法可以反复调试而不需要重新抓取二是可以作为历史档案未来或许能用于趋势分析。4.2 核心过滤与摘要让AI理解论文在说什么这是整个系统的“大脑”。我采用了“规则过滤 语义过滤”的两级漏斗模式。第一级基于关键词的规则过滤这一步快速筛掉明显不相关的论文。我维护了两个列表include_keywords: [‘molecular’, ‘ligand’, ‘protein’, ‘binding’, ‘affinity’, ‘generative’, ‘graph network’, ‘transformer’, ‘ADMET’, ‘docking’, ‘QSAR’, ‘de novo’…]exclude_keywords: [‘clinical’, ‘trial’, ‘epidemiology’, ‘plant’, ‘review’, ‘erratum’…] # 注意排除‘review’综述除非你特别需要。过滤逻辑是论文标题或摘要中必须包含至少一个include_keywords中的词或它们的常见变体且不能包含任何exclude_keywords中的词。这里可以用正则表达式提高灵活性比如molecular可以匹配molecule,molecules。第二级基于嵌入向量的语义过滤规则过滤后剩下的论文可能仍有“似是而非”的情况。这时就需要语义理解。我的做法是构建“领域锚点”我手动撰写了5-10条能代表我核心研究方向的句子。例如“使用深度学习模型预测小分子药物的生物活性或物理化学性质。”“设计新的算法生成具有特定性质的候选药物分子。”“模拟蛋白质与药物分子之间的相互作用与结合。”计算语义相似度使用一个轻量级的句子嵌入模型如all-MiniLM-L6-v2它速度快且效果不错将每篇论文的摘要和我的每一个“领域锚点”句子都转换为向量。打分与阈值计算摘要向量与每个锚点向量的余弦相似度取最高分作为该论文的“领域相关度得分”。设定一个阈值如0.5只有高于此阈值的论文才会进入下一轮。from sentence_transformers import SentenceTransformer import numpy as np model SentenceTransformer(all-MiniLM-L6-v2) # 领域锚点句子 anchor_sentences [ Using deep learning to predict the bioactivity or physicochemical properties of small molecule drugs., Designing novel algorithms to generate candidate drug molecules with desired properties., Simulating the interaction and binding between proteins and drug molecules. ] anchor_embeddings model.encode(anchor_sentences) def semantic_filter(paper_abstract, threshold0.5): paper_embedding model.encode([paper_abstract]) # 计算与所有锚点的相似度取最大值 similarities np.max(np.inner(paper_embedding, anchor_embeddings), axis1) max_similarity np.max(similarities) return max_similarity threshold, max_similarity摘要生成用提示工程“拷问”大语言模型对于通过过滤的论文我需要它生成那“一句话核心贡献”。这里我使用了大型语言模型的API如OpenAI GPT-4/3.5-Turbo或开源的ChatGLM、Qwen API。关键不在于模型多强大而在于提示词Prompt的设计。我的Prompt模板如下你是一位AI药物发现AIDD领域的专家。请基于以下论文标题和摘要完成以下任务 1. 用一句简洁的话不超过50字概括这篇论文最核心的技术贡献或创新点。避免使用“本文提出了”、“本研究探讨了”等开头直接说实质内容。 2. 将论文的方法归类到以下类别之一[生成模型, 预测模型, 表示学习, 数据集/基准, 算法/框架, 应用案例, 其他]。 3. 思考这项研究对“基于结构的药物设计”或“分子性质预测”可能带来什么启发或潜在应用1-2句。 论文标题{title} 论文摘要{abstract} 请用JSON格式输出包含三个键core_contribution, category, potential_application。使用结构化输出JSON让后续处理变得非常简单。实测下来即使使用gpt-3.5-turbo在这个明确的指令下也能产出质量相当高的摘要和分类成本可控每天处理10篇论文费用极低。4.3 简报生成与格式化从数据到可读信息经过过滤和摘要的论文列表需要被包装成一份美观、易读的简报。我选择使用HTML格式的邮件因为它兼容性好且能实现简单的排版。简报模板设计思路标题明确日期和领域如“AIDD每日论文简报 - 2023-10-27”。摘要统计开头简要说明今天监控了多少篇过滤后剩下几篇值得关注。论文条目每条包含/⭐/ 图标、论文标题超链接、核心贡献、方法类别、潜在应用点。用不同的背景色或边框区分不同重要性的论文。底部信息说明简报生成方式并提供一个简单的反馈入口如“回复此邮件可调整关键词”。生成HTML可以使用Jinja2等模板引擎简单又灵活。4.4 推送与部署让流程自动运转推送渠道我选择了邮件作为主要推送方式。原因1几乎人人都有无需安装新App2支持HTML排版丰富3可以很方便地存档和搜索。使用SMTP服务如Gmail、SendGrid、阿里云邮件推送即可轻松发送。部署与调度这是“脚本组合”架构发挥优势的地方。我将每个模块采集、过滤、生成、推送都封装成了一个独立的Python脚本并部署到Google Cloud Functions或AWS Lambda上。然后使用Google Cloud Scheduler或AWS EventBridge创建一个每天定时触发第一个“采集脚本”的Cron作业。关键技巧状态传递与错误处理脚本之间如何传递数据最简单的方式是使用云存储如Google Cloud Storage AWS S3。流程如下采集脚本运行将抓取的原始数据存为一个以日期命名的JSON文件上传到云存储的raw/目录。云存储的文件上传事件自动触发“过滤与摘要”云函数。该函数读取原始数据处理后将结果存为新的JSON文件到processed/目录。同样新文件生成事件触发“简报生成”函数生成HTML文件。最后“邮件推送”函数被触发读取HTML文件并发送邮件。 这种基于事件驱动的架构无需手动编排且每个环节失败都不会影响其他环节只需在失败时发出报警例如发送一封报警邮件到我的另一个邮箱。5. 优化与迭代让工具越用越“懂”我工具上线只是开始。要让简报真正精准需要持续的“调教”。建立反馈闭环在每封简报邮件底部我加了两个简单的链接“这篇相关 ” 和 “这篇不相关 ”。点击后会触发一个云函数记录下这篇论文的ID和我的反馈。定期例如每周我会查看这些反馈分析误判的论文是因为关键词不全还是语义锚点不准据此调整关键词库和锚点句子。动态调整阈值语义相似度的阈值不是固定的。如果我发现一段时间内简报论文太多信息过载就调高阈值如果太少怕错过就调低一点。这是一个根据个人阅读精力动态平衡的过程。探索多模态信息目前只处理文本。但AIDD领域很多论文包含重要的分子结构图、性能对比图表。未来可以考虑用多模态模型如GPT-4V对论文中的关键图表进行简要描述加入简报信息量会更大。个性化排序目前只是简单按来源或时间排序。未来可以根据我过往的点击、阅读时长等隐式反馈对论文进行个性化排序把最可能感兴趣的直接置顶。6. 实际效果与心得体会这个工具我已经稳定使用了超过半年。它每天在UTC时间零点左右运行大约在早上8点前我就能在邮箱里收到一份简洁的简报。效果是立竿见影的阅读效率提升从过去每天漫无目的地浏览上百个标题到现在只需专注阅读5篇左右的高相关度论文摘要每周能精读1-2篇全文。时间节省了70%以上。前沿嗅觉更敏锐因为过滤机制包含了语义理解它能帮我发现一些我可能没想到用关键词去搜但实际高度相关的前沿工作真正做到了“信息破圈”。知识管理自动化所有的简报和历史论文数据都被自动存档形成了一个专属的、结构化的AIDD论文知识库方便我随时回溯和搜索。最重要的心得体会是最好的工具不一定是最复杂的而是最能无缝融入你现有工作流、解决你最深切痛点的那个。这个“每日简报”工具没有炫酷的界面没有复杂的算法但它精准地击中了“信息过载”和“精准获取”这个痛点。构建它的过程本身也是对AIDD领域知识的一次系统性梳理。如果你也深受文献追踪之苦不妨从最简单的单数据源比如就先从arXiv的cs.LG和q-bio.BM开始、基于关键词的过滤做起先跑通一个最小可行产品。你会发现自动化带来的信息掌控感会让你在科研的马拉松中跑得更从容、更有方向。
基于云函数与语义过滤的AIDD领域论文自动化简报系统构建实践
1. 项目缘起一个信息过载研究者的自救每天早晨我打开邮箱和学术订阅列表面对的是几十甚至上百封来自arXiv、PubMed、各大顶会官网的论文推送。标题一个比一个吸引人摘要一个比一个“颠覆性”但我的时间和精力是有限的。作为一名在AI药物发现AIDD领域摸爬滚打了快十年的从业者我深知这个领域的交叉性和迭代速度——计算机科学、生物信息学、计算化学、药理学的最新进展都可能在一夜之间改变我们的工具链和思考方式。但问题来了我如何从这信息的洪流中精准地捞出那几颗真正对我有价值的珍珠手动筛选耗时耗力依赖同事转发又难免有信息差和延迟。这就是“科研小工具AIDD领域每日论文简报”诞生的背景。它不是什么复杂的AI系统而是一个高度定制化、自动化、且完全由我掌控的信息过滤与摘要流水线。它的核心目标只有一个在每天早晨的第一杯咖啡时间用一份不超过5分钟就能读完的简报告诉我过去24小时内AIDD领域最值得关注的3-5篇论文的核心是什么以及为什么它可能与我手头的项目相关。这个工具彻底改变了我的文献追踪习惯从被动接收转为主动获取让我能始终站在领域前沿的浪尖上而不会被海浪淹没。今天我就把这个“自救方案”的完整构建思路、技术选型、踩过的坑以及实际效果毫无保留地分享出来。2. 核心需求拆解我们到底需要什么样的“简报”在动手写任何一行代码之前明确需求是关键。一个通用的“论文推送”和一个高效的“领域简报”有本质区别。我花了些时间梳理总结出这个简报工具必须满足的五个核心特性2.1 源头的覆盖度与权威性简报的质量首先取决于信息源。AIDD的论文分散在多个平台预印本平台arXiv的cs.LG机器学习、q-bio.BM生物分子、q-bio.QM定量生物学等板块是最新方法学的风向标。传统期刊Nature系列如Nature Machine Intelligence, Nature Communications、Cell系列、以及JMC、JCIM等专业期刊发表经过同行评议的、更成熟的工作。会议论文集NeurIPS、ICML、ICLR、RECOMB等会议的论文往往代表着最前沿的算法尝试。 工具需要能同时监控这些源头并优先处理来自顶会/顶刊的论文以确保信息的“信噪比”。2.2 内容的相关性过滤超越关键词匹配这是整个工具的灵魂。如果只是用“AIDD”、“AI”、“Drug Discovery”作为关键词去搜你会得到大量噪音比如纯生物实验的论文、不相关的AI应用等。真正的相关性过滤需要多层逻辑核心关键词库建立包括“molecular property prediction”、“de novo molecular design”、“binding affinity prediction”、“ADMET”、“generative model”、“graph neural network”、“transformer”、“protein-ligand docking”等在内的核心术语库。排除关键词库同样重要。需要排除诸如“clinical trial”临床试验、“epidemiology”流行病学、“plant biology”植物生物学等明显不相关的领域词汇。语义相似度仅有关键词不够。例如一篇论文的标题是《一种基于等变图网络的三维分子生成方法》它可能不直接包含“de novo design”但其内容高度相关。因此需要利用嵌入模型Embedding计算论文摘要与一组“领域核心概念描述”的语义相似度。2.3 信息的结构化与可读性简报不是论文列表而是精炼的摘要。对于每一篇入选的论文简报需要自动提取并结构化呈现几个关键信息标题与链接直达原文。一句话核心贡献用最直白的语言说明这篇论文到底新在哪里。例如“提出了一个考虑分子三维构象旋转等变性的生成模型在多个基准上超越了现有方法。”方法类型快速分类如“生成模型/GNN”、“预测模型/Transformer”、“数据集/基准”。潜在应用点结合我的研究方向提示这篇论文可能对我当前工作的启发。例如“其等变性的设计思路或许可以借鉴到我们正在进行的蛋白-配体结合构象预测项目中。”置信度/热度标识简单标注如“ 高热度arXiv评论多”、“⭐ 值得精读方法新颖”、“ 基准刷新性能SOTA”。2.4 推送的稳定与轻量化稳定性需要能7x24小时无人值守运行网络波动、API限制、源网站改版都不能导致整体崩溃。轻量化最终推送形式最好是邮件或Telegram/钉钉等即时消息内容简洁支持快速跳转避免使用需要额外登录的复杂平台。2.5 可维护与可扩展性我的研究兴趣可能会变领域热点也会迁移。因此过滤规则、关键词库、甚至信息源都必须能够以低成本的方式进行修改和扩展。工具应该是一个“乐高积木”而不是一个“黑盒子”。3. 技术架构选型为什么是“脚本组合”而非“一体化平台”明确了需求后下一个问题是如何实现市面上有一些通用的文献管理或学术追踪工具如Feedly, Google Scholar Alerts但它们都无法满足上述高度定制化的需求。我也考虑过自己搭建一个完整的Web应用但很快否定了这个想法原因如下过度工程化我的核心需求是信息处理流水线而不是一个需要用户界面、数据库和用户管理系统的Web产品。维护成本高一个完整的Web应用需要关心部署、监控、安全更新等一系列运维问题这对于一个个人效率工具来说得不偿失。灵活性差Web应用的工作流一旦固化修改起来可能涉及前后端多处改动。因此我选择了“基于云函数的脚本组合”方案。其核心思想是将整个流水线拆解成多个独立、单一职责的模块脚本每个模块完成一项特定任务模块之间通过文件或简单的消息队列连接。这个方案的优势非常明显高内聚低耦合每个脚本独立开发、测试和运行一个脚本的失败不影响整个流水线可以设计重试或降级策略。语言选择自由不同任务可以用最适合的语言。比如数据抓取用Pythonrequests,BeautifulSoup文本处理用PythonspaCy,transformers定时任务和编排用云服务。成本极低大部分脚本可以部署在按量付费的云函数如AWS Lambda, Google Cloud Functions上每天运行几分钟费用几乎可以忽略不计。易于调试和扩展每个脚本都有清晰的输入输出出错了很容易定位。要增加新的数据源或过滤规则只需新增或修改一个脚本即可。我的最终架构如下图所示此处以文字描述[定时触发器] - [数据采集脚本群] - [原始数据存储] - [核心过滤与摘要脚本] - [简报生成脚本] - [推送脚本] - [我的邮箱/Telegram]整个流程由云平台上的定时任务如Cron Job驱动每天在固定时间如UTC 0点触发。4. 模块实现详解从爬虫到推送的每一个齿轮下面我深入每个模块分享具体实现中的技术细节和那些“教科书上不会写”的实操经验。4.1 数据采集稳定比聪明更重要数据采集是整个系统的上游必须稳定可靠。我放弃了复杂的动态网页抓取如Selenium因为对于学术网站静态内容足够且更稳定。以arXiv为例的采集脚本要点import requests import feedparser from datetime import datetime, timedelta import time def fetch_arxiv_papers(categories[cs.LG, q-bio.BM, q-bio.QM, physics.bio-ph], days_back1): 获取arXiv过去几天内指定分类的论文 base_url http://export.arxiv.org/api/query? papers [] for category in categories: # 构造查询搜索特定分类按更新时间排序限制数量 query fsearch_querycat:{category}ANDlastUpdatedDate:[{get_yesterday_date()}]ANDsubmittedDate:[{get_yesterday_date()}]sortBylastUpdatedDatesortOrderdescendingmax_results100 url base_url query try: response requests.get(url, timeout30) response.raise_for_status() feed feedparser.parse(response.content) for entry in feed.entries: paper { title: entry.title, link: entry.link, summary: entry.summary, authors: [author.name for author in entry.authors], published: entry.published, primary_category: entry.tags[0][term] if entry.tags else , source: arXiv } papers.append(paper) time.sleep(3) # 礼貌性延迟避免请求过快 except requests.exceptions.RequestException as e: print(fError fetching arXiv category {category}: {e}) # 记录日志但不终止整个流程继续尝试下一个分类 continue return papers def get_yesterday_date(): 返回YYYYMMDD格式的昨天日期 yesterday datetime.utcnow() - timedelta(days1) return yesterday.strftime(%Y%m%d)踩坑经验与注意事项遵守Robots协议与设置延迟几乎所有学术网站都有robots.txt。arXiv允许API调用但也要设置请求间隔如time.sleep(3)这是对公共资源的尊重也能避免IP被临时封禁。健壮的错误处理网络请求可能失败网站结构可能微调。必须用try...except包裹核心请求和解析逻辑并记录详细的错误日志。一个数据源的暂时失败不应导致整个日报夭折。使用官方API/Feed优先arXiv、PubMed都提供了优秀的API或RSS订阅源。这比解析HTML页面稳定得多。对于没有官方API的可以寻找是否有第三方维护的结构化数据源。存储原始数据采集到的原始论文信息元数据摘要一定要保存下来例如存为JSON文件或写入简单的SQLite数据库。这有两个好处一是过滤算法可以反复调试而不需要重新抓取二是可以作为历史档案未来或许能用于趋势分析。4.2 核心过滤与摘要让AI理解论文在说什么这是整个系统的“大脑”。我采用了“规则过滤 语义过滤”的两级漏斗模式。第一级基于关键词的规则过滤这一步快速筛掉明显不相关的论文。我维护了两个列表include_keywords: [‘molecular’, ‘ligand’, ‘protein’, ‘binding’, ‘affinity’, ‘generative’, ‘graph network’, ‘transformer’, ‘ADMET’, ‘docking’, ‘QSAR’, ‘de novo’…]exclude_keywords: [‘clinical’, ‘trial’, ‘epidemiology’, ‘plant’, ‘review’, ‘erratum’…] # 注意排除‘review’综述除非你特别需要。过滤逻辑是论文标题或摘要中必须包含至少一个include_keywords中的词或它们的常见变体且不能包含任何exclude_keywords中的词。这里可以用正则表达式提高灵活性比如molecular可以匹配molecule,molecules。第二级基于嵌入向量的语义过滤规则过滤后剩下的论文可能仍有“似是而非”的情况。这时就需要语义理解。我的做法是构建“领域锚点”我手动撰写了5-10条能代表我核心研究方向的句子。例如“使用深度学习模型预测小分子药物的生物活性或物理化学性质。”“设计新的算法生成具有特定性质的候选药物分子。”“模拟蛋白质与药物分子之间的相互作用与结合。”计算语义相似度使用一个轻量级的句子嵌入模型如all-MiniLM-L6-v2它速度快且效果不错将每篇论文的摘要和我的每一个“领域锚点”句子都转换为向量。打分与阈值计算摘要向量与每个锚点向量的余弦相似度取最高分作为该论文的“领域相关度得分”。设定一个阈值如0.5只有高于此阈值的论文才会进入下一轮。from sentence_transformers import SentenceTransformer import numpy as np model SentenceTransformer(all-MiniLM-L6-v2) # 领域锚点句子 anchor_sentences [ Using deep learning to predict the bioactivity or physicochemical properties of small molecule drugs., Designing novel algorithms to generate candidate drug molecules with desired properties., Simulating the interaction and binding between proteins and drug molecules. ] anchor_embeddings model.encode(anchor_sentences) def semantic_filter(paper_abstract, threshold0.5): paper_embedding model.encode([paper_abstract]) # 计算与所有锚点的相似度取最大值 similarities np.max(np.inner(paper_embedding, anchor_embeddings), axis1) max_similarity np.max(similarities) return max_similarity threshold, max_similarity摘要生成用提示工程“拷问”大语言模型对于通过过滤的论文我需要它生成那“一句话核心贡献”。这里我使用了大型语言模型的API如OpenAI GPT-4/3.5-Turbo或开源的ChatGLM、Qwen API。关键不在于模型多强大而在于提示词Prompt的设计。我的Prompt模板如下你是一位AI药物发现AIDD领域的专家。请基于以下论文标题和摘要完成以下任务 1. 用一句简洁的话不超过50字概括这篇论文最核心的技术贡献或创新点。避免使用“本文提出了”、“本研究探讨了”等开头直接说实质内容。 2. 将论文的方法归类到以下类别之一[生成模型, 预测模型, 表示学习, 数据集/基准, 算法/框架, 应用案例, 其他]。 3. 思考这项研究对“基于结构的药物设计”或“分子性质预测”可能带来什么启发或潜在应用1-2句。 论文标题{title} 论文摘要{abstract} 请用JSON格式输出包含三个键core_contribution, category, potential_application。使用结构化输出JSON让后续处理变得非常简单。实测下来即使使用gpt-3.5-turbo在这个明确的指令下也能产出质量相当高的摘要和分类成本可控每天处理10篇论文费用极低。4.3 简报生成与格式化从数据到可读信息经过过滤和摘要的论文列表需要被包装成一份美观、易读的简报。我选择使用HTML格式的邮件因为它兼容性好且能实现简单的排版。简报模板设计思路标题明确日期和领域如“AIDD每日论文简报 - 2023-10-27”。摘要统计开头简要说明今天监控了多少篇过滤后剩下几篇值得关注。论文条目每条包含/⭐/ 图标、论文标题超链接、核心贡献、方法类别、潜在应用点。用不同的背景色或边框区分不同重要性的论文。底部信息说明简报生成方式并提供一个简单的反馈入口如“回复此邮件可调整关键词”。生成HTML可以使用Jinja2等模板引擎简单又灵活。4.4 推送与部署让流程自动运转推送渠道我选择了邮件作为主要推送方式。原因1几乎人人都有无需安装新App2支持HTML排版丰富3可以很方便地存档和搜索。使用SMTP服务如Gmail、SendGrid、阿里云邮件推送即可轻松发送。部署与调度这是“脚本组合”架构发挥优势的地方。我将每个模块采集、过滤、生成、推送都封装成了一个独立的Python脚本并部署到Google Cloud Functions或AWS Lambda上。然后使用Google Cloud Scheduler或AWS EventBridge创建一个每天定时触发第一个“采集脚本”的Cron作业。关键技巧状态传递与错误处理脚本之间如何传递数据最简单的方式是使用云存储如Google Cloud Storage AWS S3。流程如下采集脚本运行将抓取的原始数据存为一个以日期命名的JSON文件上传到云存储的raw/目录。云存储的文件上传事件自动触发“过滤与摘要”云函数。该函数读取原始数据处理后将结果存为新的JSON文件到processed/目录。同样新文件生成事件触发“简报生成”函数生成HTML文件。最后“邮件推送”函数被触发读取HTML文件并发送邮件。 这种基于事件驱动的架构无需手动编排且每个环节失败都不会影响其他环节只需在失败时发出报警例如发送一封报警邮件到我的另一个邮箱。5. 优化与迭代让工具越用越“懂”我工具上线只是开始。要让简报真正精准需要持续的“调教”。建立反馈闭环在每封简报邮件底部我加了两个简单的链接“这篇相关 ” 和 “这篇不相关 ”。点击后会触发一个云函数记录下这篇论文的ID和我的反馈。定期例如每周我会查看这些反馈分析误判的论文是因为关键词不全还是语义锚点不准据此调整关键词库和锚点句子。动态调整阈值语义相似度的阈值不是固定的。如果我发现一段时间内简报论文太多信息过载就调高阈值如果太少怕错过就调低一点。这是一个根据个人阅读精力动态平衡的过程。探索多模态信息目前只处理文本。但AIDD领域很多论文包含重要的分子结构图、性能对比图表。未来可以考虑用多模态模型如GPT-4V对论文中的关键图表进行简要描述加入简报信息量会更大。个性化排序目前只是简单按来源或时间排序。未来可以根据我过往的点击、阅读时长等隐式反馈对论文进行个性化排序把最可能感兴趣的直接置顶。6. 实际效果与心得体会这个工具我已经稳定使用了超过半年。它每天在UTC时间零点左右运行大约在早上8点前我就能在邮箱里收到一份简洁的简报。效果是立竿见影的阅读效率提升从过去每天漫无目的地浏览上百个标题到现在只需专注阅读5篇左右的高相关度论文摘要每周能精读1-2篇全文。时间节省了70%以上。前沿嗅觉更敏锐因为过滤机制包含了语义理解它能帮我发现一些我可能没想到用关键词去搜但实际高度相关的前沿工作真正做到了“信息破圈”。知识管理自动化所有的简报和历史论文数据都被自动存档形成了一个专属的、结构化的AIDD论文知识库方便我随时回溯和搜索。最重要的心得体会是最好的工具不一定是最复杂的而是最能无缝融入你现有工作流、解决你最深切痛点的那个。这个“每日简报”工具没有炫酷的界面没有复杂的算法但它精准地击中了“信息过载”和“精准获取”这个痛点。构建它的过程本身也是对AIDD领域知识的一次系统性梳理。如果你也深受文献追踪之苦不妨从最简单的单数据源比如就先从arXiv的cs.LG和q-bio.BM开始、基于关键词的过滤做起先跑通一个最小可行产品。你会发现自动化带来的信息掌控感会让你在科研的马拉松中跑得更从容、更有方向。