🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
Beranda
  • Panduan Pengguna
  • Home
  • Docs
  • Panduan Pengguna

  • Bidang Skema & Data

  • Hands-On

Desain Skema Secara Langsung

Sistem Information Retrieval (IR), yang juga dikenal sebagai pencarian, sangat penting untuk berbagai aplikasi AI seperti Retrieval-augmented generation (RAG), pencarian gambar, dan rekomendasi produk. Langkah pertama dalam mengembangkan sistem IR adalah mendesain model data, yang melibatkan analisis kebutuhan bisnis, menentukan cara mengatur informasi, dan mengindeks data agar dapat dicari secara semantik.

Milvus mendukung pendefinisian model data melalui skema koleksi. Koleksi mengatur data yang tidak terstruktur seperti teks dan gambar, bersama dengan representasi vektornya, termasuk vektor padat dan vektor jarang dalam berbagai presisi yang digunakan untuk pencarian semantik. Selain itu, Milvus mendukung penyimpanan dan penyaringan tipe data non-vektor yang disebut "Skalar". Tipe-tipe skalar termasuk BOOL, INT8/16/32/64, FLOAT/DOUBLE, VARCHAR, JSON, dan Array.

Example data schema designed for searching news article Contoh skema data yang dirancang untuk mencari artikel berita

Desain model data dari sistem pencarian melibatkan analisis kebutuhan bisnis dan abstraksi informasi ke dalam model data yang diekspresikan dengan skema. Misalnya, untuk mencari sebuah teks, teks tersebut harus "diindeks" dengan mengubah string literal menjadi vektor melalui "penyematan", sehingga memungkinkan pencarian vektor. Di luar persyaratan dasar ini, mungkin perlu untuk menyimpan properti lain seperti stempel waktu publikasi dan penulis. Metadata ini memungkinkan pencarian semantik disempurnakan melalui penyaringan, sehingga hanya menampilkan teks yang diterbitkan setelah tanggal tertentu atau oleh pengarang tertentu. Metadata ini mungkin juga perlu diambil bersama dengan teks utama, untuk menampilkan hasil pencarian dalam aplikasi. Untuk mengatur potongan-potongan teks ini, masing-masing harus diberi pengenal unik, yang dinyatakan sebagai bilangan bulat atau string. Elemen-elemen ini sangat penting untuk mencapai logika pencarian yang canggih.

Skema yang dirancang dengan baik sangat penting karena skema ini mengabstraksikan model data dan memutuskan apakah tujuan bisnis dapat dicapai melalui pencarian. Selain itu, karena setiap baris data yang dimasukkan ke dalam koleksi harus mengikuti skema, hal ini sangat membantu untuk menjaga konsistensi data dan kualitas jangka panjang. Dari perspektif teknis, skema yang terdefinisi dengan baik akan menghasilkan penyimpanan data kolom yang terorganisir dengan baik dan struktur indeks yang lebih bersih, yang dapat meningkatkan kinerja pencarian.

Contoh: Pencarian Berita

Katakanlah kita ingin membangun pencarian untuk situs web berita dan kita memiliki korpus berita dengan teks, gambar mini, dan metadata lainnya. Pertama, kita perlu menganalisis bagaimana kita ingin memanfaatkan data tersebut untuk mendukung kebutuhan bisnis pencarian. Bayangkan kebutuhannya adalah mengambil berita berdasarkan gambar thumbnail dan ringkasan konten, dan mengambil metadata seperti info penulis dan waktu penerbitan sebagai kriteria untuk memfilter hasil pencarian. Persyaratan ini dapat dibagi lagi menjadi beberapa bagian.

  • Untuk mencari gambar melalui teks, kita dapat menyematkan gambar ke dalam vektor melalui model penyematan multimodal yang dapat memetakan data teks dan gambar ke dalam ruang laten yang sama.

  • Teks ringkasan artikel disematkan ke dalam vektor melalui model penyematan teks.

  • Untuk memfilter berdasarkan waktu penerbitan, tanggal disimpan sebagai bidang skalar dan indeks diperlukan untuk bidang skalar untuk penyaringan yang efisien. Struktur data lain yang lebih kompleks seperti JSON dapat disimpan dalam bentuk skalar dan pencarian yang difilter dilakukan pada isinya (pengindeksan JSON adalah fitur yang akan datang).

  • Untuk mengambil byte thumbnail gambar dan merendernya pada halaman hasil pencarian, url gambar juga disimpan. Demikian pula untuk teks ringkasan dan judul. (Sebagai alternatif, kita dapat menyimpan data file teks dan gambar mentah sebagai bidang skalar jika diperlukan).

  • Untuk meningkatkan hasil pencarian pada teks ringkasan, kami merancang pendekatan pencarian hybrid. Untuk satu jalur pencarian, kami menggunakan model penyisipan biasa untuk menghasilkan vektor padat dari teks, seperti text-embedding-3-large milik OpenAI atau sumber terbuka bge-large-en-v1.5. Model-model ini bagus dalam merepresentasikan keseluruhan semantik teks. Cara lainnya adalah dengan menggunakan model penyematan jarang seperti BM25 atau SPLADE untuk menghasilkan vektor yang jarang, menyerupai pencarian teks lengkap yang baik dalam memahami detail dan konsep individual dalam teks. Milvus mendukung penggunaan keduanya dalam pengumpulan data yang sama berkat fitur multi-vektornya. Pencarian pada beberapa vektor dapat dilakukan dalam satu operasi hybrid_search().

  • Terakhir, kita juga membutuhkan kolom ID untuk mengidentifikasi setiap halaman berita, yang secara resmi disebut sebagai "entitas" dalam terminologi Milvus. Bidang ini digunakan sebagai kunci utama (atau disingkat "pk").

Nama Field

article_id (Kunci Utama)

judul

author_info

publish_ts

image_url

image_vector

ringkasan

ringkasan_vektor_padat

ringkasan_ringkasan_jarang_vektor

Tipe

INT64

VARCHAR

JSON

INT32

VARCHAR

FLOAT_VECTOR

VARCHAR

FLOAT_VECTOR

VEKTOR FLOAT_JARANG

Indeks Kebutuhan

N

N

N (Dukungan segera hadir)

Y

N

Y

N

Y

Y

Cara Menerapkan Contoh Skema

Membuat Skema

Pertama, kita membuat instance klien Milvus, yang dapat digunakan untuk terhubung ke server Milvus dan mengelola koleksi dan data.

Untuk menyiapkan skema, kita menggunakan create_schema() untuk membuat objek skema dan add_field() untuk menambahkan field ke skema.

from pymilvus import MilvusClient, DataType

collection_name = "my_collection"

# client = MilvusClient(uri="http://localhost:19530")
client = MilvusClient(uri="./milvus_demo.db")

schema = MilvusClient.create_schema(
    auto_id=False,
)

schema.add_field(field_name="article_id", datatype=DataType.INT64, is_primary=True, description="article id")
schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=200, description="article title")
schema.add_field(field_name="author_info", datatype=DataType.JSON, description="author information")
schema.add_field(field_name="publish_ts", datatype=DataType.INT32, description="publish timestamp")
schema.add_field(field_name="image_url", datatype=DataType.VARCHAR,  max_length=500, description="image URL")
schema.add_field(field_name="image_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="image vector")
schema.add_field(field_name="summary", datatype=DataType.VARCHAR, max_length=1000, description="article summary")
schema.add_field(field_name="summary_dense_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="summary dense vector")
schema.add_field(field_name="summary_sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR, description="summary sparse vector")

Anda mungkin melihat argumen uri di MilvusClient, yang digunakan untuk menghubungkan ke server Milvus. Anda dapat mengatur argumen sebagai berikut.

  • Jika Anda hanya membutuhkan basis data vektor lokal untuk data skala kecil atau pembuatan prototipe, mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.

  • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi di Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.

  • Jika Anda menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.

Sedangkan untuk auto_id di MilvusClient.create_schema, AutoID adalah atribut dari bidang utama yang menentukan apakah akan mengaktifkan kenaikan otomatis untuk bidang utama. Karena kami menetapkan fieldarticle_id sebagai kunci utama dan ingin menambahkan id artikel secara manual, kami menetapkan auto_id False untuk menonaktifkan fitur ini.

Setelah menambahkan semua field ke objek skema, objek skema kita setuju dengan entri pada tabel di atas.

Menentukan Indeks

Setelah mendefinisikan skema dengan berbagai bidang, termasuk metadata dan bidang vektor untuk data gambar dan ringkasan, langkah selanjutnya adalah menyiapkan parameter indeks. Pengindeksan sangat penting untuk mengoptimalkan pencarian dan pengambilan vektor, untuk memastikan kinerja kueri yang efisien. Pada bagian berikut, kita akan menentukan parameter indeks untuk bidang vektor dan skalar yang ditentukan dalam koleksi.

index_params = client.prepare_index_params()

index_params.add_index(
    field_name="image_vector",
    index_type="AUTOINDEX",
    metric_type="IP",
)
index_params.add_index(
    field_name="summary_dense_vector",
    index_type="AUTOINDEX",
    metric_type="IP",
)
index_params.add_index(
    field_name="summary_sparse_vector",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="IP",
)
index_params.add_index(
    field_name="publish_ts",
    index_type="INVERTED",
)

Setelah parameter indeks diatur dan diterapkan, Milvus dioptimalkan untuk menangani kueri yang kompleks pada data vektor dan skalar. Pengindeksan ini meningkatkan kinerja dan keakuratan pencarian kemiripan di dalam koleksi, sehingga memungkinkan pengambilan artikel secara efisien berdasarkan vektor gambar dan vektor ringkasan. Dengan memanfaatkan fitur AUTOINDEX untuk vektor padat, fitur SPARSE_INVERTED_INDEX untuk vektor jarang dan INVERTED_INDEX untuk skalar, Milvus dapat dengan cepat mengidentifikasi dan mengembalikan hasil yang paling relevan, sehingga secara signifikan meningkatkan pengalaman pengguna secara keseluruhan dan efektivitas proses pencarian data.

Ada banyak jenis indeks dan metrik. Untuk informasi lebih lanjut tentang mereka, Anda dapat merujuk ke jenis indeks Milvus dan jenis metrik Milvus.

Membuat Koleksi

Dengan skema dan indeks yang telah ditentukan, kita membuat "collection" dengan parameter-parameter tersebut. Koleksi untuk Milvus adalah seperti sebuah tabel untuk DB relasional.

client.create_collection(
    collection_name=collection_name,
    schema=schema,
    index_params=index_params,
)

Kita dapat memverifikasi bahwa koleksi telah berhasil dibuat dengan mendeskripsikan koleksi tersebut.

collection_desc = client.describe_collection(
    collection_name=collection_name
)
print(collection_desc)

Pertimbangan lain

Memuat Indeks

Ketika membuat koleksi di Milvus, Anda dapat memilih untuk memuat indeks dengan segera atau menundanya sampai setelah memasukkan beberapa data secara massal. Biasanya, Anda tidak perlu membuat pilihan eksplisit mengenai hal ini, karena contoh di atas menunjukkan bahwa indeks secara otomatis dibuat untuk setiap data yang di-ingest langsung setelah pembuatan koleksi. Hal ini memungkinkan pencarian data yang telah di-entry dapat dilakukan dengan segera. Namun, jika Anda memiliki sisipan massal yang besar setelah pembuatan koleksi dan tidak perlu mencari data apa pun hingga titik tertentu, Anda dapat menunda pembuatan indeks dengan menghilangkan index_params dalam pembuatan koleksi dan membangun indeks dengan memanggil load secara eksplisit setelah meng-insert semua data. Cara ini lebih efisien untuk membangun indeks pada koleksi yang besar, tetapi tidak ada pencarian yang dapat dilakukan sampai memanggil load().

Bagaimana Mendefinisikan Model Data Untuk Multi-penyewaan

Konsep beberapa penyewa biasanya digunakan dalam skenario di mana satu aplikasi perangkat lunak atau layanan perlu melayani beberapa pengguna atau organisasi independen, masing-masing dengan lingkungan yang terisolasi. Hal ini sering terlihat pada komputasi awan, aplikasi SaaS (Software as a Service), dan sistem basis data. Sebagai contoh, layanan penyimpanan cloud dapat menggunakan multi-tenancy untuk memungkinkan perusahaan yang berbeda untuk menyimpan dan mengelola data mereka secara terpisah sambil berbagi infrastruktur yang sama. Pendekatan ini memaksimalkan pemanfaatan sumber daya dan efisiensi sambil memastikan keamanan dan privasi data untuk setiap penyewa.

Cara termudah untuk membedakan penyewa adalah dengan mengisolasi data dan sumber daya mereka satu sama lain. Setiap penyewa memiliki akses eksklusif ke sumber daya tertentu atau berbagi sumber daya dengan yang lain untuk mengelola entitas Milvus seperti basis data, koleksi, dan partisi. Ada metode khusus yang selaras dengan entitas-entitas ini untuk mengimplementasikan multi-tenancy Milvus. Anda dapat merujuk ke halaman multi-tenancy Milvus untuk informasi lebih lanjut.

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?