Pencocokan FrasaCompatible with Milvus 2.5.17+
Pencocokan frasa memungkinkan Anda mencari dokumen yang mengandung istilah kueri Anda sebagai frasa yang tepat. Secara default, kata-kata harus muncul dalam urutan yang sama dan berdekatan satu sama lain. Misalnya, kueri untuk "pembelajaran mesin robotika" mencocokkan teks seperti "... model pembelajaran mesin robotika yang khas...", di mana kata "robotika", "mesin", dan "pembelajaran" muncul secara berurutan tanpa kata lain di antaranya.
Namun, dalam skenario dunia nyata, pencocokan frasa yang ketat bisa jadi terlalu kaku. Anda mungkin ingin mencocokkan teks seperti "... model pembelajaran mesin yang banyak diadopsi dalam robotika...". Di sini, kata kunci yang sama ada tetapi tidak berdampingan atau dalam urutan aslinya. Untuk menangani hal ini, pencocokan frasa mendukung parameter slop, yang memperkenalkan fleksibilitas. Nilai slop mendefinisikan berapa banyak pergeseran posisi yang diperbolehkan di antara istilah dalam frasa. Misalnya, dengan slop sebesar 1, kueri untuk "pembelajaran mesin" dapat mencocokkan teks seperti "... machine deep learning...", di mana satu kata ("deep") memisahkan istilah aslinya.
Gambaran Umum
Didukung oleh pustaka mesin pencari Tantivy, pencocokan frasa bekerja dengan menganalisis informasi posisi kata dalam dokumen. Diagram di bawah ini mengilustrasikan prosesnya:
Alur Kerja Pencocokan Frasa
Tokenisasi Dokumen: Ketika Anda memasukkan dokumen ke dalam Milvus, teks akan dipecah menjadi token (kata atau istilah individual) menggunakan penganalisis, dengan informasi posisi yang dicatat untuk setiap token. Sebagai contoh, doc_1 ditokenisasi menjadi ["mesin" (pos=0), "belajar" (pos=1), "meningkatkan" (pos=2), "efisiensi" (pos=3)]. Untuk informasi lebih lanjut tentang penganalisis, lihat Ikhtisar Penganalisis.
Pembuatan Indeks Terbalik: Milvus membuat indeks terbalik, memetakan setiap token ke dokumen tempat token tersebut muncul dan posisi token dalam dokumen tersebut.
Pencocokan Frasa: Ketika kueri frasa dijalankan, Milvus mencari setiap token dalam indeks terbalik dan memeriksa posisinya untuk menentukan apakah token tersebut muncul dalam urutan dan jarak yang benar. Parameter
slopmengontrol jumlah maksimum posisi yang diperbolehkan di antara token yang cocok:slop = 0 berarti token harus muncul dalam urutan yang tepat dan berdekatan (yaitu, tidak ada kata tambahan di antaranya).
- Dalam contoh, hanya doc_1 ("machine" pada pos=0, "learning" pada pos=1) yang cocok dengan tepat.
slop = 2 memungkinkan hingga dua posisi fleksibilitas atau pengaturan ulang antara token yang cocok.
Hal ini memungkinkan urutan terbalik ("mesin pembelajaran") atau celah kecil di antara token.
Akibatnya, doc_1, doc_2 ("belajar" pada pos=0, "mesin" pada pos=1), dan doc_3 ("belajar" pada pos=1, "mesin" pada pos=2) semuanya cocok.
Mengaktifkan pencocokan frasa
Pencocokan frasa bekerja dengan tipe bidang VARCHAR, tipe data string di Milvus. Untuk mengaktifkan pencocokan frasa, konfigurasikan skema koleksi Anda dengan mengatur parameter enable_analyzer dan enable_match ke True, mirip dengan pencocokan teks.
Tetapkan enable_analyzer dan enable_match
Untuk mengaktifkan pencocokan frasa untuk bidang VARCHAR tertentu, setel kedua parameter enable_analyzer dan enable_match ke True ketika mendefinisikan skema bidang. Konfigurasi ini menginstruksikan Milvus untuk menandai teks dan membuat indeks terbalik dengan informasi posisi yang diperlukan untuk pencocokan frasa yang efisien.
Berikut adalah contoh definisi skema untuk mengaktifkan pencocokan frasa:
from pymilvus import MilvusClient, DataType
# Create a schema for a new collection
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name="id",
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
# Add a VARCHAR field configured for phrase matching
schema.add_field(
field_name='text', # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string)
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis (tokenization)
enable_match=True # Enables inverted indexing for phrase matching
)
schema.add_field(
field_name="embeddings",
datatype=DataType.FLOAT_VECTOR,
dim=5
)
Opsional: Mengonfigurasi penganalisis
Akurasi pencocokan frasa sangat bergantung pada penganalisis yang digunakan untuk memberi token pada data teks Anda. Penganalisis yang berbeda sesuai dengan bahasa dan format teks yang berbeda, yang memengaruhi tokenisasi dan akurasi posisi. Memilih penganalisis yang sesuai untuk kasus penggunaan spesifik Anda akan mengoptimalkan hasil pencocokan frasa.
Secara default, Milvus menggunakan penganalisis standar, yang memberi token pada teks berdasarkan spasi dan tanda baca, menghapus token yang lebih panjang dari 40 karakter, dan mengonversi teks menjadi huruf kecil. Tidak ada parameter tambahan yang diperlukan untuk penggunaan default. Lihat Penganalisis Standar untuk detailnya.
Jika aplikasi Anda memerlukan penganalisis tertentu, konfigurasikan menggunakan parameter analyzer_params. Sebagai contoh, berikut adalah cara mengonfigurasi english analyzer untuk pencocokan frasa dalam teks bahasa Inggris:
# Define analyzer parameters for English-language tokenization
analyzer_params = {
"type": "english"
}
# Add the VARCHAR field with the English analyzer enabled
schema.add_field(
field_name='text', # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis
analyzer_params=analyzer_params, # Specifies the analyzer configuration
enable_match=True # Enables inverted indexing for phrase matching
)
Milvus mendukung beberapa penganalisis yang disesuaikan untuk berbagai bahasa dan kasus penggunaan. Untuk informasi rinci, lihat Ikhtisar Penganalisis.
Menggunakan pencocokan frasa
Setelah Anda mengaktifkan pencocokan untuk bidang VARCHAR dalam skema koleksi Anda, Anda dapat melakukan pencocokan frasa menggunakan ekspresi PHRASE_MATCH.
Ekspresi PHRASE_MATCH tidak peka huruf besar/kecil. Anda dapat menggunakan PHRASE_MATCH atau phrase_match.
Sintaks ekspresi PHRASE_MATCH
Gunakan ekspresi PHRASE_MATCH untuk menentukan bidang, frasa, dan fleksibilitas opsional (slop) saat melakukan pencarian. Sintaksnya adalah:
PHRASE_MATCH(field_name, phrase, slop)
field_name: Nama bidangVARCHARtempat Anda melakukan pencocokan frasa.phrase: Frasa yang tepat untuk dicari.slop(opsional): Bilangan bulat yang menentukan jumlah maksimum posisi yang diperbolehkan dalam pencocokan token.0(default): Hanya mencocokkan frasa yang sama persis. Contoh: Filter untuk "machine learning" akan mencocokkan "machine learning" dengan tepat, tetapi tidak mencocokkan "machine boosts learning" atau "learning machine".1: Memungkinkan variasi kecil, seperti satu istilah tambahan atau pergeseran posisi kecil. Contoh: Filter untuk "machine learning" akan cocok dengan "machine boosts learning" (satu token di antara "machine" dan "learning"), tetapi tidak cocok dengan "learning machine" (istilahnya dibalik).2: Memungkinkan fleksibilitas yang lebih besar, termasuk urutan istilah yang dibalik atau hingga dua token di antaranya. Contoh: Filter untuk "machine learning" akan cocok dengan "learning machine" (istilah dibalik) atau "machine quickly boosts learning" (dua token di antara "machine" dan "learning").
Contoh kumpulan data
Misalkan Anda memiliki koleksi bernama tech_articles yang berisi lima entitas berikut ini:
|
|
|---|---|
1 |
"Pembelajaran mesin meningkatkan efisiensi dalam analisis data berskala besar" |
2 |
"Mempelajari pendekatan berbasis mesin sangat penting untuk kemajuan AI modern" |
3 |
"Arsitektur mesin pembelajaran mendalam mengoptimalkan beban komputasi" |
4 |
"Mesin dengan cepat meningkatkan kinerja model untuk pembelajaran yang berkelanjutan" |
5 |
"Mempelajari algoritme mesin tingkat lanjut memperluas kemampuan AI" |
Kueri dengan pencocokan frasa
Saat menggunakan metode query(), PHRASE_MATCH bertindak sebagai filter skalar. Hanya dokumen yang mengandung frasa yang ditentukan (sesuai dengan slop yang diizinkan) yang dikembalikan.
Contoh: slop = 0 (sama persis)
Contoh ini mengembalikan dokumen yang berisi frasa yang sama persis dengan "pembelajaran mesin" tanpa token tambahan di antaranya.
# Match documents containing exactly "machine learning"
filter = "PHRASE_MATCH(text, 'machine learning')"
result = client.query(
collection_name="tech_articles",
filter=filter,
output_fields=["id", "text"]
)
Hasil kecocokan yang diharapkan:
|
|
|---|---|
1 |
"Pembelajaran mesin meningkatkan efisiensi dalam analisis data berskala besar" |
Hanya dokumen 1 yang mengandung frasa yang sama persis dengan "machine learning" dalam urutan yang ditentukan tanpa token tambahan.
Pencarian dengan pencocokan frasa
Dalam operasi pencarian, PHRASE_MATCH digunakan untuk memfilter dokumen sebelum menerapkan peringkat kemiripan vektor. Pendekatan dua langkah ini pertama-tama mempersempit kumpulan kandidat dengan pencocokan tekstual dan kemudian memberi peringkat ulang pada kandidat tersebut berdasarkan sematan vektor.
Contoh: slop = 1
Di sini, kami mengizinkan slop sebesar 1. Filter diterapkan pada dokumen yang mengandung frasa "mesin pembelajaran" dengan sedikit fleksibilitas.
# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"
result_slop1 = client.search(
collection_name="tech_articles",
anns_field="embeddings",
data=[query_vector],
filter=filter_slop1,
search_params={"params": {"nprobe": 10}},
limit=10,
output_fields=["id", "text"]
)
Hasil pencocokan:
|
|
|---|---|
2 |
"Mempelajari pendekatan berbasis mesin sangat penting untuk kemajuan AI modern" |
3 |
"Arsitektur mesin pembelajaran mendalam mengoptimalkan beban komputasi" |
5 |
"Mempelajari algoritme mesin tingkat lanjut memperluas kemampuan AI" |
Contoh: slop = 2
Contoh ini mengizinkan slop 2, yang berarti bahwa hingga dua token tambahan (atau istilah yang dibalik) diperbolehkan di antara kata "mesin" dan "pembelajaran".
# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"
result_slop2 = client.search(
collection_name="tech_articles",
anns_field="embeddings", # Vector field name
data=[query_vector], # Query vector
filter=filter_slop2, # Filter expression
search_params={"params": {"nprobe": 10}},
limit=10, # Maximum results to return
output_fields=["id", "text"]
)
Mencocokkan hasil:
|
|
|---|---|
1 |
"Pembelajaran mesin meningkatkan efisiensi dalam analisis data berskala besar" |
3 |
"Arsitektur mesin pembelajaran mendalam mengoptimalkan beban komputasi" |
Contoh: slop = 3
Dalam contoh ini, slop 3 memberikan fleksibilitas yang lebih besar. Filter mencari "machine learning" dengan maksimal tiga posisi token yang diperbolehkan di antara kata-kata tersebut.
# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"
result_slop2 = client.search(
collection_name="tech_articles",
anns_field="embeddings", # Vector field name
data=[query_vector], # Query vector
filter=filter_slop3, # Filter expression
search_params={"params": {"nprobe": 10}},
limit=10, # Maximum results to return
output_fields=["id", "text"]
)
Hasil yang cocok:
|
|
|---|---|
1 |
"Pembelajaran mesin meningkatkan efisiensi dalam analisis data berskala besar" |
2 |
"Mempelajari pendekatan berbasis mesin sangat penting untuk kemajuan AI modern" |
3 |
"Arsitektur mesin pembelajaran mendalam mengoptimalkan beban komputasi" |
5 |
"Mempelajari algoritme mesin tingkat lanjut memperluas kemampuan AI" |
Pertimbangan
Mengaktifkan pencocokan frasa untuk suatu bidang akan memicu pembuatan indeks terbalik, yang menghabiskan sumber daya penyimpanan. Pertimbangkan dampak penyimpanan saat memutuskan untuk mengaktifkan fitur ini, karena bervariasi berdasarkan ukuran teks, token unik, dan penganalisis yang digunakan.
Setelah Anda mendefinisikan penganalisis dalam skema Anda, pengaturannya menjadi permanen untuk koleksi tersebut. Jika Anda memutuskan bahwa penganalisis yang berbeda lebih sesuai dengan kebutuhan Anda, Anda dapat mempertimbangkan untuk menghapus koleksi yang ada dan membuat yang baru dengan konfigurasi penganalisis yang diinginkan.
Kinerja pencocokan frasa bergantung pada bagaimana teks diberi tanda. Sebelum menerapkan penganalisis ke seluruh koleksi Anda, gunakan metode
run_analyzeruntuk meninjau keluaran tokenisasi. Untuk informasi lebih lanjut, lihat Ikhtisar Penganalisis.Aturan pelarian dalam ekspresi
filter:Karakter yang diapit oleh tanda kutip ganda atau tanda kutip tunggal di dalam ekspresi ditafsirkan sebagai konstanta string. Jika konstanta string menyertakan karakter escape, karakter escape harus direpresentasikan dengan urutan escape. Misalnya, gunakan
\\untuk mewakili\,\\tuntuk mewakili tab\t, dan\\nuntuk mewakili baris baru.Jika konstanta string diapit oleh tanda kutip tunggal, tanda kutip tunggal dalam konstanta tersebut harus direpresentasikan sebagai
\\'sedangkan tanda kutip ganda dapat direpresentasikan sebagai"atau\\". Contoh:'It\\'s milvus'.Jika konstanta string diapit oleh tanda kutip ganda, tanda kutip ganda di dalam konstanta harus direpresentasikan sebagai
\\"sedangkan tanda kutip tunggal dapat direpresentasikan sebagai'atau\\'. Contoh:"He said \\"Hi\\"".