向量数据库 Milvus 安装初体验

之前做了个简单的铺垫,作为大模型应用技术领域非常重要的一环,向量数据库我们在前面有做一些引导性的介绍,其中的索引技术,
而在众多向量数据库比较有代表性的 Milvus,这边我们来尝试安装 Milvus 初体验一下
因为只是初体验,不作为生产环境使用,所以就用最简单的方式,Docker单机部署的方式
首先需要需要有Docker环境
确认下 docker 命令可执行
然后拉取启动脚本

1
2
wget https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh
bash standalone_embed.sh start

启动过程中需要注意一些问题,这也是有点想吐槽的,这个官方的启动脚本竟然都不是稳定成功的,最开始就是失败的,后面重新删除拉下来的镜像再启动就好了
并且官方提供的demo python版本的示例也是有问题的
因为主要是java的缘故,就用了java的sdk来尝试
只是我们可以先运行一个ui工具

1
docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:v2.4


这里就能看到运行情况
然后我们运行个简单的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package MilvusDemo;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.service.index.request.CreateIndexReq;
import io.milvus.v2.service.vector.request.InsertReq;

import java.util.ArrayList;
import java.util.List;

/**
* @author shixuesen
* @date 2024/7/21
*/
public class Demo {

public static void main(String[] args) {
ConnectConfig connectConfig = ConnectConfig.builder()
.uri("http://127.0.0.1:19530")
.build();
// 连接配置
MilvusClientV2 clientV2 = new MilvusClientV2(connectConfig);
// define a Collection Schema
CreateCollectionReq.CollectionSchema collectionSchema = clientV2.createSchema();
// add two fileds, id and vector
Integer dim = 5;
// 这里的 CollectionSchema 就类似于mysql的数据库表结构
collectionSchema.addField(AddFieldReq.builder().fieldName("my_id").dataType(DataType.Int64).isPrimaryKey(Boolean.TRUE).autoID(Boolean.FALSE).description("id").build());
collectionSchema.addField(AddFieldReq.builder().fieldName("my_vector").dataType(DataType.FloatVector).dimension(dim).build());

CreateCollectionReq req = CreateCollectionReq
.builder()
.collectionSchema(collectionSchema)
.collectionName("quick_setup")
.dimension(dim).build();
// 通过schema 生成 Collection,就类似于mysql中的表
clientV2.createCollection(req);

// 然后可以对字段创建索引
IndexParam indexParam = IndexParam.builder()
.fieldName("my_id")
.build();
IndexParam vertorIndexParam = IndexParam.builder()
.fieldName("my_vector")
.indexType(IndexParam.IndexType.AUTOINDEX)
.metricType(IndexParam.MetricType.IP)
.build();
List<IndexParam> indexParamList = new ArrayList<>();
indexParamList.add(indexParam);
indexParamList.add(vertorIndexParam);


// 接着创建索引
clientV2.createIndex(CreateIndexReq.builder()
.collectionName("quick_setup")
.indexParams(indexParamList)
.build());
JsonObject jsonObject = JsonParser.parseString("{\"my_id\": 0, \"my_vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"}").getAsJsonObject();
List<JsonObject> jsonData = new ArrayList<>();
jsonData.add(jsonObject);
// 然后插入数据
clientV2.insert(InsertReq.builder().collectionName("quick_setup")
.data(jsonData).build());

// 插入之后我们想进行查询,就用向量进行搜索,不过要先加载Collection
clientV2.loadCollection(LoadCollectionReq.builder().collectionName("quick_setup").build());
SearchResp searchResp = clientV2.search(SearchReq.builder()
.collectionName("quick_setup")
.data(Collections.singletonList(new FloatVec(new float[]{0.3580376395471989F, -0.6023495712049978F, 0.18414012509913835F, -0.26286205330961354F, 0.9029438446296592F})))
.topK(10)
.outputFields(Collections.singletonList("*"))
.build()
);
for (List<SearchResp.SearchResult> searchResult : searchResp.getSearchResults()) {
System.out.println(searchResult);
}


}
}

我们用同样的向量进行搜索

1
[SearchResp.SearchResult(entity={my_id=0, $meta={"color":"pink_8682"}, my_vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385]}, score=1.4093276, id=0)]

得出的score就是很高的,只是做了下尝试,官方的示例代码是少得可怜,也不全,很难想象是目前比较热门的向量数据库