USearch
极小极快的开源向量搜索引擎,C++单头文件实现,比FAISS快10倍、代码量少28倍
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
极小极快的开源向量搜索引擎,C++单头文件实现,比FAISS快10倍、代码量少28倍
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你有没有过这样的经历——用 AI 工具查询了一个问题,关掉对话后再也找不到同样的答案?你有没有想过,当 AI 理解了一段文本,它是怎么记住这个理解并在海量数据中快速找到相似内容的?答案是:向量搜索。
而今天要介绍的这个开源项目,可能是你见过最简洁、却最强大的向量搜索引擎——它叫 USearch,来自一家叫 Unum 的云基础设施公司,在 GitHub 上已收获超过 4100 颗星,被 Google、ClickHouse、DuckDB 等行业巨头信赖采用。

图1:USearch 项目 Logo
在 AI 时代,向量搜索是 RAG(检索增强生成)系统的核心基础设施。当你在 LlamaIndex 或 LangChain 中加载文档时,系统会将每段文本转化为一个高维向量,存入向量数据库。当你提问时,系统再把你的问题也转成向量,去数据库里找最相似的 N 个结果——这个找最近邻的过程,就是向量搜索。
目前这个领域最知名的方案是 Facebook 开源的 FAISS,它足够强大,但代价是代码库高达 84K 行(仅 faiss/ 目录),引入一个 100MB+ 的 C++ 库,在资源受限环境下简直是噩梦。更要命的是,FAISS 仅支持两种基础距离度量:内积(Inner Product)和欧几里得距离(L2),对于基因组学中的 Tanimoto 系数、地理信息中的 Haversine 距离等特殊场景,要么改源码、要么换方案。
USearch 的作者 ashvardanian 正是看到了这些痛点,决定另起炉灶:只保留 HNSW 图索引算法的核心精髓,用 C++11 单头文件(仅约 3K 行代码)重新实现——代码量只有 FAISS 的 1/28,但性能反而更优。
USearch 的底层原理是 HNSW(Hierarchical Navigable Small World)——一种基于概率图结构的分层近似最近邻搜索算法。你可以把它想象成一张多层的高速公路网络:最底层是所有城市之间的普通道路,中间层是省道,最高层是高速公路。搜索时,算法从最高层出发,先在高速公路上找到离目标最近的入口,然后逐层下沉,最终在底层找到精确匹配。这个设计让搜索从 O(n) 降到了 O(log n),同时保持了很高的准确率。
USearch 在 HNSW 实现上做了大量 SIMD(单指令多数据)优化,利用 AVX-512、AVX2、SSE4 等 CPU 指令集,在单次 CPU 周期内并行处理多个浮点数比较。这就是为什么 USearch 能在官方基准测试中达到比 FAISS 快 10 倍 的搜索速度,同时内存占用更少。
更重要的是,USearch 支持用户自定义距离度量函数,并通过 JIT(即时编译)技术在运行时动态优化。这意味着:
这种灵活性是 FAISS 无法提供的核心差异化能力。
在真实生产环境中,存储数十亿个高维向量是极其消耗内存的。USearch 支持多种标量量化格式,让你在精度和内存之间灵活取舍:
| 格式 | 位宽 | 适用场景 |
|---|---|---|
| f32 | 32位 | 最高精度要求 |
| bf16 | 16位 | 通用推荐,精度损失极小 |
| f16 | 16位 | 兼顾精度与内存 |
| e5m2 / e4m3 | 特殊浮点 | AI 模型输出专用 |
| i8 / u8 | 8位 | 高吞吐量场景 |
| b1 | 1位 | 超大规模过滤 |
特别是 bf16(bfloat16)格式,在 AI 推理场景中极为实用——它能直接将大语言模型的输出向量压缩 50%,而不显著影响搜索质量。这对需要处理数十亿向量的 RAG 系统来说是巨大优势。
USearch 的核心是一个纯头文件的 C++ 库(include/usearch/index.hpp),整个实现仅约 3000 行代码。这意味着:
通过 pybind11(Python)、node-gyp(JavaScript)、JNI(Java)等技术,USearch 提供了覆盖主流编程语言的官方绑定:
C++11(原生头文件) · Python 3 · JavaScript/TypeScript · Rust · Java · Go · C99 · Objective-C · Swift · C# · Wolfram
更令人惊喜的是,你可以在 Python 中构建索引、保存到文件,再到 Rust 中加载使用——跨语言索引完全兼容。对于需要在多种技术栈间协作的团队来说,这种一致性大幅降低了集成成本。

图2:USearch 支持的近似最近邻搜索方法对比
USearch 不仅是一个库,还自带一个基于 ucall 的高性能 HTTP API 服务器。通过官方 Dockerfile,可以一键部署:
docker run -p 8545:8545 usearch
服务暴露了以下 RESTful 接口:
GET /size — 查看索引中的向量数量GET /ndim — 查看向量维度POST /add_one — 添加单个向量POST /search_one — 搜索单个向量POST /add_many — 批量添加向量POST /search_many — 批量搜索向量POST /save / GET /load — 索引持久化这种设计让 USearch 可以轻松集成到任何技术栈中,无论是 Node.js 后端、Python FastAPI 服务还是 Java Spring 应用,都能通过 HTTP 调用向量搜索能力,完全不需要理解底层 C++ 代码。
USearch 已经在多个头部基础设施项目中得到采用:
被这些生产级项目采纳,本身就是 USearch 稳定性和性能的最佳背书。
安装 USearch(Python):
pip install usearch
创建一个简单的语义搜索索引:
import numpy as np
from usearch.index import Index
# 创建索引(余弦相似度,bf16 压缩)
index = Index(ndim=768, metric='cos', dtype='bf16')
# 添加向量(模拟 LLM embedding 输出)
doc_vectors = np.random.rand(1000, 768).astype(np.float32)
keys = np.arange(1000)
index.add(keys, doc_vectors)
# 搜索
query = np.random.rand(768).astype(np.float32)
matches = index.search(query, count=5)
print(f'最相似的5个文档: {matches.keys}')
# 保存索引
index.save('my_index.usearch')
整个过程不到 10 行代码,没有任何复杂的配置,真正做到了零门槛。
当然,USearch 也不是完美的解决方案:
USearch 是一个以少即是多为哲学的向量搜索基础设施项目。它用 3K 行 C++ 代码做到了 FAISS 用 84K 行才实现的核心功能,并通过 SIMD 优化实现了更快的速度和更低的内存占用。对于需要快速构建 RAG 系统、推荐系统或相似度搜索能力的开发者来说,USearch 提供了极低的接入门槛和足够用的灵活性——pip install 后 10 行代码即可跑通第一个搜索,是当前开源向量搜索生态中最值得关注的轻量级选手。
项目信息