我打造了一个语义化的arXiv搜索引擎,具备AI生成的TL;DR、声明分类和论文对比功能

Reddit r/artificial 工具

摘要

一个用于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_ready0 = 待处理 · 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

相似文章