我打造了一个语义化的arXiv搜索引擎,具备AI生成的TL;DR、声明分类和论文对比功能
摘要
一个用于arXiv论文的语义搜索引擎,具备AI生成的TL;DR、声明分类、论文对比等功能。使用Next.js、Cloudflare和开源模型构建。
查看缓存全文
缓存时间: 2026/06/08 15:21
Teycir/ArxivExplorer 源文件:https://github.com/Teycir/ArxivExplorer
支持开发
如果这个项目对你的工作有帮助,请支持持续维护和新功能的开发。
ETH 捐赠钱包 0x11282eE5726B3370c8B480e321b3B2aA13686582
扫描二维码或复制上方钱包地址。
| 许可证 | 框架 | 托管平台 | 数据库 | 向量 | AI 嵌入 | 本地 |
|---|
基于 AI 摘要的快速语义 arXiv 论文搜索——无需登录。
“研究论文,尽在解读。”
视频演示
截图
首页
高级搜索筛选
搜索与摘要内容相似的论文
主张评估
作者页面
论文对比
探索与发现
特性
核心搜索与发现
- 混合搜索——结合 FTS5 关键词搜索和 Vectorize 语义搜索,获得精准结果
- 高级筛选——按作者(子串匹配)、引用数、分类和日期范围筛选
- 智能缓存——基于 KV 的缓存,搜索结果 TTL 为 2 小时,嵌入向量 TTL 为 24 小时
- 相关论文——通过 Vectorize 预先计算语义最相似的 8 篇论文
- 主题合集——带有分类映射的精选主题(存储在
topics表中) - 作者页面——作者统计、时间线可视化和全部论文
- 全文搜索——SQLite FTS5 虚拟表,带自动触发器
AI 驱动特性
- 预先生成的摘要——一句话总结、关键贡献、方法、局限、入门/技术解释
- 实体提取——关键词、实体(模型/数据集/基准)、论文类型分类
- 主张分类——基于 AI 的科学主张支持/矛盾分析
- 智能摘要——带有先修知识和后续问题的增强论文元数据
论文管理
- 书签——客户端收藏,90 天 TTL(软上限 100 个书签)
- 导出选项——支持 JSON 和 BibTeX 格式导出收藏
- 论文对比——并排对比视图(最多 6 篇论文)
- 修订历史——追踪论文更新和版本差异
- 分享与复制——快速复制 arXiv ID 和 BibTeX 条目
丰富与元数据
- 引用追踪——集成 Semantic Scholar,显示引用数 + 高影响力引用
- 引用快照——历史引用数据存储在
citation_snapshots表中 - CrossRef 集成——期刊元数据、出版商、许可证、资助方
- OpenAlex 数据——概念、隶属机构、机构数据(ROR ID)
- Papers With Code——代码仓库、基准、SOTA 排名(schema 已就绪)
用户参与
- 成就系统——基于游戏的徽章,存储在客户端并记录活动
- 最近搜索——搜索历史,含建议
- 个性化推送——基于书签历史的推荐
- RSS 源——
/rss.xml提供最新 20 篇论文(1 小时缓存)
开发者工具
- CLI 界面——
arxiv-cli供 AI 助手使用(搜索、趋势、主题、作者) - 管理 API——Vectorize 批量操作、维护端点、丰富触发器
SEO 与可发现性
- 动态元标签——所有论文页面支持 Open Graph 和 Twitter Card 标签
- Sitemap.xml——自动生成站点地图,包含所有论文、主题和作者
- Robots.txt——搜索引擎爬虫配置
- 结构化数据——论文和作者的 JSON-LD 架构标记
- SSR 内容——服务器端渲染页面,为爬虫提供完整内容
- 规范化 URL——正确的规范化标签,防止重复内容
- AI Agent 发现——
/ai.txt和/llms.txt路由,用于 LLM 工具集成
性能
- 边缘缓存——Cloudflare KV,采用智能 TTL 策略
- ISR 渲染——Next.js ISR,每 10 分钟重新验证
- 零登录——立即访问所有功能
- 全球 CDN——Cloudflare Workers 边缘部署
安全性
- 速率限制——所有公共端点基于 IP 的令牌桶(60-100 请求/分钟),含锁定机制
- SQL 注入防护——通过 D1
.prepare().bind()实现 100% 参数化查询 - 输入净化——对所有用户输入进行严格验证(控制字符、长度限制、白名单)
- 时间安全的认证——管理端点使用
crypto.timingSafeEqual(无时间侧信道) - 严格的 CORS——仅限明确的源(启动时拒绝通配符)
- AI 配额保护——严格的字符限制 +
/api/classify-claim速率限制 - 错误净化——通用 500 消息(内部细节仅记录在服务端)
详见 SECURITY.md。
架构
构建于 Cloudflare 边缘平台,实现全球化性能:
- 前端:Next.js 作为 Cloudflare Worker 部署(通过 OpenNext +
main+assets模式) - API:Cloudflare Workers
- 数据库:Cloudflare D1 (SQLite)
- 向量搜索:Cloudflare Vectorize
- 缓存:Cloudflare KV
- AI:Workers AI(Llama 3.1 + BGE 嵌入)用于实时推理;本地 Ollama 用于批量处理
部署说明:前端作为 Worker 部署(而非 Cloudflare Pages),以避免 Pages 无条件向
script-src注入每个请求的 nonce,从而破坏应用的 CSP。
系统设计
浏览器 → Next.js Worker → API Worker → KV 缓存 → D1 数据库
↓
Vectorize
↑
Ingest Worker (Cron)
↑
Workers AI / 本地 Ollama
数据管道
论文经过多阶段管道处理:
1. 获取阶段
Ingest Worker 按 cron 计划(0 * * * * 每小时)轮询 arXiv API,并将新论文写入 D1,状态为 summary_ready = 0。
2. 摘要生成阶段
由 Ingest Worker(Workers AI,有限速)或本地批量脚本(Ollama,无限制)生成:
- 结构化摘要(tldr、贡献、方法、局限、解释)
- 论文嵌入向量,用于语义搜索
- 完成后设置
summary_ready = 1
3. 丰富阶段(可选)
- 引用:Semantic Scholar API 通过 cron 更新引用数
- CrossRef:基于 DOI 的元数据丰富(每天 cron
30 2 * * *) - OpenAlex:概念、隶属机构、开放获取元数据
- Papers With Code:代码仓库、基准、SOTA 排名
4. 相关论文
使用 Vectorize 预先计算语义最相似的 8 篇论文,并存储在 related_papers 表中。
Cron 计划
Ingest Worker 运行单个 cron 触发器:
* * * * *—— 每分钟(每次运行处理 1 篇论文,失败重试 1 次;同时通过相同 cron 运行 Semantic Scholar 引用更新)
CrossRef 丰富通过管理端点(POST /admin/crossref-batch)触发,而非独立 cron。
本地批量处理
当远程 Workers AI 达到速率限制时,使用本地 Ollama 管道追赶进度:
# 使用本地 Ollama 处理远程 D1 中所有待处理/失败的论文
ADMIN_SECRET= npx tsx scripts/process-pending-local.ts
# 将已完全处理的本地数据库推送到远程 D1 + Vectorize
ADMIN_SECRET= npx tsx scripts/push-local-to-remote.ts
# 批量获取(获取 + 摘要 + 嵌入一次性完成)
npx tsx scripts/bulk-ingest.ts --days 7 --categories cs.LG,cs.CL
两个脚本都直接使用 D1 REST API(不使用 wrangler 子进程),比 naive 方法快约 100 倍,且避免了论文文本中特殊字符的 shell 转义问题。
本地使用的 Ollama 模型:
| 角色 | 模型 |
|---|---|
| 摘要 | gemma4:e4b (8B, Q4_K_M) |
| 嵌入 | nomic-embed-text (137M, F16) |
快速开始
前提条件
- Node.js 18+
- Cloudflare 账户(免费版可用)
- Wrangler CLI:
npm install -g wrangler
安装
git clone https://github.com/yourusername/arxiv-explorer.git
cd arxiv-explorer
npm install
wrangler login
# 创建基础设施
wrangler d1 create arxiv-explorer
wrangler kv:namespace create CACHE
wrangler vectorize create arxiv-papers --dimensions=768 --metric=cosine
# 更新 wrangler 配置文件,填入你的 ID
# 编辑:wrangler.api.toml, wrangler.ingest.toml, wrangler.jsonc
# 应用数据库 schema(规范版本)
wrangler d1 execute arxiv-explorer --remote --file=migrations/schema.sql
# 复制并填写环境文件
cp .env.local.example .env.local
cp scripts/config.local.example.ts scripts/config.local.ts
# 编辑 scripts/config.local.ts,填入你的 Cloudflare 凭据
开发
npm run dev # Next.js 开发服务器
wrangler dev --config wrangler.api.toml # API Worker
wrangler dev --config wrangler.ingest.toml # Ingest Worker
访问 http://localhost:3000
部署
# 完整部署(Next.js + API Worker)
./deploy.sh
# 或单独部署:
npm run deploy # Next.js 前端(OpenNext Worker 模式)
npm run deploy:api # API Worker
npm run deploy:ingest # Ingest Worker
# 注意:deploy.sh 不会部署 Ingest Worker
# 需要时手动部署 Ingest Worker
项目结构
├── app/ # Next.js 16 app 目录
│ ├── page.tsx # 首页
│ ├── search/ # 搜索结果
│ ├── paper/[id]/ # 论文详情页
│ ├── topic/[slug]/ # 主题页面
│ ├── author/[name]/ # 作者页面
│ ├── compare/ # 论文对比
│ ├── diff/[id]/ # 论文修订历史
│ ├── bookmarks/ # 书签管理
│ ├── explore/ # 探索页面
│ ├── achievements/ # 成就追踪
│ ├── claim/ # 主张分类
│ ├── faq/ # FAQ 页面
│ ├── how-to-use/ # 用户指南
│ ├── rss.xml/ # RSS 源路由
│ │ └── route.ts
│ ├── ai.txt/ # LLM 发现路由
│ │ └── route.ts
│ ├── llms.txt/ # LLM 发现路由
│ │ └── route.ts
│ └── components/ # React 组件
│ ├── SummarySection.tsx
│ ├── PaperCard.tsx
│ ├── SearchFilters.tsx
│ ├── BookmarkButton.tsx
│ ├── CollectionManager.tsx
│ ├── SearchBoxHome.tsx
│ ├── Navbar.tsx
│ ├── Footer.tsx
│ └── ... (40+ 组件)
├── src/
│ ├── api-worker/ # Cloudflare Workers API
│ │ ├── index.ts # 路由器
│ │ └── routes/
│ │ ├── search.ts # 混合搜索(FTS5 + 语义)
│ │ ├── paper.ts # 论文详情
│ │ ├── related.ts # 相关论文
│ │ ├── trending.ts # 趋势论文
│ │ ├── topic.ts # 主题端点
│ │ ├── topics.ts # 列出主题
│ │ ├── author.ts # 作者端点
│ │ ├── authors.ts # 列出作者
│ │ ├── claim.ts # 主张分类
│ │ ├── admin.ts # 管理端点(Vectorize、维护)
│ │ ├── stats.ts # 数据库统计
│ │ └── sitemap.ts # Sitemap 生成
│ ├── ingest-worker/ # 后台处理(cron)
│ │ ├── index.ts # Cron 入口
│ │ ├── pipeline.ts # 主要摄取管道
│ │ ├── fetch-arxiv.ts # arXiv API 获取器
│ │ ├── generate-summary.ts
│ │ ├── generate-embedding.ts
│ │ ├── generate-entities.ts
│ │ ├── update-citations.ts # Semantic Scholar 同步
│ │ ├── fetch-crossref.ts # CrossRef 丰富
│ │ ├── fetch-openalex.ts # OpenAlex 丰富
│ │ ├── fetch-pwc.ts # Papers With Code 丰富
│ │ ├── compute-related.ts # 相关论文计算
│ │ └── tfidf.ts # TF-IDF 工具
│ └── shared/ # 共享类型和工具
│ ├── types.ts # TypeScript 接口
│ ├── db.ts # 数据库辅助函数
│ └── utils.ts # 工具函数
├── scripts/
│ ├── push-local-to-remote.ts # 同步本地 → 远程 D1 + Vectorize
│ ├── retry-failed-local.ts # 通过 Ollama 重新处理待处理论文
│ ├── bulk-ingest.ts # 完整批量摄取管道
│ ├── sync-remote-to-local.ts # 同步远程 → 本地
│ ├── backfill-*.ts # 各种回填脚本
│ ├── upload-embeddings.ts # 独立 Vectorize 上传器
│ ├── test-*.sh # 测试脚本
│ ├── config.local.example.ts # 本地配置模板
│ └── ... (25+ 工具脚本)
├── migrations/
│ ├── schema.sql # 规范 D1 schema(单一事实来源)
│ ├── 0001_schema.sql # 初始迁移(旧版)
│ └── 000*.sql # 其他迁移
├── helper/ # API 客户端辅助
├── lib/ # 前端库
├── wrangler.api.toml # API Worker 配置
├── wrangler.ingest.toml # Ingest Worker 配置
├── wrangler.jsonc # Next.js Worker 配置(前端)
├── next.config.ts # Next.js 配置
├── open-next.config.ts # OpenNext Cloudflare 适配器配置
└── deploy.sh # 部署脚本
API 参考
GET /api/search?q=attention+mechanisms # 混合 FTS5 + 语义搜索
GET /api/search?q=...&author=Hinton # 按作者筛选(子串匹配)
GET /api/search?q=...&minCitations=10 # 按最低引用数筛选
GET /api/search?q=...&category=cs.LG # 按 arXiv 分类筛选
GET /api/search?q=...&date=week # 按日期筛选(天/周/月)
GET /api/search?q=...&author=X&minCitations=Y&... # 组合多个筛选条件
GET /api/paper/:id # 论文详情 + 摘要
GET /api/paper/:id/related # 语义相似论文
GET /api/trending # 趋势论文(KV 缓存)
GET /api/topic/:slug # 主题论文合集
GET /api/topics # 列出所有主题
GET /api/author/:name # 作者论文和统计
GET /api/authors # 列出作者
GET /api/stats # 数据库统计
GET /api/sitemap # SEO 站点地图
GET /rss.xml # RSS 源(20 篇最新论文,1 小时缓存)
GET /compare?ids=id1,id2,id3 # 并排对比最多 6 篇论文
POST /api/classify-claim # AI 主张分类
# 管理端点(需要 x-admin-secret)
POST /admin/vectorize/upsert # 批量嵌入 upsert
POST /admin/retry-failed # 重置 summary_ready=2 → 0
POST /admin/backfill-related # 回填相关论文
POST /admin/crossref-batch # CrossRef 批量丰富
POST /admin/related/clear # 清空相关论文
POST /admin/related/bulk-insert # 批量插入相关论文
POST /admin/kv/delete # 删除 KV 缓存条目
GET /admin/papers/all # 导出所有论文
配置
环境变量
# .env.local (Next.js 前端)
NEXT_PUBLIC_API_BASE=https://arxiv-api.yourdomain.workers.dev
API_BASE=https://arxiv-api.yourdomain.workers.dev
// scripts/config.local.ts (用于本地脚本)
export const CF_TOKEN = 'your-cloudflare-api-token';
export const CF_ACCOUNT_ID = 'your-account-id';
export const CF_D1_ID = 'your-d1-database-id';
摄取设置 (wrangler.ingest.toml)
[vars]
ARXIV_FETCH_CATEGORIES = "cs.AI,cs.LG" # 默认获取分类(按需添加更多)
ARXIV_FETCH_LIMIT_PER_CATEGORY = "0" # 每次 cron 每分类论文数(0 = 仅处理待处理)
INGEST_MAX_CONCURRENT = "1" # 并发 AI 处理数
ARXIV_RATE_LIMIT_DELAY_MS = "3000" # arXiv 请求间隔
SUMMARY_MODEL = "@cf/meta/llama-3.1-8b-instruct" # Workers AI 摘要模型
EMBEDDING_MODEL = "@cf/baai/bge-base-en-v1.5" # Workers AI 嵌入模型
INGEST_PHASE = "hourly" # 阶段标签(仅信息)
POLITE_EMAIL = "[email protected]" # arXiv API 联系邮箱
# 可选 Ollama(本地 AI)
# OLLAMA_BASE = "https://your-tunnel.trycloudflare.com"
# OLLAMA_SUMMARY_MODEL = "gemma4:e4b"
# OLLAMA_EMBEDDING_MODEL = "nomic-embed-text"
每分钟 cron 计划:
- 每次运行处理恰好 1 篇待处理论文(summary_ready = 0 或 7 天内失败)
- 失败时重试一次(总共 2 次尝试)
- 每日配额:最多 113 篇论文/天(5,000 神经元,每日预算 50% 保留给 tooltips)
- 通过 KV 追踪配额,UTC 00:00 自动重置
管理密钥
Vectorize upsert、维护端点和丰富端点需要:
# 为 API Worker 设置
wrangler secret put ADMIN_SECRET --config wrangler.api.toml
# 在本地脚本中使用
ADMIN_SECRET=your-secret npx tsx scripts/push-local-to-remote.ts
数据库 Schema
papers
- arXiv 元数据(id, title, authors, abstract, categories, dates, URLs)
authors_normalized—— 小写,用于快速前缀搜索citation_count—— 来自 Semantic Scholar(通过 cron 每小时更新)citations_updated_at—— 上次引用同步时间戳summary_ready:0= 待处理 ·1= 完成 ·2= 失败- 其他字段:
comment,journal_ref,doi,primary_category
summaries
tldr—— 一句话结果key_contributions—— JSON 数组methods—— JSON 数组limitations—— JSON 数组beginner_explain—— 通俗语言段落technical_summary—— 研究人员级别段落model_version—— 生成该摘要的模型
辅助表
paper_categories—— 规范化分类行(为主题查询建立索引)p
相似文章
过去6个月arXiv人工智能论文的交互式语义流分析
TraceScope 提供了一个基于交互式网页的工具,用于探索 arXiv 上最新人工智能论文的语义流,其开源库可在 GitHub 上获取。
我打造了 Paper Deck:发现 AI/ML 论文的更好方式 [P]
一个名为 Paper Deck 的开源工具,聚合来自 arXiv 和 Hugging Face 的 AI/ML 论文,支持阅读、收藏以及跨设备进度追踪。
每天有数百篇论文上传到arXiv,但可能只有3篇与我的研究相关,所以我开发了一个开源工具来找到它们 [P]
作者开发了Research Radar,一个开源工具,可自动获取arXiv论文,使用LLMs对摘要进行评分以匹配用户定义的研究兴趣,并生成包含深度阅读摘要的个性化每日摘要。
@akshay_pachaar: 将任何论文转化为可运行代码。只需在论文URL中将arxiv替换为autoarxiv,即可将论文交给AI代理……
autoarxiv 让你只需将 URL 改为 autoarxiv.org,就能将任何 arxiv 论文转换为可运行代码。来自 alphaXiv 的 AI 代理会阅读论文、克隆仓库、配置依赖项,并运行最小复现来验证声明,实时记录所有内容。
@Jolyne_AI: GitHub 上有个开源小工具:daily-arXiv-ai-enhanced,帮你把“追论文”这件事变成每天自动完成的日常。 它会每日抓取 arXiv 最新论文,并用 DeepSeek 等大模型生成中文摘要,让你用更少时间,快速跟上 A…
daily-arXiv-ai-enhanced 是一个开源工具,通过GitHub Actions每日自动抓取arXiv最新论文,并使用DeepSeek等大模型生成中文摘要,帮助快速跟进AI研究进展。