
一个全自动的 AI 论文监控助手每天自动抓 arXiv 顶会论文 → 筛选多智能体相关 → 让 AI 总结 → 推送到钉钉。流程启动 加载配置关键词、时间、会议、文件路径 去 arXiv 网站抓取最新 AI 论文 过滤论文 只保留最近 2 天 只保留顶会ICML、ICLR、NeurIPS… 只保留多智能体相关关键词 去重不重复推送 让 AIDeepSeek总结论文 推送到钉钉 如果今天是周日 → 自动生成一周汇总 结束代码# 需要下载的依赖pip install langchain langgraph langchain-openai python-dotenv feedparser requests# import sys, subprocess# print(当前解释器, sys.executable)# print(pip 位置, subprocess.check_output([sys.executable, -m, pip, --version]).decode())importosimportjsonimportfeedparserimportrequestsfromdatetimeimportdatetime,timedeltafromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlanggraph.graphimportStateGraph,MessagesStatefromtypingimportList,Dict,Set# 加载环境变量load_dotenv(dotenv_path.env,encodingutf-8)# 全局配置 SUBSCRIBE_KEYWORDS{collaborative,cooperation,game theory,decentralized,distributed,task allocation,group agent,robot team,multi-agent planning,agent communication}ARCHIVE_FILEpapers_archive.jsonLOG_FILErun_log.txtFETCH_DAYS2MAX_FETCH_NUM10MAX_RECOMMEND_NUM5TOP_CONFS{ICML,ICLR,NeurIPS,ACL,AAMAS,EMNLP,CVPR,ICCV}# # ---------------------- LLM ----------------------llmChatOpenAI(base_urlhttps://api.deepseek.com/v1,api_keyos.getenv(DEEPSEEK_API_KEY),modeldeepseek-chat,temperature0.1)# ---------------------- 归档 ----------------------definit_archive():ifnotos.path.exists(ARCHIVE_FILE):withopen(ARCHIVE_FILE,w,encodingutf-8)asf:json.dump({papers:[],url_set:[]},f,ensure_asciiFalse,indent2)defload_archive():init_archive()withopen(ARCHIVE_FILE,r,encodingutf-8)asf:datajson.load(f)data[url_set]set(data.get(url_set,[]))returndatadefsave_archive(data):data[url_set]list(data[url_set])withopen(ARCHIVE_FILE,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)defadd_paper(paper):dataload_archive()ifpaper[link]indata[url_set]:returnFalsedata[papers].append(paper)data[url_set].add(paper[link])save_archive(data)returnTrue# ---------------------- 日志 ----------------------deflog(msg):nowdatetime.now().strftime(%Y-%m-%d %H:%M:%S)withopen(LOG_FILE,a,encodingutf-8)asf:f.write(f[{now}]{msg}\n)# ---------------------- 抓取 过滤 ----------------------deffetch_papers():querycat:cs.AIAND(multi-agentORmulti-agentsystemORcollaborativeagent)urlfhttps://arxiv.org/api/query?search_query{query}start0max_results{MAX_FETCH_NUM}sortBysubmittedDatesortOrderdescendingfeedfeedparser.parse(url)papers[]nowdatetime.now()forentryinfeed.entries:try:pub_timedatetime(*entry.published_parsed[:6])except:continueifnow-pub_timetimedelta(daysFETCH_DAYS):continuetext(entry.title entry.summary).lower()ifnotany(c.lower()intextforcinTOP_CONFS):continueifnotany(kw.lower()intextforkwinSUBSCRIBE_KEYWORDS):continuepapers.append({title:entry.title.replace(\n, ),authors:, .join([a.nameforainentry.authors]),link:entry.link,abstract:entry.summary[:600]...,published:pub_time.strftime(%Y-%m-%d)})returnpapers[:MAX_RECOMMEND_NUM]# ---------------------- 【钉钉机器人推送】替换这里 ----------------------defsend_wechat(text):try:# 把你钉钉机器人的 Webhook 填在这里DINGTALK_WEBHOOKhttps://oapi.dingtalk.com/robot/send?access_tokenxxxxxxxxheaders{Content-Type:application/json}data{msgtype:markdown,markdown:{title:多智能体论文推送,text:text}}requests.post(DINGTALK_WEBHOOK,headersheaders,jsondata,timeout10)returnTrueexceptExceptionase:print(钉钉推送失败:,e)returnFalse# ---------------------- 每日推荐 ----------------------defdaily_workflow(state):papersfetch_papers()todaydatetime.now().strftime(%Y-%m-%d)new_count0forpinpapers:ifadd_paper(p):new_count1log(f每日执行完成新增论文{new_count})ifnotpapers:msgf{today}\n今日无符合条件的多智能体顶会论文send_wechat(msg)return{messages:[(assistant,msg)]}promptf 你是专业的多智能体论文推荐助手输出简洁、专业、清爽。 今日多智能体顶会论文推荐{today} 【论文1】 标题xxx 链接xxx 核心亮点xxx 适合方向xxx 最多输出5篇。 论文列表{papers}resllm.invoke(prompt)send_wechat(res.content)return{messages:[(assistant,res.content)]}# ---------------------- 每周汇总 ----------------------defweekly_summary():nowdatetime.now()week_startnow-timedelta(daysnow.weekday())start_strweek_start.strftime(%Y-%m-%d)end_strnow.strftime(%Y-%m-%d)archiveload_archive()week_papers[pforpinarchive[papers]ifstart_strp[published]end_str]ifnotweek_papers:send_wechat(f 本周({start_str}~{end_str})无多智能体顶会论文)returnpromptf 本周多智能体顶会论文汇总{start_str}~{end_str} 总计{len(week_papers)}篇 按序号输出标题、链接、核心价值。 论文{week_papers}send_wechat(llm.invoke(prompt).content)# ---------------------- 构建 Agent ----------------------builderStateGraph(MessagesState)builder.add_node(run,daily_workflow)builder.set_entry_point(run)agentbuilder.compile()# ---------------------- 运行 ----------------------if__name____main__:print( 多智能体论文助手启动钉钉机器人版)agent.invoke({messages:[]})# 周日自动汇总ifdatetime.now().weekday()6:weekly_summary()一、整体分层框架图┌─────────────────────────────────────────────────────────────┐ │ 入口层程序启动 主调度 │ │ (if __name__ __main__) │ │ ├─ 启动 LangGraph Agent │ │ └─ 判断周日 → 执行每周汇总 │ └───────────────────────┬─────────────────────────────────────┘ │ ┌───────────────────────▼─────────────────────────────────────┐ │ 流程编排层LangGraph 工作流 │ │ StateGraph MessagesState │ │ └─ 绑定核心节点daily_workflow每日主逻辑 │ └───────────────────────┬─────────────────────────────────────┘ │ ┌───────────────────────▼─────────────────────────────────────┐ │ 核心业务层每日主流程 daily_workflow │ │ ├─ 1. 论文抓取过滤模块 fetch_papers │ │ ├─ 2. 论文归档去重模块 (init/load/save/add_paper) │ │ ├─ 3. 日志记录模块 log │ │ ├─ 4. LLM 总结模块 ChatOpenAI(DeepSeek) │ │ └─ 5. 消息推送模块 send_wechat钉钉机器人 │ └───────────────────────┬─────────────────────────────────────┘ │ ┌───────────────────────▼─────────────────────────────────────┐ │ 基础依赖层工具库 全局配置 │ │ ├─ 第三方库feedparser / requests / datetime / dotenv 等 │ │ ├─ 配置项关键词、顶会、抓取天数、文件路径等 │ │ └─ 外部资源arxiv API、DeepSeek 大模型、钉钉 Webhook │ └─────────────────────────────────────────────────────────────┘二、详细执行流程图开始 │ ▼ 1. 导入所有依赖库 类型注解 │ ▼ 2. 加载 .env 环境变量读取 DeepSeek API Key │ ▼ 3. 初始化全局配置关键词/顶会/文件/数量/天数 │ ▼ 4. 初始化 LLM 实例连接 DeepSeek 大模型 │ ▼ 5. 定义通用工具函数 ├─ 归档函数组文件读写 论文去重 ├─ 日志函数 ├─ 钉钉推送函数 └─ 论文抓取过滤函数 │ ▼ 6. 定义每日工作流 daily_workflow │ ▼ 7. 定义每周汇总函数 weekly_summary │ ▼ 8. 构建 LangGraph 图结构 ├─ 创建状态图 StateGraph ├─ 绑定运行节点 └─ 编译生成可执行 Agent │ ▼ 9. 程序入口启动agent.invoke() │ ▼ ┌────────────────────────────────────┐ │ 分支1执行每日核心流程 │ │ │ │ │ ▼ │ │ 9.1 调用 fetch_papers 抓取论文 │ │ ├─ 拼接 arxiv API 请求地址 │ │ ├─ feedparser 解析返回数据 │ │ ├─ 过滤1仅保留近 FETCH_DAYS 天│ │ ├─ 过滤2仅保留指定顶会论文 │ │ └─ 过滤3仅保留匹配关键词论文 │ │ │ │ │ ▼ │ │ 9.2 遍历论文 → add_paper 归档去重 │ │ └─ 新论文写入 papers_archive.json│ │ │ │ │ ▼ │ │ 9.3 log 记录运行日志新增论文数 │ │ │ │ │ ├─────────────────────┐ │ │ │ 判断是否抓到论文│ │ │ ├───────┬─────────────┤ │ │ │ 是 │ 否 │ │ │ ▼ ▼ │ │ │ 构造Prompt 推送「今日无论文」消息 │ │ │ │ │ │ ▼ │ │ │ LLM 调用 → AI 总结论文│ │ │ │ │ │ │ ▼ │ │ │ 推送总结内容到钉钉 │ │ └──────────┴─────────────┘ │ ▼ ┌────────────────────────────────────┐ │ 分支2判断当前是否为周日 │ │ (datetime.now().weekday() 6) │ │ ├─ 是 → 执行 weekly_summary 周汇总 │ │ │ ├─ 读取全量归档论文 │ │ │ ├─ 筛选本周数据 │ │ │ ├─ LLM 生成周总结 │ │ │ └─ 推送到钉钉 │ │ └─ 否 → 直接跳过周汇总 │ └────────────────────────────────────┘ │ ▼ 结束三、核心模块交互简图[本地文件] papers_archive.json ←→ 归档模块去重 run_log.txt ←→ 日志模块 │ ▼ [抓取模块] → 调用 arxiv API feedparser │ ▼ [过滤逻辑]时间 / 顶会 / 关键词 │ ▼ [LLM模块] → 调用 DeepSeek 大模型生成摘要 │ ▼ [推送模块] → 调用 钉钉 Webhook 发消息 │ ▼ [LangGraph 调度] 统一管理整个流程