Memulai dengan cepat dengan Milvus Lite
Vektor, format data keluaran dari model Neural Network, dapat secara efektif mengkodekan informasi dan memiliki peran penting dalam aplikasi AI seperti basis pengetahuan, pencarian semantik, Retrieval Augmented Generation (RAG), dan banyak lagi.
Milvus adalah basis data vektor sumber terbuka yang cocok untuk aplikasi AI dari berbagai ukuran, mulai dari menjalankan chatbot demo di notebook Jupyter hingga membangun pencarian berskala web yang melayani miliaran pengguna. Dalam panduan ini, kami akan memandu Anda tentang cara menyiapkan Milvus secara lokal dalam beberapa menit dan menggunakan pustaka klien Python untuk membuat, menyimpan, dan mencari vektor.
Menginstal Milvus
Dalam panduan ini kami menggunakan Milvus Lite, sebuah pustaka python yang disertakan dalam pymilvus
yang dapat disematkan ke dalam aplikasi klien. Milvus juga mendukung penerapan di Docker dan Kubernetes untuk kasus penggunaan produksi.
Sebelum memulai, pastikan Anda memiliki Python 3.8+ yang tersedia di lingkungan lokal. Instal pymilvus
yang berisi pustaka klien python dan Milvus Lite:
$ pip install -U pymilvus
Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).
Menyiapkan Basis Data Vektor
Untuk membuat database vektor Milvus lokal, cukup instal MilvusClient
dengan menentukan nama file untuk menyimpan semua data, seperti "milvus_demo.db".
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
Membuat Koleksi
Di Milvus, kita membutuhkan sebuah koleksi untuk menyimpan vektor dan metadata terkait. Anda dapat menganggapnya sebagai sebuah tabel dalam database SQL tradisional. Ketika membuat koleksi, Anda dapat mendefinisikan skema dan parameter indeks untuk mengonfigurasi spesifikasi vektor seperti dimensi, jenis indeks, dan metrik jauh. Ada juga konsep yang kompleks untuk mengoptimalkan indeks untuk kinerja pencarian vektor. Untuk saat ini, mari kita fokus pada dasar-dasarnya dan menggunakan default untuk segala sesuatu yang memungkinkan. Minimal, Anda hanya perlu mengatur nama koleksi dan dimensi bidang vektor koleksi.
if client.has_collection(collection_name="demo_collection"):
client.drop_collection(collection_name="demo_collection")
client.create_collection(
collection_name="demo_collection",
dimension=768, # The vectors we will use in this demo has 768 dimensions
)
Dalam pengaturan di atas,
- Kunci utama dan bidang vektor menggunakan nama defaultnya ("id" dan "vektor").
- Jenis metrik (definisi jarak vektor) diatur ke nilai default(COSINE).
- Bidang kunci utama menerima bilangan bulat dan tidak secara otomatis bertambah (yaitu tidak menggunakan fitur auto-id) Sebagai alternatif, Anda dapat mendefinisikan skema koleksi secara formal dengan mengikuti instruksi ini.
Menyiapkan Data
Dalam panduan ini, kita menggunakan vektor untuk melakukan pencarian semantik pada teks. Kita perlu membuat vektor untuk teks dengan mengunduh model penyematan. Hal ini dapat dengan mudah dilakukan dengan menggunakan fungsi-fungsi utilitas dari pustaka pymilvus[model]
.
Merepresentasikan teks dengan vektor
Pertama, instal pustaka model. Paket ini termasuk alat ML yang penting seperti PyTorch. Pengunduhan paket mungkin memerlukan waktu jika lingkungan lokal Anda belum pernah menginstal PyTorch.
$ pip install "pymilvus[model]"
Buatlah penyematan vektor dengan model default. Milvus mengharapkan data yang akan disisipkan disusun sebagai sebuah daftar kamus, di mana setiap kamus merepresentasikan sebuah catatan data, yang disebut sebagai sebuah entitas.
from pymilvus import model
# If connection to https://huggingface.co/ failed, uncomment the following path
# import os
# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# This will download a small embedding model "paraphrase-albert-small-v2" (~50MB).
embedding_fn = model.DefaultEmbeddingFunction()
# Text strings to search from.
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
vectors = embedding_fn.encode_documents(docs)
# The output vector has 768 dimensions, matching the collection that we just created.
print("Dim:", embedding_fn.dim, vectors[0].shape) # Dim: 768 (768,)
# Each entity has id, vector representation, raw text, and a subject label that we use
# to demo metadata filtering later.
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))
Dim: 768 (768,)
Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])
Vector dim: 768
[Alternatif] Gunakan representasi palsu dengan vektor acak
Jika Anda tidak dapat mengunduh model karena masalah jaringan, sebagai solusi sementara, Anda dapat menggunakan vektor acak untuk merepresentasikan teks dan tetap menyelesaikan contoh. Harap diperhatikan bahwa hasil pencarian tidak akan mencerminkan kemiripan semantik karena vektor-vektor tersebut adalah vektor palsu.
import random
# Text strings to search from.
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
# Use fake representation with random vectors (768 dimension).
vectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))
Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])
Vector dim: 768
Memasukkan Data
Mari masukkan data ke dalam koleksi:
res = client.insert(collection_name="demo_collection", data=data)
print(res)
{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}
Pencarian Semantik
Sekarang kita dapat melakukan pencarian semantik dengan merepresentasikan teks kueri penelusuran sebagai vektor, dan melakukan pencarian kemiripan vektor di Milvus.
Pencarian vektor
Milvus menerima satu atau beberapa permintaan pencarian vektor secara bersamaan. Nilai dari variabel query_vectors adalah sebuah daftar vektor, di mana setiap vektor adalah sebuah array angka float.
query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])
# If you don't have the embedding function you can use a fake vector to finish the demo:
# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]
res = client.search(
collection_name="demo_collection", # target collection
data=query_vectors, # query vectors
limit=2, # number of returned entities
output_fields=["text", "subject"], # specifies fields to be returned
)
print(res)
data: ["[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
Keluarannya adalah daftar hasil, masing-masing dipetakan ke permintaan pencarian vektor. Setiap kueri berisi daftar hasil, di mana setiap hasil berisi kunci utama entitas, jarak ke vektor kueri, dan detail entitas dengan output_fields
yang ditentukan.
Pencarian Vektor dengan Pemfilteran Metadata
Anda juga dapat melakukan pencarian vektor dengan mempertimbangkan nilai metadata (disebut bidang "skalar" di Milvus, karena skalar mengacu pada data non-vektor). Hal ini dilakukan dengan ekspresi filter yang menentukan kriteria tertentu. Mari kita lihat cara mencari dan memfilter dengan bidang subject
pada contoh berikut.
# Insert more docs in another subject.
docs = [
"Machine learning has been used for drug design.",
"Computational synthesis with AI algorithms predicts molecular properties.",
"DDR1 is involved in cancers and fibrosis.",
]
vectors = embedding_fn.encode_documents(docs)
data = [
{"id": 3 + i, "vector": vectors[i], "text": docs[i], "subject": "biology"}
for i in range(len(vectors))
]
client.insert(collection_name="demo_collection", data=data)
# This will exclude any text in "history" subject despite close to the query vector.
res = client.search(
collection_name="demo_collection",
data=embedding_fn.encode_queries(["tell me AI related information"]),
filter="subject == 'biology'",
limit=2,
output_fields=["text", "subject"],
)
print(res)
data: ["[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]"] , extra_info: {'cost': 0}
Secara default, bidang skalar tidak diindeks. Jika Anda perlu melakukan pencarian yang difilter metadata dalam kumpulan data yang besar, Anda dapat mempertimbangkan untuk menggunakan skema tetap dan juga mengaktifkan indeks untuk meningkatkan kinerja pencarian.
Selain pencarian vektor, Anda juga dapat melakukan jenis pencarian lainnya:
Kueri
Query () adalah operasi yang mengambil semua entitas yang cocok dengan kriteria, seperti ekspresi filter atau pencocokan beberapa id.
Misalnya, mengambil semua entitas yang bidang skalarnya memiliki nilai tertentu:
res = client.query(
collection_name="demo_collection",
filter="subject == 'history'",
output_fields=["text", "subject"],
)
Mengambil entitas secara langsung berdasarkan kunci utama:
res = client.query(
collection_name="demo_collection",
ids=[0, 2],
output_fields=["vector", "text", "subject"],
)
Menghapus Entitas
Jika Anda ingin menghapus data, Anda dapat menghapus entitas dengan menentukan kunci utama atau menghapus semua entitas yang cocok dengan ekspresi filter tertentu.
# Delete entities by primary key
res = client.delete(collection_name="demo_collection", ids=[0, 2])
print(res)
# Delete entities by a filter expression
res = client.delete(
collection_name="demo_collection",
filter="subject == 'biology'",
)
print(res)
[0, 2]
[3, 4, 5]
Memuat Data yang Sudah Ada
Karena semua data Milvus Lite disimpan dalam file lokal, Anda dapat memuat semua data ke dalam memori bahkan setelah program dihentikan, dengan membuat MilvusClient
dengan file yang ada. Sebagai contoh, ini akan memulihkan koleksi dari file "milvus_demo.db" dan terus menulis data ke dalamnya.
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
Menghapus koleksi
Jika Anda ingin menghapus semua data dalam sebuah koleksi, Anda dapat menghapus koleksi tersebut dengan perintah
# Drop collection
client.drop_collection(collection_name="demo_collection")
Pelajari Lebih Lanjut
Milvus Lite sangat bagus untuk memulai dengan program python lokal. Jika Anda memiliki data berskala besar atau ingin menggunakan Milvus dalam produksi, Anda dapat mempelajari tentang men-deploy Milvus di Docker dan Kubernetes. Semua mode deployment Milvus memiliki API yang sama, sehingga kode sisi klien Anda tidak perlu banyak berubah jika berpindah ke mode deployment lain. Cukup tentukan URI dan Token server Milvus yang digunakan di mana saja:
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
Milvus menyediakan API REST dan gRPC, dengan pustaka klien dalam bahasa seperti Python, Java, Go, C#, dan Node.js.