nmslib 是一个 超快、适用于高维向量的最近邻搜索库,基于 HNSW 算法,被广泛用于 语义搜索、推荐系统、人脸识别等任务

nmslib 是什么?

nmslib(Non-Metric Space Library)是一个 高效的最近邻搜索(ANN, Approximate Nearest Neighbor Search) 库,专门用于 高维向量搜索,适用于 文本、图像、语音等嵌入向量 的相似性搜索。

它的核心功能是:

  • 提供 快速、高效的最近邻搜索(ANN),即找到 与某个向量最相似的 k 个向量
  • 主要基于 HNSW(Hierarchical Navigable Small World) 算法,能在 数百万数据点级别 仍保持高效的搜索速度。
  • 适用于 高维度数据(如 512 维、1024 维嵌入向量),比 KD-Tree、Ball-Tree 等传统方法更适合高维数据。

nmslib 的主要特点

  1. 极快的近似最近邻搜索

    • nmslib 通过 HNSW 索引结构,使搜索速度比 暴力搜索快数百倍,而准确率仍然很高。
    • 适用于大规模数据集(数百万数据点)。
  2. 支持多种度量空间(Metric Spaces)

    • 默认使用 余弦相似度(cosine similarity),但也支持 欧几里得距离(L2)、内积(dot product) 等不同距离度量方式。
  3. 支持磁盘索引(离线存储)

    • 可以将索引保存到磁盘,下次直接加载,不用重新计算,提高效率。
  4. Python & C++ 实现,性能优越

    • 采用 C++ 实现核心部分,性能比纯 Python 库(如 faiss)还要快。

nmslib 的应用场景

nmslib 广泛应用于:

  • 语义搜索(Semantic Search):基于文本嵌入找到最相关的文档或句子。
  • 推荐系统:找到用户最感兴趣的相似商品或内容。
  • 人脸识别:从数据库中快速找到最相似的人脸。
  • 图像搜索:在大型图片库中查找相似图片。
  • 语音识别:查找音频中相似的片段。

nmslib 的基本用法

1. 安装 nmslib
pip install nmslib
2. 创建 HNSW 索引
import nmslib
import numpy as np# 生成 10000 个随机向量,每个向量 128 维
data = np.random.random((10000, 128)).astype(np.float32)# 初始化索引,使用 HNSW 方法和余弦相似度
index = nmslib.init(method='hnsw', space='cosinesimil')# 添加数据到索引
index.addDataPointBatch(data)# 构建索引,提高搜索速度
index.createIndex({'post': 2}, print_progress=True)
3. 进行最近邻搜索
# 查询一个随机向量
query_vector = np.random.random((1, 128)).astype(np.float32)# 搜索最相似的 5 个向量
ids, distances = index.knnQuery(query_vector, k=5)print("Top 5 最近邻 ID:", ids)
print("对应的距离:", distances)
4. 保存和加载索引
# 保存索引到文件
index.saveIndex('my_index.nms')# 加载索引
index2 = nmslib.init(method='hnsw', space='cosinesimil')
index2.loadIndex('my_index.nms')

nmslib vs. 其他 ANN 搜索库

库名称优势劣势
nmslib速度快、支持多种距离度量、适用于高维数据不如 Faiss 适用于 GPU
FaissFacebook 出品,支持 GPU,高效仅支持 L2、内积,空间选择少
Annoy适合离线搜索,索引体积小索引构建较慢,查询速度比 nmslib 慢
ScaNNGoogle 出品,适用于 TensorFlow兼容性一般,不如 Faiss 通用

总结

nmslib 是一个 超快、适用于高维向量的最近邻搜索库,基于 HNSW 算法,被广泛用于 语义搜索、推荐系统、人脸识别等任务
✅ 适用于 百万级别数据,在 准确率和搜索速度之间取得了很好的平衡
✅ 对比 Faiss、Annoy 等 ANN 搜索库,nmslibCPU 环境下搜索速度最快,但不如 Faiss 适用于 GPU。

🚀 如果你在做文本、图片、音频等向量化搜索,nmslib 绝对是一个值得尝试的库!


nmslib 不是一个数据库

nmslib 不是一个数据库,而是一个 高效的近似最近邻(ANN)搜索库,用于高维向量搜索。

不过,它可以用于数据库中的向量索引,类似于 FAISS、Annoy 等工具,帮助数据库进行 高效的相似搜索。但 nmslib 本身不具备数据库的 CRUD(增删改查)、事务管理等功能


nmslib vs. 数据库

特性nmslib数据库(如 MySQL、PostgreSQL)
主要功能高维向量搜索(ANN)结构化数据存储、查询、事务管理
是否存储数据仅存储索引,不存储原始数据存储完整数据(表、行、列等)
是否支持 SQL❌ 不支持 SQL✅ 支持 SQL 查询
数据管理能力仅限于向量索引事务、权限、关系型查询
索引类型HNSW(层次小世界图)B-Tree、Hash、GIN 等
使用方式适用于 AI、搜索推荐适用于通用数据管理

如何在数据库中使用 nmslib?

如果你有一个数据库(如 PostgreSQL),但想用 nmslib 进行向量搜索,可以这样做:

  1. 数据库存储数据(文本、图片等)
  2. 使用嵌入模型(如 OpenAI Embeddings、Word2Vec)生成向量
  3. 用 nmslib 建立索引,加速相似搜索
  4. 数据库 + nmslib 联合查询,用 nmslib 搜索相似向量,再从数据库取出完整数据。

例如,在 PostgreSQL + nmslib 组合中:

import psycopg2
import nmslib
import numpy as np# 连接数据库
conn = psycopg2.connect("dbname=mydb user=myuser password=mypass host=localhost")
cur = conn.cursor()# 从数据库加载向量数据
cur.execute("SELECT id, embedding FROM my_table")
rows = cur.fetchall()# 转换为 NumPy 数组
ids, embeddings = zip(*rows)
embeddings = np.array([np.frombuffer(e, dtype=np.float32) for e in embeddings])# 创建 nmslib 索引
index = nmslib.init(method='hnsw', space='cosinesimil')
index.addDataPointBatch(embeddings, ids)
index.createIndex({'post': 2}, print_progress=True)# 查询相似向量
query_vector = np.random.random((1, 128)).astype(np.float32)
nearest_ids, distances = index.knnQuery(query_vector, k=5)# 在数据库中获取完整数据
cur.execute("SELECT * FROM my_table WHERE id IN %s", (tuple(nearest_ids),))
results = cur.fetchall()
print(results)

这种方法让 nmslib 负责搜索,数据库负责存储,实现高效的 AI 语义搜索。


总结

nmslib 不是数据库,它是一个 高效的 ANN(近似最近邻)搜索库
✅ 但它可以 与数据库结合使用,为数据库中的向量数据提供 快速的相似搜索能力(如 文本、图片、语音检索)。
🚀 如果你需要存储数据并进行管理,仍然需要一个数据库(如 PostgreSQL、MySQL、MongoDB),然后结合 nmslib 进行搜索优化!

nmslib 本身对嵌入模型并没有强制的限制

nmslib 本身对嵌入模型并没有强制的限制,也就是说你可以使用任何生成固定维度数值向量的嵌入模型。不过,在使用时需要注意以下几点:

  1. 固定维度
    嵌入模型的输出必须是固定维度的向量,因为 nmslib 索引需要知道每个向量的长度。如果你的模型输出动态长度的向量,则需要先进行处理或填充,使之变为固定长度。

  2. 数据格式
    nmslib 要求嵌入向量是数值型数据,通常为 NumPy 数组或可转换为 NumPy 数组的格式。如果嵌入结果不是这种格式,需要转换为相应的数值型数组。

  3. 归一化
    如果你使用的距离度量是余弦相似度(如 “cosinesimil”),那么通常需要对向量进行归一化。虽然 nmslib 本身不强制归一化,但为了获得更准确的相似度计算,通常建议在索引前对向量进行处理。

  4. 维度和性能
    嵌入向量的维度越高,索引的构建和查询可能会消耗更多的计算资源和内存。这并不是 nmslib 限制嵌入模型的问题,而是高维数据处理的常见挑战。所以在选择嵌入模型时,也需要权衡维度、性能和精度之间的关系。

总结来说,nmslib 不限制你使用哪种嵌入模型,但要求输出的嵌入向量满足固定维度和数值型数据的要求,此外还要考虑向量预处理(如归一化)和高维数据带来的性能问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/74191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端流式输出实现详解:从原理到实践

前端流式输出实现详解:从原理到实践 前言一、流式输出核心原理1.1 什么是流式输出?1.2 技术优势对比1.3 关键技术支撑 二、原生JavaScript实现方案2.1 使用Fetch API流式处理关键点解析: 2.2 处理SSE(Server-Sent Events&#xff…

【STM32】最后一刷-江科大Flash闪存-学习笔记

FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…

梯度(Gradient)与步长(Step Size)

梯度(Gradient)与步长(Step Size) 梯度与步长是优化算法(如梯度下降法)的核心概念。以下是它们的详细解释: 梯度(Gradient) ​定义 梯度是一个向量,表示多元…

freecad二开 xmlrpc接口api qtgui

FreeCAD.ConfigGet("UserAppData") 文件夹下创建mod文件夹 mod文件夹底下创建插件文件夹my_server: freecad_server.py: from xmlrpc.server import SimpleXMLRPCServer import FreeCADGui import FreeCADimport queue from PySide2.QtCore import QTi…

鸿蒙NEXT开发日志工具类(ArkTs)

import hilog from ohos.hilog; import { JSON } from kit.ArkTS; import { BusinessError } from kit.BasicServicesKit; import { StrUtil } from ./StrUtil;/*** 日志工具类* author: 鸿蒙布道师* since: 2024/03/31*/ export class LogUtil {private static logSize: numbe…

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、环境信息 环境信息如下: 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…

基于LSTM的文本分类1——模型搭建

源码 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as npclass Config(object):"""配置参数类,用于存储模型和训练的超参数"""def __init__(self, dataset, embedding):self.…

小了 60,500 倍,但更强;AI 的“深度诅咒”

作者:Ignacio de Gregorio 图片来自 Unsplash 的 Bahnijit Barman 几周前,我们看到 Anthropic 尝试训练 Claude 去通关宝可梦。模型是有点进展,但离真正通关还差得远。 但现在,一个独立的小团队用一个只有一千万参数的模型通关了…

nextjs使用02

并行路由 同一个页面,放多个路由,, 目录前面加,layout中可以当作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…

github 无法在shell里链接

当我在shell端git push时,我发现总是22 timeout的问题。 我就进行了以下步骤的尝试并最终得到了解决。 第一步,我先确定我可以curl github,也就是我网络没问题 curl -v https://github.com 如果这个时候不超时和报错,说明网络…

当前主流的大模型知识库软件对比分析

以下是当前主流的大模型知识库软件对比分析,涵盖功能特性、适用场景及优劣势,结合最新技术动态和行业实践提供深度选型参考: 一、企业级智能知识库平台 1. 阿里云百炼(Model Studio) 核心能力:基于RAG技…

Java的比较器 Comparable 和 Comparator

在 Java 中,Comparable 和 Comparator 是用于对象排序的重要接口。它们提供了不同的排序方式,适用于不同的需求,同时在 Java 底层排序算法中发挥着关键作用。本文将从基础概念、使用方法、排序实现(包括升序、降序)、底…

基于Qlearning强化学习的太赫兹信道信号检测与识别matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 太赫兹信道特性 2.2 Q-learning强化学习基础 2.3 基于Q-learning 的太赫兹信道信号检测与识别系统 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2024b仿真结果如下(完整代码运行后无水印…

力扣刷题————199.二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入:root [1,2,3,null,5,null,4] 输出:[1,3,4] 解题思路:我们可以想到这…

文件包含漏洞的小点总结

文件本地与远程包含: 文件包含有本地包含与远程包含的区别:本地包含只能包含服务器已经有的问题; 远程包含可以包含一切网络上的文件。 本地包含: ①无限制 感受一下使用phpstudy的文件上传,开启phpstudy的apache…

深度学习处理时间序列(5)

Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过,二者有一点小区别:SimpleRNN层能够像其他Keras层一样处理序列批量,而不是像NumPy示例中的那样只能处理单个序列。也就是说,它接收形状为(batch_si…

操作系统相关知识点

操作系统在进行线程切换时需要进行哪些动作? 保存当前线程的上下文 保存寄存器状态、保存栈信息。 调度器选择下一个线程 调度算法决策:根据策略(如轮转、优先级、公平共享)从就绪队列选择目标线程。 处理优先级:实时…

从0到1:Rust 如何用 FFmpeg 和 OpenGL 打造硬核视频特效

引言:视频特效开发的痛点,你中了几个? 视频特效如今无处不在:短视频平台的滤镜美化、直播间的实时美颜、影视后期的电影级调色,甚至 AI 生成内容的动态效果。无论是个人开发者还是团队,视频特效都成了吸引…

【并发编程 | 第一篇】线程相关基础知识

1.并发和并行有什么区别 并发是指多核CPU上的多任务处理,多个任务在同一时刻真正同时执行。 并行是指单核CPU上的多任务处理,多个任务在同一时间段内交替执行,通过时间片轮转实现交替执行,用于解决IO密集型瓶颈。 如何理解线程安…

Kafka 偏移量

在 Apache Kafka 中,偏移量(Offset)是一个非常重要的概念。它不仅用于标识消息的位置,还在多种场景中发挥关键作用。本文将详细介绍 Kafka 偏移量的核心概念及其使用场景。 一、偏移量的核心概念 1. 定义 偏移量是一个非负整数…