Milvus:向量数据库入门

目录

一、Milvus是什么?

二、主要概念

(1)非结构化数据

(2)嵌入向量

(3)向量相似性搜索

三、为什么选择Milvus?

四、支持哪些索引和度量标准?

五、应用程序示例

 六、python读写代码


一、Milvus是什么?

        Milvus于2019年创建,目标是存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量。


        作为一个专门设计用于处理输入向量查询的数据库,它能够索引万亿级别的向量。与主要处理遵循预定义模式的结构化数据的现有关系数据库不同,Milvus从底层设计用于处理从非结构化数据转换而来的嵌入向量。


        随着互联网的发展和演变,非结构化数据变得越来越普遍,包括电子邮件、论文、物联网传感器数据、Facebook照片、蛋白质结构等。为了让计算机理解和处理非结构化数据,这些数据被转换成向量。Milvus存储和索引这些向量。Milvus能够通过计算两个向量之间的相似度距离来分析它们之间的相关性。如果两个嵌入向量非常相似,这意味着原始数据源也很相似。

 

二、主要概念

(1)非结构化数据


        非结构化数据,包括图像、视频、音频和自然语言,是不遵循预定义模型或组织方式的信息。这种数据类型占全球数据的约80%,可以使用各种人工智能(AI)和机器学习(ML)模型转换成向量。


(2)嵌入向量


        嵌入向量是非结构化数据的特征抽象,如电子邮件、物联网传感器数据、Instagram照片、蛋白质结构等。从数学上讲,嵌入向量是一个浮点数或二进制数的数组。现代嵌入技术用于将非结构化数据转换成嵌入向量。


(3)向量相似性搜索


        向量相似性搜索是将一个向量与数据库进行比较,以找到与查询向量最相似的向量的过程。使用近似最近邻(ANN)搜索算法来加速搜索过程。如果两个嵌入向量非常相似,这意味着原始数据源也很相似。

三、为什么选择Milvus?

  • 在处理大规模数据集的向量搜索时表现出高性能。
  • 一个以开发者为先的社区,提供多语言支持和工具链。
  • 即使在中断事件中也具有云可扩展性和高可靠性。
  • 通过将标量过滤与向量相似性搜索相结合,实现混合搜索。

四、支持哪些索引和度量标准?

        索引是数据的组织单位。在进行搜索或查询插入的实体之前,您必须声明索引类型和相似性度量。如果您不指定索引类型,Milvus将默认进行暴力搜索。

索引类型

Milvus支持的大多数向量索引类型使用近似最近邻搜索(ANNS),包括:

  • FLAT:FLAT最适合在小型、百万级数据集上寻求完全准确和精确搜索结果的场景。
  • IVF_FLAT:IVF_FLAT是基于量化的索引,最适合寻求在准确性和查询速度之间取得理想平衡的场景。还有一个GPU版本GPU_IVF_FLAT。
  • IVF_SQ8:IVF_SQ8是基于量化的索引,最适合寻求显著减少磁盘、CPU和GPU内存消耗的场景,因为这些资源非常有限。
  • IVF_PQ:IVF_PQ是基于量化的索引,最适合寻求高查询速度,即使以牺牲准确性为代价的场景。还有一个GPU版本GPU_IVF_PQ。
  • HNSW:HNSW是基于图的索引,最适合对搜索效率有高要求的场景。

相似性度量

在Milvus中,相似性度量用于测量向量之间的相似性。选择一个好的距离度量可以显著提高分类和聚类性能。根据输入数据形式,选择特定的相似性度量以获得最佳性能。
广泛用于浮点嵌入的度量包括:

  • 欧几里得距离(L2):该度量通常用于计算机视觉(CV)领域。
  • 内积(IP):该度量通常用于自然语言处理(NLP)领域。

广泛用于二进制嵌入的度量包括:

  • 汉明距离(Hamming): 这个度量标准通常用于自然语言处理(NLP)领域。
  • 杰卡德距离(Jaccard):这个度量标准通常用于分子最近邻搜索领域。

五、应用程序示例

Milvus 可以很容易地为应用程序添加最近邻搜索,例如:

  • 图像相似搜索: 图像可以被搜索,并且可以从大量的数据库中即时返回最相似的图像。
  • 视频相似搜索: 通过将关键帧转换为矢量,然后将结果输入 Milvus,数十亿的视频可以在近乎实时的情况下被搜索和推荐。
  • 音频相似搜索: 快速查询大量的音频数据,如语音、音乐、音效和表面类似的声音。
  • 推荐系统: 根据用户行为和需求推荐信息或产品。
  • 问答系统: 交互式数字 QA 聊天机器人,自动回答用户的问题。
  • DNA 序列分类: 通过比较相似的 DNA 序列,以毫秒为单位精确地对基因进行分类。
  • 文本搜索引擎: 通过将关键字与文本数据库进行比较,帮助用户找到他们正在查找的信息。

 六、python读写代码

from milvus import Milvus, MetricType
 
milvus = Milvus(host='milvus机器ip', port='19530')
 
params = {'collection_name':'test01',
          'dimension':512,
          'index_file_size':1024,
          'metric_type':MetricType.IP}
 
status = milvus.create_collection(params)
print(status)
 
vectors = [[1.0*i for _ in range(512)] for i in range(20)]
print(vectors[0][0],vectors[-1][0])
 
status, ids = milvus.insert(collection_name='test01', records=vectors)
print(status,ids)
 
milvus.flush(['test01'])
milvus.close()
Status(code=0, message='Create collection successfully!')
0.0 9.0
Status(code=0, message='Add vectors successfully!') [168846, ..., 1688460]

猜你喜欢

转载自blog.csdn.net/lbr15660656263/article/details/140299744