引言

对每一个研究人员来说,获取并阅读最新文献都是必要的,但是很难有人能坚持并有足够的时间去筛选和整理这些信息。但是借助一些方便的工具可以帮我们完成这项重复性劳动。

zotero-arxiv-daily 是一个基于 arxiv 网站、zotero 文献库和 llm 的自动化工具。其中,arxiv 是一个开放的学术论文预印本库,zotero 是一个强大的文献管理工具 (被用于判断与研究者本人相关性) 。

简单的说,zotero-arxiv-daily 可以根据用户的 zotero 文献库,自动推荐与用户兴趣相关的最新 arxiv 论文,并将其发送到邮箱中。

效果展示

效果展示

过程

我将过程分为三步,一是配置到 github actions 完成自动发送,二是修改部分文件以适配自己的需求,三是使用 keepalive workflow 保活。

如果就是简简单单能用就行光第一步就足够了。

基础配置使用

这一部分的要点是配置好 github actions, 需要注意的点是获取 zotero 的 apikey 和 llm 的 apikey。

这里使用的最简单的方法也就是 github actions, 优点是免费文档。如官方文档所述,需要三步,一是 fork 代码仓库,二是配置 secrets,三是配置 workflow。

需要的 secrets 如下:

  • ARXIV_QUERY: 目标 arxiv 论文的类别。使用 + 连接多个类别。
  • ZOTERO_ID: zotero 的用户 ID,可以在 zotero 的设置中找到。
  • ZOTERO_KEY: zotero 的 API key,可以在 zotero 的网页设置 - 安全中生成。
  • RECEIVER: 接收文献的邮箱地址。
  • SENDER: 发送文献的邮箱地址。
  • SENDER_PASSWORD: 发送邮箱的密码/认证码,gmail 等是密码,qq 等是邮箱认证码 (可在设置中 SMTP 部分找到,注意只有生成的时候显示一次,自己保留好可以一直用)。
  • SMTP_PORT: SMTP 端口号。
  • SMTP_SERVER: SMTP 服务器地址。
  • USE_LLM_API: 是否使用 LLM API。
  • OPENAI_API_BASE: OpenAI API 基础地址。
  • OPENAI_API_KEY: OpenAI API 密钥。
  • MODEL_NAME: LLM 模型名称。

官方推荐使用 SiliconFlow 的模型,这是一个开源模型聚合平台,推荐的模式是Qwen/Qwen2.5-7B-Instruct, 因为这个模型的免费性能好而且输入参数是标准的,后面将讲一下不标准的输入应该怎么办。

如果使用 SiliconFlow 的话这几个参数示例是这样的:

温馨提示,一般 OPENAI_API_BASE 后面不带 chat/completions, 而是以 v1 结尾,注意不是v1/而是v1

但是不知道从什么时候开始我老是登不上 SiliconFlow 的官网,所以我更喜欢魔搭的模型,魔搭的模型是免费的,每天有 2000 次调用限制,

这是魔搭可以使用的免费模型列表:

ModelScope - 模型列表页

修改部分文件以适配自己的需求

注意,如果使用魔搭,有些模型比如 Qwen/Qwen3-235B-A22B 的输入参数是非标准的,所以需要修改代码。

如果 fork 我修改后的库而不是官方库不用修改直接使用。

sandy9707/zotero-arxiv-daily

关键在于添加 extra_body 的 enable_thinking 部分和调整 stream 的输入参数。

参考官方文档:

modelscope - API 推理介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
### 上文
self.lang = lang
self.extra_body = {
"enable_thinking": False # 默认禁用思考功能,可根据需要调整
# "thinking_budget": 4096 # 可选参数,控制思考的 token 数量
}
def generate(self, messages: list[dict]) -> str:
if isinstance(self.llm, OpenAI):
logger.debug(f"Generating content with model: {self.model}")
try:
# 根据模型名称动态调整请求参数
if self.model == "Qwen/Qwen3-235B-A22B":
logger.debug("Using optimized request scheme for Qwen/Qwen3-235B-A22B")
response = self.llm.chat.completions.create(
messages=messages,
temperature=0,
model=self.model,
stream=False, # 显式设置为非流式输出
extra_body=self.extra_body # 传递 extra_body 参数
)
### 下文

使用 keepalive workflow 保活

GitHub Actions 为了防止资源滥用,有一个限制:如果一个代码仓库在 60 天 内没有任何 push (推送) 操作,GitHub 会自动禁用该仓库所有的计划任务 (scheduled workflows)。对于像 zotero-arxiv-daily 这样依赖定时运行(例如每天运行一次)的项目来说,这无疑是太繁复的。

很多用户可能只是“一次配置,永久使用”,并不会频繁去修改代码。为了解决这个问题,我们可以使用一个现成的、广受欢迎的 Action:gautamkrishnar/keepalive-workflow。这个 Action 会在指定的时间(例如每周一次)自动向你的仓库推送一个微小的、无冲突的变更,从而保持仓库的活跃状态,它的唯一目的就是定期对仓库进行一次无意义的写入操作,模拟人工更新,从而重置 60 天的计时器。

创建新的 Workflow 文件

在你的项目仓库中,进入 .github/workflows/ 目录,创建一个新的 YAML 文件,例如 keepalive.yml。

编辑 Workflow 文件

将以下内容粘贴到 keepalive.yml 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
name: Keep Repo Alive (Manual)
on:
workflow_dispatch:
schedule:
- cron: '0 0 */25 * *'

jobs:
keep-alive:
runs-on: ubuntu-latest
permissions:
contents: write # 必须提供写入权限
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Create or update a file to trigger commit
run: |
# 创建一个时间戳文件,每次运行内容都会变化,确保有东西可提交
date > last_updated.txt

- name: Commit and push changes
run: |
# 配置 git 用户
git config --global user.name 'my-bot'
git config --global user.email 'my-bot@users.noreply.github.com'

# 添加更改并提交
git add last_updated.txt
# 使用 "git diff-index --quiet HEAD" 检查是否有改动
# 如果没有改动(比如文件内容没变),就不执行 commit 和 push,避免报错
if ! git diff-index --quiet HEAD; then
git commit -m "🚧 keepalive: auto-commit on $(date)"
git push
else
echo "No changes to commit."
fi

如果按 ai 给的默认方案走会,遇到一个权限问题,然后会让你生成一个 pat token 来给予权限然后使用$调用,但是实际上你只需要在 permissions 中添加 contents: write 即可。

1
2
permissions:
contents: write

结论

我对阅读的想法是”好读书不求甚解”, 特别对于研究来说,不必去追求每一步都完全读透,重要的是获取最新的信息和灵感。一是只有论文读的够多,才能读懂,而不是对着一篇精读就能全部读懂。二是论文都是别人的研究,而不是自己的研究,要从中汲取养分而不是生搬硬套。

因此,我认为利用 zotero-arxiv-daily 这样的工具可以帮助我们提高水平,节省时间和精力。哪怕一天能读一篇摘要呢?

引用

  1. GitHub - TideDra/zotero-arxiv-daily: Recommend new arxiv papers of your interest daily according to your Zotero libarary.