3 个月前,我们开始了对 Papers with Code 的复兴(另见公告推文)。其目标是让开放的 AI 研究变得易于获取和理解,使人们能够轻松找到与论文相关的工件,了解 AI 各个领域的最新技术水平(state-of-the-art,SOTA),分享有趣的研究,并在彼此工作的基础上继续构建。换句话说,它的目标是推动研究浪潮,孕育出下一个 Transformer。
当然,要让 AI 研究变得易于获取,就需要一个强大的搜索引擎,让人类和智能体能够通过网站或 pwc search CLI 命令快速找到相关和相近的工作;智能体则可以通过技能(Skill)使用该命令。
需要注意的是,搜索研究成果与搜索普通文本并不完全相同。一个有用的论文搜索引擎应该能够找到精确的标题或 arXiv 标识符,但也应该理解“用于代码生成的小型语言模型”这样的查询,即使论文中并没有以这样的形式连在一起出现这些词。它还需要识别“最初的 BERT 论文”这样的导航式请求,容忍不完整的标题或拼写错误,并且即使模型服务处于冷启动状态或暂时不可用,也能快速返回结果。

Papers with Code 针对查询 DINO 的搜索结果。
对于 Papers with Code,我们将其构建为一个**混合搜索(hybrid search)**系统。这也基于我们此前在 ML6 的经验:在那里,我们为客户开发了基于 RAG 的系统。事实证明,混合搜索通常优于基于关键词或向量的搜索系统,因为它结合了两者的优势(更多信息还可以参考这篇博客)。关键词搜索能够找到精确匹配的提及,而向量搜索则能找到更加模糊、语义相近的术语。需要注意的是,重排序器(reranker)(也称为交叉编码器,cross-encoder)可以进一步改善结果,但也会带来额外的开销和延迟。

混合检索优于仅使用向量或关键词的搜索。图表来自 Microsoft 的 Azure AI Search:通过混合检索和重排序超越向量搜索(2023 年)。
Papers with Code 依赖 PostgreSQL 数据库,因此其全文搜索能力提供了快速的词法搜索基线。对于稠密嵌入,我们使用 pgvector 来增加语义召回率,并通过倒数排名融合(reciprocal rank fusion,RRF)算法将两者结合起来。稠密嵌入由以下三项 Hugging Face 服务共同支持:
-
Hugging Face Jobs 为论文语料库的嵌入生成提供可突发的 GPU 计算能力。
-
Hugging Face Storage Buckets 为数据库、实验和 Jobs 之间提供持久化的数据交接。
-
Hugging Face Inference Endpoints 为在线查询和增量更新提供低延迟的嵌入服务。
目前,该系统为超过 11 万篇来自 arXiv 和 Daily Papers 的现有论文维护嵌入。本文将介绍其架构、背后的设计决策,以及我们将其投入生产时获得的经验。
TL;DR
我们有意将搜索拆分为离线语料库构建和在线搜索服务两部分:

离线语料库构建与在线混合搜索流水线的架构。
成本高、面向吞吐量的工作由 Jobs 执行。持久化工件存储在 Bucket 中。只有查询嵌入这一小步骤位于请求链路上,并由受保护的 Inference Endpoint 提供支持,从而服务在线搜索。如果该端点处于冷启动状态、繁忙或不健康,搜索会立即回退到全文检索。这种分离使系统兼具强大功能和高速度。
从严格的嵌入契约开始
嵌入流水线经常会以一些不易察觉的方式失败:模型版本发生变化,查询提示词和文档提示词混用,向量截断方式不一致,或者更新后的摘要与已存储的向量不再匹配。
为避免这些问题,我们将嵌入格式视为一个有版本控制的 API。每篇论文都按照以下格式编码:
normalized title + "\n\n" + normalized abstract对于每次向量生成,我们都会记录:
- 模型仓库及其精确版本;
- 输出维度;
- 输入格式版本;
- 输入是查询还是文档;
- 规范化方法;
- 源标题和摘要的内容哈希。
我们的生产环境使用 Qwen/Qwen3-Embedding-0.6B,固定到精确版本,并生成 256 维、经过 L2 归一化的向量。我们借助 MTEB 排行榜选择了该模型。MTEB 是比较嵌入模型时广泛采用的基准。需要注意的是,Qwen3 等较新的嵌入模型支持两项新功能:
-
可以指定动态嵌入大小,从而在质量与速度、存储成本之间进行权衡。Qwen 模型将其称为 “MRL”,即 Matryoshka Representation Learning(套娃式表示学习)。你可以在这里了解详情。我们选择了 256 的嵌入维度,以提高搜索速度。
-
可以提供指令提示词。Qwen 嵌入模型支持
document提示词(我们使用它来嵌入论文),而在线搜索使用其query提示词(用于嵌入用户查询)。
这一契约贯穿嵌入从导出、经过 GPU 推理、写入 PostgreSQL,直到最终用于在线检索的整个过程。
Jobs 将数据库快照转化为向量语料库
全量语料库嵌入是一项典型的批处理任务。它需要在相对较短的时间内使用 GPU,能够从高吞吐量中受益,并且不应在运行之间持续占用资源。Hugging Face Jobs 非常适合这种任务:一个 Job 由命令、硬件规格以及可选的 Docker 镜像定义,并且可以运行依赖项以内联方式声明的 uv 脚本。
我们的语料库构建流程首先从可重复读的 PostgreSQL 快照中导出每篇论文的最新版本。导出器以流式方式读取数据行,而不是将整个目录加载到内存中;它会写入大小受限的 JSONL 分片,并创建一个包含行数和 SHA-256 校验和的清单。
我们将这个不可变的运行目录同步到私有的 Storage Bucket。