Cài đặt môi trường Python và thư viện PyMilvus
Khởi tạo môi trường ảo và cài đặt SDK
Chúng ta cần một môi trường Python sạch để tránh xung đột thư viện với các dịch vụ khác trên server. Bước này sử dụng venv để cô lập môi trường phát triển.
Tại sao: Việc sử dụng môi trường ảo giúp quản lý phiên bản thư viện pymilvus độc lập, đảm bảo tính tương thích với Milvus server đang chạy và dễ dàng rollback nếu cần.
Kết quả mong đợi: Một thư mục venv được tạo và lệnh python bên trong trỏ vào môi trường ảo.
mkdir -p ~/milvus-client && cd ~/milvus-client
python3 -m venv venv
source venv/bin/activate
Kiểm tra: Chạy which python phải trả về đường dẫn .../milvus-client/venv/bin/python.
Bây giờ ta cài đặt thư viện pymilvus chính thức. Phiên bản SDK phải tương thích với phiên bản Milvus server (thường là bản stable nhất).
Tại sao: pymilvus là giao diện lập trình chuẩn để giao tiếp với Milvus, hỗ trợ đầy đủ các thao tác CRUD và tìm kiếm vector.
Kết quả mong đợi: Thư viện được cài đặt thành công và hiển thị phiên bản khi kiểm tra.
pip install pymilvus
pip install -U pymilvus
python -c "import milvus; print(milvus.__version__)"
Kiểm tra: Nếu thấy in ra phiên bản (ví dụ: 2.4.x) mà không có lỗi ImportError là thành công.
Thiết lập kết nối với Milvus Server
Cấu hình đối tượng Connection
Tạo file Python đầu tiên để thiết lập kết nối. Ta sẽ sử dụng hàm connect của connections module.
Tại sao: Trước khi thao tác bất kỳ Collection nào, client phải thiết lập kênh giao tiếp (gRPC) với Milvus server. Mặc định Milvus chạy ở cổng 19530.
Kết quả mong đợi: Kết nối được thiết lập, không báo lỗi timeout hoặc connection refused.
cat > connect_milvus.py
Chạy lệnh để test kết nối:
python connect_milvus.py
Kiểm tra: Đầu ra phải hiển thị "Kết nối thành công..." và "Alias 'default' đã được đăng ký...". Nếu thấy lỗi, kiểm tra lại Docker container Milvus đang chạy.
Tạo Collection và định nghĩa Schema
Xây dựng cấu trúc dữ liệu (Schema)
Chúng ta sẽ tạo một Collection mẫu để lưu trữ vector hình ảnh hoặc văn bản. Schema bao gồm 2 trường: ID (số nguyên) và Vector (dãy số float).
Tại sao: Milvus yêu cầu định nghĩa rõ ràng về loại dữ liệu (Field) và chỉ mục (Index) trước khi có thể lưu trữ. Vector dimension (số chiều) là tham số quan trọng nhất.
Kết quả mong đợi: Collection được tạo ra, sẵn sàng nhận dữ liệu.
cat > create_collection.py
Chạy lệnh để tạo Collection:
python create_collection.py
Kiểm tra: Đầu ra hiển thị "Tạo collection ... thành công" và số lượng phần tử là 0. Bạn có thể mở web UI của Milvus (nếu có) để xem collection này xuất hiện.
Chèn dữ liệu Vector mẫu vào Collection
Thực hiện thao tác Insert
Bây giờ ta sẽ sinh ra 10 vector ngẫu nhiên (mỗi vector 128 chiều float) và chèn vào collection vừa tạo.
Tại sao: Thao tác insert là bước chuyển dữ liệu từ bộ nhớ client vào bộ nhớ Milvus. Dữ liệu vector phải là danh sách (list) các số float có độ dài đúng với dim đã khai báo.
Kết quả mong đợi: 10 vector được chèn thành công, trả về ID của các bản ghi.
cat > insert_data.py
Chạy lệnh để chèn dữ liệu:
python insert_data.py
Kiểm tra: Đầu ra hiển thị "Chèn thành công 10 vector" và liệt kê 10 ID số nguyên. Số lượng thực tế phải là 10.
Thực hiện truy vấn tìm kiếm gần nhất (Search)
Thực hiện Vector Search và Query
Chúng ta sẽ lấy vector đầu tiên vừa chèn vào làm "vector truy vấn" (query vector) để tìm các vector tương tự nhất trong collection.
Tại sao: Đây là chức năng cốt lõi của Milvus. Tìm kiếm dựa trên độ tương tự (similarity) hoặc khoảng cách (distance). Kết quả trả về là các ID và điểm số (score).
Kết quả mong đợi: Trả về danh sách các vector gần nhất, trong đó vector gốc phải có điểm số cao nhất (hoặc khoảng cách nhỏ nhất).
cat > search_data.py
Chạy lệnh để thực hiện tìm kiếm:
python search_data.py
Kiểm tra: Đầu ra phải hiển thị "Index đã tạo...", sau đó là danh sách 5 kết quả tìm kiếm với ID và Score. Score càng nhỏ (với metric L2) nghĩa là càng giống nhau.
Verify kết quả cuối cùng
Chạy kịch bản tổng hợp
Để đảm bảo toàn bộ quy trình hoạt động trơn tru, ta gộp tất cả vào một file duy nhất và chạy liên tiếp.
Tại sao: Giúp xác minh luồng dữ liệu từ Connect -> Create -> Insert -> Index -> Search không bị gián đoạn do trạng thái cache hoặc session.
Kết quả mong đợi: Chạy xong không lỗi, hiển thị kết quả search có ý nghĩa.
cat > full_demo.py
Chạy lệnh cuối cùng để xác nhận:
python full_demo.py
Kiểm tra: Toàn bộ 6 bước được thực thi liên tiếp, kết thúc bằng dòng "=== HOÀN THÀNH ===" và hiển thị 3 kết quả search.
Điều hướng series:
Mục lục: Series: Triển khai Database Vector với Milvus và Ubuntu 24.04
« Phần 4: Cấu hình lưu trữ bền vững với MinIO và Etcd
Phần 6: Tối ưu hóa hiệu năng và phân tích logs trên Ubuntu 24.04 »