ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

10行代码写出你的第一个向量搜索:Faiss IndexFlat精确搜索快速上手教程

10行代码写出你的第一个向量搜索:Faiss IndexFlat精确搜索快速上手教程 10行代码写出你的第一个向量搜索Faiss IndexFlat精确搜索快速上手教程【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faissFaiss 是一个高效的向量相似性搜索与聚类库本教程带你用不到 10 行 Python 代码基于IndexFlat精确索引完成从安装、建索引到向量搜索的完整流程零门槛上手你的第一个向量搜索引擎。为什么选择 Faiss 做向量搜索入门Faiss 由 Meta 的 Fundamental AI Research 团队开发用 C 编写并附带完整的 Python/numpy 接口专门用于稠密向量的相似性搜索similarity search和聚类。它支持 L2欧氏距离和点积两种度量也支持余弦相似度。作为新手IndexFlat是 Faiss 中最简单、最直观的索引类型✅精确搜索exhaustive search逐个计算距离结果 100% 准确适合小规模数据集和教学验证✅无需训练建好索引即可直接添加向量、发起搜索✅内存占用低向量以原样存储随时可以重建reconstruct出原始向量其核心实现在 faiss/IndexFlat.h注释里一句话就说明了它的本质Index that stores the full vectors and performs exhaustive search存储完整向量并执行穷举搜索。一键安装最快获取 Faiss 的方法推荐通过 conda 安装预编译包详见 INSTALL.md# CPU 版本推荐新手使用 $ conda install -c pytorch -c conda-forge faiss-cpu # GPU 版本Linux需要 NVIDIA GPU $ conda install -c pytorch -c nvidia -c conda-forge faiss-gpu验证安装成功import faiss print(faiss.__version__) 提示conda-forge 渠道用于获取最新依赖如 MKL/OpenBLAS安装时务必保留。10行代码实现你的第一个 Faiss 向量搜索下面这段代码完整演示了Faiss IndexFlat 精确搜索的全部核心流程import numpy as np import faiss d 64 # 向量维度 xb np.random.random((10000, d)).astype(float32) # 1万条向量 index faiss.IndexFlatL2(d) # ① 创建 L2 精确索引 index.add(xb) # ② 写入向量数据库 print(index.ntotal) # ③ 查看索引规模 k 4 xq np.random.random((5, d)).astype(float32) D, I index.search(xq, k) # ④ 搜索每个查询向量的 k 个近邻 print(I, D)对照官方示例 tutorial/python/1-Flat.py这就是 Faiss 官方教程的第一个 Python 示例结构非常精简。读懂搜索结果D 与 I 分别代表什么search返回两个 numpy 数组理解它们是使用 Faiss 的关键返回值含义上面的例子中I(indices)每个查询向量的 k 个最近邻索引 ID形状 (5, 4) 的整数数组D(distances)对应的距离值L2 索引下越小说明越相似形状 (5, 4) 的浮点数组两点新手常踩的坑⚠️L2 度量看距离D的值越小代表向量越接近排序是升序的⚠️ID 就是添加顺序IndexFlat按add的顺序给向量编号I中的数字直接对应xb的行号因此官方示例还会用index.search(xb[:5], k)做一次用库内向量自查的 sanity check。如何切换搜索度量L2、点积与余弦IndexFlat家族由度量类型决定行为源码见 faiss/IndexFlat.hfaiss.IndexFlatL2(d)欧氏距离最小化 L2 距离faiss.IndexFlatIP(d)内积inner product最大化点积想要余弦相似度搜索Faiss 的官方做法是先把向量归一化再用IndexFlatIP——因为余弦相似度等于归一化向量的点积。x xb / np.linalg.norm(xb, axis1, keepdimsTrue) # 归一化 index faiss.IndexFlatIP(d)保存与加载让向量索引跨进程复用建好索引后不必每次重新构建。Faiss 提供内置的二进制格式读写接口见 faiss/index_io.hfaiss.write_index(index, my_index.faiss) # 保存 index faiss.read_index(my_index.faiss) # 加载加载后的索引可以直接继续add和search对新手来说这是最省心的持久化方式。新手避坑清单数据类型必须是float32向量和查询都要是np.float32的 C 连续数组用np.ascontiguousarray(x.astype(float32))转换最稳妥IndexFlat不需要训练is_trained恒为True而IndexIVF*、IndexPQ*等索引必须先train再add规模上限制IndexFlat是穷举搜索十万级向量在毫秒~秒级没问题百万级以上建议转向IndexIVFFlat参考 tutorial/python/2-IVFFlat.py维度必须一致查询向量的维度必须与建索引时的d完全相同否则搜索会抛出异常。下一步学习路径阶段目标参考入口入门巩固跑通 Flat 精确搜索tutorial/python/1-Flat.py进阶IVF 倒排索引 近似搜索tutorial/python/2-IVFFlat.py压缩加速PQ 乘积量化 FastScantutorial/python/3-IVFPQ.py索引选型通过 factory 字符串自动建索引faiss/index_factory.h性能基准官方 benchmark 脚本benchs/README.mdFaiss 的完整索引体系见 README.md 的 How Faiss works 一节所有索引都在搜索速度、搜索质量、内存占用之间做不同取舍IndexFlat是理解这些取舍的起点。 现在你已经掌握了Faiss IndexFlat 精确向量搜索的完整工作流——安装、建库、搜索、保存一条龙。接下来不妨把自己的一段文本 embedding 向量导进去试试感受 10 行代码撬动一个向量数据库的力量。【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进