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]

### Milvus 向量数据库快速入门 #### 安装 Milvus 使用 Docker Compose 为了方便用户安装和部署,官方推荐使用 Docker Compose 来启动单机版的 Milvus。进入 Milvus 官网并按照指引操作可以轻松完成安装过程[^3]。 ```bash git clone https://github.com/milvus-io/milvus.git cd milvus/deployments/docker/standalone/ docker-compose up -d ``` 这段命令会下载必要的镜像文件并通过 Docker Compose 启动 Milvus 服务实例。 #### 创建集合与插入数据 创建一个新的集合用于存储向量数据,并定义相应的字段类型: ```python from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection connections.connect() fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields) collection_name = "example_collection" collection = Collection(name=collection_name, schema=schema) ``` 上述代码展示了如何通过 PyMilvus 库来连接到本地运行中的 Milvus 实例以及怎样建立一个新集合 `example_collection` 并指定其结构化模式[^1]。 #### 执行相似度查询 基于已有的嵌入式表示(embeddings),可以通过如下方式执行 k-nearest neighbors (KNN) 查询找到最接近给定向量的数据点: ```python import random # 插入一些随机生成的测试数据作为示例 data = [[random.random() - 0.5 for _ in range(128)] for _ in range(3)] ids = collection.insert([{"id": i, "embedding": vec} for i, vec in enumerate(data)]) query_vector = data[0] search_params = {"metric_type": "L2", "params": {"nprobe": 10}} results = collection.search( data=[query_vector], anns_field="embedding", param=search_params, limit=2 ) for result in results: print(f"Query Result IDs: {[r.id for r in result]}") ``` 此部分说明了如何利用 Python API 对之前插入的数据集进行简单的 KNN 查找实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值