泰州网站建设制作工作室如何删除多个wordpress
2025/12/25 0:43:20 网站建设 项目流程
泰州网站建设制作工作室,如何删除多个wordpress,学做网站学费,四川省凉亭建设工程有限公司网站在之前的文章中#xff0c;我们系统性的介绍了 嵌入和语义检索 以及 向量相似度。 本文将在语义检索领域探讨更加接近实战的话题#xff1a;如何如何选择FAISS的索引类型。 Faiss 是一个用于高效相似性搜索和密集向量聚类的库。它使用 C 编写#xff0c;并提供了完整的 Pyth…在之前的文章中我们系统性的介绍了 嵌入和语义检索 以及 向量相似度。本文将在语义检索领域探讨更加接近实战的话题如何如何选择FAISS的索引类型。Faiss是一个用于高效相似性搜索和密集向量聚类的库。它使用 C 编写并提供了完整的 Python 封装。 可以在 CPU 上运行只是一些最有用的算法是在 GPU 上实现的。它的主要功能是k-NN 检索: 不仅返回最近的邻居还返回第二近、第三近、……、第 k 近的邻居批量处理: 一次搜索多个向量而不是一次搜索一个。 对于许多索引类型这比一个接一个地搜索向量更快以精度换取速度: 以 10% 的不正确结果为代价换取 10 倍的速度或使用更少的内存范围搜索返回查询点给定半径内的所有元素本地存储 将索引存储在磁盘上而不是在 RAM 中…FAISS索引概览Faiss支持多种相似度度量方式包括欧氏距离L2距离、内积余弦相似度、汉明距离等以适应不同应用场景的需求。Faiss提供了众多类型的索引大体上可以分为两大家族二进制索引/Binary 索引/Binary Indexes不常用 和实值索引常用。Faiss的核心在于其高效的索引结构和搜索算法常用的有以下几类从索引结构上看平面索引Flat方法名IndexFlatL2/IP:最简单的索引结构它不修改输入的向量将所有向量存储在一起。搜索时需遍历整个数据集计算查询向量与每个数据向量的相似度。倒排文件索引Inverted File Index缩写IVF方法名IndexIVF*基于聚类的思想先将数据集划分为多个子集。搜索时先找到最相关的几个子集近似搜索再在子集中精确搜索。为什么要倒排正排应该是 “向量→所属聚类”即每个向量记录自己属于哪个分区以向量为中心;倒排IVF 的实际做法是 “聚类→向量列表”即每个聚类中心记录属于该分区的所有向量形成 “倒排表Inverted List”。在向量检索中若用 正排 逻辑每个向量记录自己的分区查询时需要遍历所有向量检查其所属分区是否匹配效率极低O(N)。而倒排逻辑通过聚类→向量列表的映射能直接定位到候选分区的向量集合只需在小范围内搜索O(M)M 远小于 N这正是 “倒排” 带来的核心效率提升。基于图的索引Hierarchical Navigable Small World缩写HNSW方法名IndexHNSW*基于图的近似最近邻搜索算法构建多层图结构每一层节点代表一个向量节点间边代表相似度。搜索时通过层次跳跃快速缩小搜索范围最终找到近似最近邻。HNSWHierarchical Navigable Small World的本质是给向量构建一张多层级的 “导航图”上层图是 “高速路”少节点、跳得远下层图是 “街道”多节点、走得细。即上层快速缩小范围下层精准定位目标。乘积量化索引Product Quantization将高维向量拆分成多个低维子向量分别量化压缩后存储大幅降低内存占用并加速距离计算。单独使用较少多与 IVF倒排文件结合为IndexIVFPQ先分区再量化平衡速度、内存与精度。从搜索算法角度看精确索引Exact Index : 遍历所有向量保证返回最精确的近邻结果。IndexFlatIP和IndexFlatL2就属于精确索引。虽然结果精确但当数据集非常大时搜索速度会比较慢。近似索引Approximate Index : 通过牺牲一定的搜索精度来换取更快的搜索速度和更低的内存占用。例如IndexIVFFlat和IndexHNSWFlat。它们适用于需要处理大规模数据集且对精度要求相对宽松的场景。下图展示了 Faiss 索引家族的概况{{ mermaid }}graph LRA[FAISS索引层级结构\nFAISS Index Hierarchy] -- B1[实值索引\nReal-valued Index Family]B1[实值索引\nReal-valued Index Family] -- C1[IndexFlatL2/IP]B1[实值索引\nReal-valued Index Family] -- C2[IndexIVF*]B1[实值索引\nReal-valued Index Family] -- C3[IndexHNSW*]B1[实值索引\nReal-valued Index Family] -- C4[…]A[FAISS索引层级结构\nFAISS Index Hierarchy] -- B2[二进制索引\nBinary Index Family]B2[二进制索引\nBinary Index Family] -- D1[IndexBinaryFlat]B2[二进制索引\nBinary Index Family] -- D2[IndexBinaryIVF]B2[二进制索引\nBinary Index Family] -- D3[IndexBinaryHNSW]B2[二进制索引\nBinary Index Family] -- D4[…]{{ /mermaid }}二进制索引二进制索引Binary Indexes是 FAISS 的一个独立分支体系它们与实值索引Real-valued Index共享一套相同的上层接口但底层存储和相似度计算方式完全不同。如下表家族类型存储形式距离度量典型用途实值索引Real-valued Index向量为float32连续数值欧氏距离、内积、余弦相似度语义检索、图像检索、文本嵌入二进制索引Binary Index向量为二进制码0/1 比特汉明距离Hamming Distance二值特征、指纹特征、压缩特征匹配汉明距离Hamming Distance计算两个等长二进制字符串或二进制向量中对应位置上 “0” 和 “1” 不同的位数以此衡量两者的差异程度。例如字符串 A101101字符串 B111001逐位对比第 2 位0 vs 1、第 4 位1 vs 0不同共 2 个不同位 → 汉明距离 2。二进制索引的核心思想在二进制索引中每个向量不是浮点数而是一串二进制比特浮点向量(x): [0.1, 0.7, -0.3, -0.2, ...] 二值向量(b): 1100...这些比特通常来自于浮点向量经过二值化binarization处理例如使用下面的Sign函数即可将上面的 浮点向量(x) 转换为 二值向量(b)b i { 1 if x i ≥ 0 0 otherwise b_i \begin{cases} 1 \text{if } x_i \ge 0 \newline 0 \text{otherwise} \end{cases}bi​{10​ifxi​≥0otherwise​然后通过汉明距离Hamming distance来比较相似度。二进制索引的常见类型索引类型含义特点IndexBinaryFlat精确汉明距离计算与IndexFlatL2类似精确搜索IndexBinaryIVF倒排文件 汉明距离与IndexIVFFlat类似分区加速IndexBinaryHNSW图索引 汉明距离与IndexHNSWFlat类似高效近似二进制索引与实值索引的关系对比项实值索引Real-valued二进制索引Binary向量类型float32uint8bit-packed相似度度量L2 / Inner Product / CosineHamming Distance搜索精度高连续空间较低离散空间存储占用较大极小压缩比高搜索速度较慢极快按位异或位计数常见用途语义检索、嵌入(Embedding)二值哈希检索、图像指纹、局部特征示例两类索引的使用区别importfaissimportnumpyasnp# 浮点向量xbnp.random.random((1000,128)).astype(float32)index_ffaiss.IndexFlatL2(128)index_f.add(xb)# 二值向量假设已二值化xb_binnp.random.randint(0,2,(1000,128)).astype(uint8)index_bfaiss.IndexBinaryFlat(128)index_b.add(xb_bin)两者都可以.add()/.search()但计算方式完全不同IndexFlatL2使用欧氏距离IndexBinaryFlat使用汉明距离二进制索引的优势与局限优势局限极小存储128维仅16字节相似度精度较低查询极快基于位运算无法直接处理浮点嵌入Embedding适合硬件加速GPU/FPGA不适合复杂语义向量空间小结二进制索引是一条并行的、针对二进制特征优化的索引体系它的结构设计借鉴了实值索引但使用汉明距离代替了浮点距离。它不是“Flat/IVF/PQ”的子类而是另一类以汉明距离为核心的索引体系用于二值化特征的超高效相似度搜索。实值索引下面我们看看常用的 Faiss 实值索引。1. IndexFlatIP (Flat Inner Product Index)类型: 精确索引 (Exact Index)度量: 内积 (Inner Product, IP)工作原理: IndexFlatIP 是最基础的 Faiss 索引类型之一。它将所有向量不做任何压缩或编码直接存储。在搜索时它会暴力遍历索引中的所有向量计算每个向量与查询向量的内积并返回内积值最高的 K 个向量作为最近邻。优点:精度高: 由于是针对全部向量的暴力搜索具有完美的召回率。实现简单: 理解和实现都非常直接。缺点:速度慢: 当数据集非常大时搜索速度会非常慢不适合大规模数据集的实时应用。内存占用高: 需要存储所有原始向量内存消耗大。适用场景:小规模数据集: 当数据集规模较小时例如几百万甚至更小可以接受暴力搜索的耗时。对精度要求极高: 在一些对搜索结果精度要求非常高的场景下例如需要作为评估其他近似索引方法精度的基准。原型验证和实验: 在算法原型开发阶段可以使用 IndexFlatIP 来快速验证算法的正确性然后再考虑更高效的索引方法。indexfaiss.IndexFlatIP(dimension)2. IndexFlatL2 (Flat L2 Distance Index)类型: 精确索引 (Exact Index)度量: L2 距离 (欧氏距离, Euclidean Distance)工作原理: 与 IndexFlatIP 类似IndexFlatL2 也将所有向量原始地存储并进行暴力搜索。不同之处在于IndexFlatL2 计算的是 L2 距离 (欧氏距离)并返回 L2 距离最小的 K 个向量作为最近邻。优点和缺点: 与 IndexFlatIP 类似精度高实现简单但速度慢内存占用高。适用场景:小规模数据集且需要基于 L2 距离 进行相似性搜索的场景。同样适用于精度要求高或作为基准测试的场景。indexfaiss.IndexFlatL2(dimension)3. IndexIVFFlat (Inverted File Flat Index)类型: 近似索引 (Approximate Index)度量: 通常与 L2 距离或内积结合使用工作原理: IndexIVFFlat 引入了倒排文件(Inverted File) 的思想来加速搜索。它首先将向量空间划分为多个单元 每个单元有一个 聚类中心。在索引构建阶段每个向量会被分配到离它最近的聚类中心所代表的单元中。在搜索阶段首先找到与查询向量最近的若干个单元然后在这些单元内部进行暴力搜索 (Flat 搜索)。优点:搜索速度快: 通过只在部分单元内搜索大大减少了搜索范围提高了搜索速度。可控的精度和速度平衡: 可以通过调整单元的数量 (nlist) 和搜索时访问的单元数量 (nprobe) 来平衡搜索精度和速度。在FAISS的IVF倒排文件索引中nlist和nprobe是两个核心参数直接决定了索引的空间分区粒度和搜索范围进而平衡搜索的速度与精度nlist聚类中心的数量空间分区数作用定义IVF索引将整个向量空间划分的聚类分区数量。训练时IVF会对向量进行聚类生成nlist个聚类中心每个中心对应一个“ Voronoi 胞腔”分区所有向量被分配到距离最近的分区中形成nlist个倒排表。影响nlist越大每个分区包含的向量越少理论上局部搜索速度越快但聚类中心的存储和计算成本越高训练时间更长。nlist需与数据量匹配通常设为1024、2048等数据量越大nlist可适当增大。nprobe查询时访问的分区数作用指定搜索时需要检查的候选分区数量。查询时先计算查询向量与nlist个聚类中心的距离然后选取距离最近的nprobe个分区仅在这些分区的倒排表中搜索向量。影响nprobe越小搜索范围越窄速度越快但可能漏掉真正的近邻精度下降。nprobe越大覆盖的候选分区越多精度越高但需要计算更多向量的距离速度变慢。是IVF索引中最关键的调优参数通常通过实验在速度与精度间权衡例如nlist1024时nprobe16为常见折中值。缺点:近似搜索: 由于只搜索了部分单元可能错过真正的最近邻因此是近似搜索。需要预训练: 需要先对数据集进行聚类得到聚类中心。适用场景:中等规模数据集: 适用于数据集规模较大但仍然希望在一定精度下获得较快搜索速度的场景。需要平衡精度和速度: 可以通过调整参数来适应不同的精度和速度需求。quantizerfaiss.IndexFlatL2(dimension)# 使用 L2 距离的量化器indexfaiss.IndexIVFFlat(quantizer,dimension,nlist100)# nlist 是聚类中心的数量index.train(embeddings_array)# 必须先训练索引index.add(embeddings_array)# 然后将数据添加到索引中4. IndexHNSWFlat (Hierarchical Navigable Small World graph Index)类型: 近似索引 (Approximate Index)度量: 通常与 L2 距离或内积结合使用工作原理: IndexHNSWFlat 基于分层可导航小世界图(HNSW,Hierarchical Navigable Small World graph) 算法。它构建一个多层图结构图中每个节点代表一个向量。在高层图中节点之间的连接较少主要用于快速定位到可能包含最近邻的区域在低层图中节点连接更密集用于在局部区域进行更精细的搜索。搜索过程从顶层图开始逐步向下层图深入最终快速定位到最近邻。优点:搜索速度非常快: HNSW 算法在搜索速度上通常比 IndexIVFFlat 更快尤其是在高精度要求下。精度较高: 在相同的搜索速度下HNSW 通常能提供更高的精度。无需预训练: HNSW 索引的构建过程不需要预先进行聚类。缺点:索引构建时间较长: HNSW 索引的构建时间通常比 IndexIVFFlat 长。内存占用相对较高: 为了维护图结构HNSW 的内存占用通常比 IndexIVFFlat 高。适用场景:大规模数据集: 适用于需要处理非常大的数据集并对搜索速度和精度都有较高要求的场景。对实时性要求高: 例如在线推荐系统、实时检索等。indexfaiss.IndexHNSWFlat(dimension,M16)5. IndexIVFPQ类型: 近似索引 (Approximate Index)度量: 通过 “IVF PQ Product Quantization” 实现高效检索工作原理: 倒排文件与乘积量化Product Quantization结合将高维向量压缩为低维编码。使用乘积量化来进一步压缩数据存储优化存储空间和查询速度。优点对于非常大的数据集和需要压缩存储的场景IndexIVFPQ 是一种高效的索引方式。缺点训练和构建索引的过程相对复杂适合大数据集。适用场景大规模高维向量检索如亿级图像特征、文本嵌入向量内存有限但需要平衡速度与精度的场景相比精确索引 IndexFlatL2内存可压缩 10-100 倍。importfaiss# 1. 定义向量维度、参数d128# 向量维度nlist1024# 聚类中心数m16# PQ 子向量数nbits8# 每个子向量的量化位数# 2. 构建量化器用于 IVF 聚类通常用 IndexFlatL2quantizerfaiss.IndexFlatL2(d)# 3. 初始化 IndexIVFPQindexfaiss.IndexIVFPQ(quantizer,d,nlist,m,nbits)# 4. 训练索引用样本向量生成聚类中心和 PQ 码本index.train(train_vectors)# train_vectors 是形状为 (N, d) 的样本向量# 5. 添加向量到索引index.add(database_vectors)# database_vectors 是待索引的向量库# 6. 设置查询参数 nprobe搜索index.nprobe32# 访问 32 个候选分区D,Iindex.search(query_vectors,k10)# 返回每个查询的 top-10 近似近邻距离 D索引 I使用时需重点调优 nlist分区数和 nprobe查询分区数在速度与精度间找到平衡通常 nprobe 越大精度越接近精确搜索但速度越慢。总结由以上的分析可见在选择 Faiss 索引时需要综合考虑以下因素数据集规模: 数据集越大越需要考虑近似索引例如 IndexIVFFlat 或 IndexHNSWFlat。精度要求: 如果对精度要求非常高可以考虑精确索引 (IndexFlatIP, IndexFlatL2)但需要注意速度限制。如果可以接受一定的精度损失则近似索引是更好的选择。速度要求: 对搜索速度要求越高越需要选择更快的近似索引例如 IndexHNSWFlat。内存限制: 内存资源有限时需要考虑内存占用较低的索引方法。比如 PQ 或者 二进制索引。在实际应用中通常需要根据具体的数据集和需求进行实验和调优选择最合适的索引方法和参数配置。建议先从简单的 IndexFlatIP 或 IndexFlatL2 开始如果速度无法满足需求再尝试 IndexIVFFlat 或 IndexHNSWFlat 等近似索引方法。参考:索引类型和层次结构欢迎来到 Faiss 文档Faiss选择合适的索引Indexfaiss 提供了多种索引类型Faiss 索引祝您好运

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询