Ví dụ, lần đầu tiên tôi thử nó đã thất bại - đăng ký 99bet
Trước đây, tôi đã đăng ký 99bet thực hiện một số giới thiệu sơ lược về các khái niệm nền tảng. Trong lĩnh vực công nghệ ứng dụng mô hình lớn, cơ sở dữ liệu vectơ đóng vai trò rất quan trọng và chúng ta đã có một số bài viết định hướng trước đó. Đặc biệt là kỹ thuật lập chỉ mục trong cơ sở dữ liệu vectơ này. Trong số nhiều loại cơ sở dữ liệu vectơ khác nhau, Milvus là một ví dụ tiêu biểu mà chúng ta sẽ thử nghiệm cài đặt lần này. Do đây chỉ là trải nghiệm ban đầu và không nhằm mục đích sử dụng trong môi trường sản xuất, chúng ta sẽ chọn cách đơn giản nhất để triển khai: phương pháp sử dụng Docker trên máy đơn lẻ.
Đầu tiên, bạn cần đảm bảo rằng môi trường Docker đã được cài đặt sẵn và lệnh docker
có thể chạy bình thường. Sau khi kiểm tra xong, bạn có thể tải xuống và khởi động tập kết quả tỷ số lệnh bằng câu lệnh sau:
1wget standalone_embed.sh start
Trong quá trình khởi động, có một số vấn đề cần lưu ý. Điều này cũng khiến tôi cảm thấy hơi khó chịu vì tập lệnh khởi động chính thức từ nhà phát triển không phải lúc nào cũng hoạt động thành công ngay từ lần đầu. Ví dụ, lần đầu tiên tôi thử nó đã thất bại. Sau đó, tôi buộc phải xóa ảnh (image) đã tải xuống và thử lại thì mới hoạt động tốt hơn.
Ngoài ra, ví dụ mã nguồn Python mà nhà phát triển cung cấp cũng gặp một số lỗi. Vì lý do chủ yếu liên quan đến Java, tôi đã quyết định sử dụng SDK Java để thử nghiệm thay thế. Tuy nhiên, trước hết, chúng ta có thể chạy một công cụ giao diện người dùng (UI):
1docker run -p 8000:3000 -e MILVUS_URL={IP máy chủ Milvus}:19530 zilliz/attu:v2.4
Dưới đây là đoạn mã Java đầy đủ Trang Cá Cược mà tôi đã sử dụng để làm việc với Milvus:
1package MilvusDemo;
2
3import com.google.gson.Gson;
4import com.google.gson.JsonObject;
5import com.google.gson.JsonParser;
6import io.milvus.v2.client.ConnectConfig;
7import io.milvus.v2.client.MilvusClientV2;
8import io.milvus.v2.common.DataType;
9import io.milvus.v2.common.IndexParam;
10import io.milvus.v2.service.collection.request.AddFieldReq;
11import io.milvus.v2.service.collection.request.CreateCollectionReq;
12import io.milvus.v2.service.index.request.CreateIndexReq;
13import io.milvus.v2.service.vector.request.InsertReq;
14import java.util.ArrayList;
15import java.util.List;
16
17/**
18 * @author shixuesen
19 * @date 2024/7/21
20 */
21public class Demo {
22 public static void main(String[] args) {
23 ConnectConfig connectConfig = ConnectConfig.builder()
24 .uri("địa chỉ kết nối")
25 .build();
26
27 // Kết nối cấu hình
28 MilvusClientV2 clientV2 = new MilvusClientV2(connectConfig);
29
30 // Định nghĩa Schema cho Collection
31 CreateCollectionReq.CollectionSchema collectionSchema = clientV2.createSchema();
32
33 // Thêm hai trường: id và vector
34 Integer dim = 5;
35 collectionSchema.addField(AddFieldReq.builder().fieldName("my_id").dataType(DataType.Int64).isPrimaryKey(Boolean.TRUE).autoID(Boolean.FALSE).description("id").build());
36 collectionSchema.addField(AddFieldReq.builder().fieldName("my_vector").dataType(DataType.FloatVector).dimension(dim).build());
37
38 CreateCollectionReq req = CreateCollectionReq
39 .builder()
40 .collectionSchema(collectionSchema)
41 .collectionName("quick_setup")
42 .dimension(dim).build();
43
44 // Tạo Collection dựa trên schema, tương tự như tạo bảng trong MySQL
45 clientV2.createCollection(req);
46
47 // Tạo chỉ mục cho các trường
48 IndexParam indexParam = IndexParam.builder()
49 .fieldName("my_id")
50 .build();
51
52 IndexParam vertorIndexParam = IndexParam.builder()
53 .fieldName("my_vector")
54 .indexType(IndexParam.IndexType.AUTOINDEX)
55 .metricType(IndexParam.MetricType.IP)
56 .build();
57
58 List<IndexParam> indexParamList = new ArrayList<>();
59 indexParamList.add(indexParam);
60 indexParamList.add(vertorIndexParam);
61
62 // Tạo chỉ mục
63 clientV2.createIndex(CreateIndexReq.builder()
64 .collectionName("quick_setup")
65 .indexParams(indexParamList)
66 .build());
67
68 JsonObject jsonObject = JsonParser.parseString("{\"my_id\": 0, \"my_vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"}").getAsJsonObject();
69
70 List<JsonObject> jsonData = new ArrayList<>();
71 jsonData.add(jsonObject);
72
73 // Chèn dữ liệu
74 clientV2.insert(InsertReq.builder().collectionName("quick_setup")
75 .data(jsonData).build());
76
77 // Tải Collection trước khi tìm kiếm
78 clientV2.loadCollection(LoadCollectionReq.builder().collectionName("quick_setup").build());
79
80 // Tìm kiếm bằng vectơ
81 SearchResp searchResp = clientV2.search(SearchReq.builder()
82 .collectionName("quick_setup")
83 .data(Collections.singletonList(new FloatVec(new float[]{0.3580376395471989F, -0.6023495712049978F, 0.18414012509913835F, -0.26286205330961354F, 0.9029438446296592F})))
84 .topK(10)
85 .outputFields(Collections.singletonList("*"))
86 .build());
87
88 for (List<SearchResp.SearchResult> searchResult : searchResp.getSearchResults()) {
89 System.out.println(searchResult);
90 }
91 }
92}
Sau khi chạy tìm kiếm với cùng một vectơ, kết quả trả về có điểm số (score
) rất cao, điều này chứng tỏ rằng tìm kiếm đang hoạt động đúng như mong đợi.
Tuy nhiên, trải nghiệm tổng thể của tôi với các ví dụ mã nguồn chính thức từ nhà phát triển không thực sự tốt. Số lượng mẫu mã hạn chế và thiếu sót đáng kể, thật khó tin rằng đây là một trong những cơ sở dữ liệu vectơ phổ biến nhất hiện nay. Có lẽ còn nhiều cải tiến cần thiết để hỗ trợ người dùng tốt hơn trong tương lai.