clip-retrieval
用自然语言或图片搜索相似图片的多模态检索工具,支持百亿级图文向量索引
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用自然语言或图片搜索相似图片的多模态检索工具,支持百亿级图文向量索引
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你在网上看到一张风格很棒的摄影作品,想找到风格相近的图片。传统方式只能搜索关键词,但关键词永远无法精确描述"赛博朋克夜景配上水墨画质感"这种抽象概念。clip-retrieval 解决的就是这个问题——它让你可以用自然语言描述来找图片,或者直接上传一张图片来搜索风格相似的图。
这个工具的核心逻辑并不复杂:首先用 OpenAI 的 CLIP 模型将图片或文字转换成一段数字向量(称为"embedding"),然后用向量数据库做最近邻(KNN)检索。比如你输入"一只戴着墨镜的猫",CLIP 会把它转换成一个 512 维的向量,系统再从索引好的几十亿个图片向量中,找出和你输入最接近的那些。
但这只是理论。实际应用中,如何高效处理数十亿张图片的向量计算、如何构建索引使其检索速度足够快、如何分布式运行在多台机器上……这些工程难题才是 clip-retrieval 的价值所在。LAION 团队正是用这个工具完成了 LAION-5B 数据集(目前最大的开源图文对数据集)的索引工作——那是 58 亿条图文数据,全球研究者都在用。

图1:clip-retrieval 的 Web UI 搜索界面,支持文字搜图和图片搜图两种模式
clip-retrieval 的架构分四个独立模块,通过 CLI 命令调用,彼此之间通过文件系统(Parquet、Arrow、WebDataset 格式)传递数据:
clip back(推理模块) — 输入原始图片 URL 列表或图片文件夹,用 CLIP 模型计算每张图的向量,输出为 Parquet/Arrow 格式的 embedding 文件。这是整个流程中最耗 GPU 的部分。项目支持分布式推理,可以用 SLURM 集群批量处理百亿级图片。作者在文档中提到,100M 条图文对的 embedding 计算在单卡 RTX 3080 上约需 20 小时。
clip filter(过滤模块) — 对 embedding 数据做 NSFW 内容过滤、模糊度检测等预处理。项目内置了一个 NSFW 分类模型(H14),可以将疑似色情内容从索引中剔除,保证检索结果的安全性。
clip index(索引模块) — 将上一步产出的 embedding 文件构建为 FAISS 索引(支持 IVF、IVF-PQ 等算法),支持增量追加(append_index)。对于超大规模数据集,可以使用 autofaiss 自动调参选择最优索引类型,在内存占用和检索速度之间取得平衡。构建好的索引可以加载到内存中供前端查询。
clip front(前端服务) — 提供 Flask REST API + 内置 Web UI。API 支持文字搜图、图片搜图、embedding 搜图三种模式;Web UI 是一个基于 Web Components 的单页应用,托管在 GitHub Pages 上。后端集成了 Prometheus 指标采集,配合 Grafana 可视化监控查询 QPS、延迟分布等核心指标。

图2:clip-retrieval 后端的 Grafana 监控面板,展示查询量和延迟分布
项目提供了两种接入方式:
CLI 模式 — 安装后通过 clip-retrieval 命令调用各子模块(back、index、filter、front)。Makefile 提供了 make install 一键安装,依赖通过 pip 自动处理。项目还提供了预编译的 PEX 可执行文件,可以直接分发而无需 Python 环境。
Python 客户端模式 — clip_retrieval.clip_client 封装了 HTTP API 调用:
from clip_retrieval.clip_client import ClipClient
client = ClipClient(url="https://rom1504.github.io/clip-retrieval", indice="mscoco-restricted")
results = client.query(text="a black dog and a silver cat")
支持文字搜图、图片搜图(URL 或本地文件)、embedding 搜图,以及批量处理。ClipClient 默认连接作者托管的公网 demo 服务,但用户也可以指向自己部署的 clip front 实例。
Colab 支持 — 项目提供了 Notebook 示例,可直接在 Google Colab 上运行,适合快速验证想法而不需要配置本地环境。
| 层次 | 技术选型 |
|---|---|
| 深度学习框架 | PyTorch(torch + torchvision),CLIP 模型基于 open-clip-torch |
| 向量检索 | FAISS(faiss-cpu/gpu)+ autofaiss 自动调参 |
| 数据格式 | Parquet + Arrow + WebDataset(大规模数据分片) |
| Web 服务 | Flask + flask-cors + flask_restful |
| 前端 | 原生 JavaScript + Web Components + webpack |
| 监控 | Prometheus client Python 库 |
| 分布式 | 支持 SLURM 集群 + HDFS/S3/GCS 文件系统 |
| 其他依赖 | img2dataset(图集下载)、sentence-transformers、multilingual-clip |
代码质量方面,项目使用 mypy 做静态类型检查、pylint 做代码风格检查、black 做格式化、pytest 做单元测试,覆盖了核心模块。项目文档非常完善:README 超过 27000 字,涵盖从安装到分布式推理的完整流程。
clip-retrieval 没有提供 Dockerfile 或 docker-compose,这是最大的部署障碍。对于没有深度学习经验的用户,从零配置 Python + CUDA + 依赖是一个挑战。
好在 make install 简化了安装流程——它本质上就是 pip install -e .,自动处理 requirements.txt 中的 25+ 个依赖。不过,CLIP 推理对 GPU 有硬性需求(至少 10GB 显存,建议 RTX 3080 或更高),纯 CPU 环境下 embedding 计算会非常缓慢。
对于百亿级数据量,需要分布式部署。文档中详细描述了通过 SLURM + HDFS/S3 的分布式推理方案。
快速启动建议:
make install 安装,跑 clip-retrieval front 启动服务clip-retrieval 的价值不在于算法创新,而在于工程落地。它把 CLIP 这类多模态模型从"demo 玩具"变成了"生产级工具"——让任何有 GPU 的人都能快速构建自己的图文检索系统。
在 clip-retrieval 出现之前,要实现类似功能需要自己拼装 CLIP 推理 + FAISS 索引 + Flask API + 前端,每一步都有坑。clip-retrieval 把这些模块打磨好、打通好,大幅降低了多模态检索系统的开发门槛。
LAION-5B 的成功也证明了这一点——如果没有 clip-retrieval 的高效批量处理能力,58 亿条图文数据的索引工作几乎不可能由一个开源社区独立完成。可以说 clip-retrieval 是开源多模态 AI 生态的重要基础设施之一。