Dalam Vector Search, Anda dapat membatasi penelusuran pencocokan vektor ke sebagian indeks menggunakan aturan Boolean. Predikat Boolean memberi tahu kepada Vector Search vektor mana dalam indeks yang akan diabaikan. Di halaman ini, Anda akan mempelajari cara kerja pemfilteran, melihat contoh, dan cara membuat kueri data secara efisien berdasarkan kesamaan vektor.
Dengan Vector Search, Anda dapat membatasi hasil dengan pembatasan kategoris dan numerik. Menambahkan pembatasan atau "memfilter" hasil indeks berguna untuk beberapa alasan, seperti contoh berikut:
Peningkatan relevansi hasil: Vector Search adalah alat yang canggih untuk menemukan item yang mirip secara semantik. Pemfilteran dapat digunakan untuk menghapus hasil yang tidak relevan dari hasil penelusuran, seperti item yang menggunakan bahasa, kategori, harga, atau rentang tanggal yang tidak benar.
Pengurangan jumlah hasil: Vector Search dapat menampilkan hasil dalam jumlah besar, terutama untuk set data besar. Pemfilteran dapat digunakan untuk mengurangi jumlah hasil ke jumlah yang lebih mudah dikelola, sambil tetap menampilkan hasil yang paling relevan.
Hasil tersegmentasi: Pemfilteran dapat digunakan untuk mempersonalisasi hasil penelusuran dengan kebutuhan dan preferensi individual pengguna. Misalnya, pengguna mungkin ingin memfilter hasil agar hanya menyertakan item yang mereka beri rating tinggi di masa lalu atau yang termasuk dalam rentang harga tertentu.
Atribut vektor
Dalam penelusuran kemiripan vektor pada database vektor, setiap vektor dijelaskan oleh atribut nol atau lebih. Atribut ini dikenal sebagai token untuk pembatasan token dan nilai untuk pembatasan numerik. Pembatasan ini dapat diterapkan dari setiap kategori atribut, yang juga disebut sebagai namespace.
Dalam aplikasi contoh berikut, vektor diberi tag dengan color
, price
, dan shape
:
color
,price
, danshape
adalah ruang nama.red
danblue
adalah token dari namespacecolor
.square
dancircle
adalah token dari namespaceshape
.100
dan50
adalah nilai dari namespaceprice
.
Menentukan atribut vektor
- Untuk menentukan "lingkaran merah":
{color: red}, {shape: circle}
. - Untuk menentukan "kotak merah dan biru":
{color: red, blue}, {shape: square}
. - Untuk menentukan objek tanpa warna, hapus namespace "warna" di kolom
restricts
. - Guna menentukan batasan numerik untuk objek, catat namespace dan nilai di kolom yang sesuai untuk jenisnya. Nilai int harus ditentukan dalam
value_int
, nilai float harus ditentukan dalamvalue_float
, dan nilai ganda harus ditentukan dalamvalue_double
. Hanya satu jenis angka yang harus digunakan untuk namespace tertentu.
Untuk mengetahui informasi tentang skema yang digunakan dalam menentukan data ini, lihat Menentukan namespace dan token di data input.
Kueri
- Kueri menyatakan operator logika AND di seluruh namespace dan operator logika OR dalam setiap namespace. Kueri yang menentukan
{color: red, blue}, {shape: square, circle}
cocok dengan semua titik database yang memenuhi(red || blue) && (square || circle)
. - Kueri yang menentukan
{color: red}
, cocok dengan semua objekred
dari jenis apa pun, tanpa batasan padashape
. - Pembatasan numerik dalam kueri memerlukan
namespace
, salah satu nilai angka darivalue_int
,value_float
, danvalue_double
, serta operatorop
. - Operator
op
adalah salah satu dariLESS
,LESS_EQUAL
,EQUAL
,GREATER_EQUAL
, danGREATER
. Misalnya, jika operatorLESS_EQUAL
digunakan, titik data memenuhi syarat jika nilainya lebih kecil atau sama dengan nilai yang digunakan dalam kueri.
Contoh kode berikut mengidentifikasi atribut vektor dalam aplikasi contoh:
{
namespace: "price"
value_int: 20
op: LESS
}
{
namespace: "length"
value_float: 0.3
op: GREATER_EQUAL
}
{
namespace: "width"
value_double: 0.5
op: EQUAL
}
Daftar tolak
Untuk mengaktifkan skenario lanjutan, Google mendukung bentuk negasi yang dikenal sebagai token daftar tolak. Saat kueri menolak token, kecocokan akan dikecualikan untuk setiap titik data yang memiliki token yang ditolak. Jika namespace kueri hanya memiliki token yang ditolak, semua titik yang tidak secara eksplisit ditolak akan cocok, dengan cara yang sama persis seperti namespace kosong yang cocok dengan semua titik.
Titik data juga dapat menolak token, tidak termasuk kecocokan dengan kueri apa pun yang menentukan token tersebut.
Misalnya, tentukan titik data berikut dengan token yang ditentukan:
A: {} // empty set matches everything B: {red} // only a 'red' token C: {blue} // only a 'blue' token D: {orange} // only an 'orange' token E: {red, blue} // multiple tokens F: {red, !blue} // deny the 'blue' token G: {red, blue, !blue} // An unlikely edge-case H: {!blue} // deny-only (similar to empty-set)
Sistem berperilaku sebagai berikut:
- Namespace kueri kosong adalah karakter pengganti pencocokan semua. Misalnya, Q:
{}
cocok dengan DB:{color:red}
. Namespace datapoint kosong bukan karakter pengganti pencocokan semua. Misalnya, Q:
{color:red}
tidak cocok dengan DB:{}
.
Menentukan namespace dan token atau nilai dalam data input
Untuk informasi tentang cara menyusun data input secara keseluruhan, lihat Format dan struktur data input.
Tab berikut menunjukkan cara menentukan namespace dan token yang terkait dengan setiap vektor input.
JSON
Untuk setiap data vektor, tambahkan kolom bernama
restricts
, untuk menampung array objek, yang masing-masing merupakan namespace.- Setiap objek harus memiliki kolom bernama
namespace
. Kolom ini adalah namespaceTokenNamespace.namespace
. - Nilai kolom
allow
, jika ada, merupakan array string. Array string ini adalah daftarTokenNamespace.string_tokens
. - Nilai kolom
deny
, jika ada, merupakan array string. Array string ini adalah daftarTokenNamespace.string_denylist_tokens
.
- Setiap objek harus memiliki kolom bernama
Berikut adalah dua contoh data dalam format JSON:
{"id": "42", "embedding": [0.5, 1.0], "restricts": [{"namespace": "class",
"allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace":
"class", "allow": ["dog", "pet"]},{"namespace": "category", "allow":
["canine"]}]}
Untuk setiap kumpulan data vektor, tambahkan kolom bernama
numeric_restricts
, untuk berisi array objek, yang masing-masing merupakan batasan numerik.- Setiap objek harus memiliki kolom bernama
namespace
. Kolom ini adalah namespaceNumericRestrictNamespace.namespace
. - Setiap objek harus memiliki salah satu dari
value_int
,value_float
, danvalue_double
. - Setiap objek tidak boleh memiliki kolom bernama
op
. Kolom ini hanya untuk kueri.
- Setiap objek harus memiliki kolom bernama
Berikut adalah dua contoh data dalam format JSON:
{"id": "42", "embedding": [0.5, 1.0], "numeric_restricts":
[{"namespace": "size", "value_int": 3},{"namespace": "ratio", "value_float": 0.1}]}
{"id": "43", "embedding": [0.6, 1.0], "numeric_restricts": [{"namespace":
"weight", "value_double": 0.3}]}
Avro
Data Avro menggunakan skema berikut:
{
"type": "record",
"name": "FeatureVector",
"fields": [
{
"name": "id",
"type": "string"
},
{
"name": "embedding",
"type": {
"type": "array",
"items": "float"
}
},
{
"name": "restricts",
"type": [
"null",
{
"type": "array",
"items": {
"type": "record",
"name": "Restrict",
"fields": [
{
"name": "namespace",
"type": "string"
},
{
"name": "allow",
"type": [
"null",
{
"type": "array",
"items": "string"
}
]
},
{
"name": "deny",
"type": [
"null",
{
"type": "array",
"items": "string"
}
]
}
]
}
}
]
},
{
"name": "numeric_restricts",
"type": [
"null",
{
"type": "array",
"items": {
"name": "NumericRestrict",
"type": "record",
"fields": [
{
"name": "namespace",
"type": "string"
},
{
"name": "value_int",
"type": [ "null", "int" ],
"default": null
},
{
"name": "value_float",
"type": [ "null", "float" ],
"default": null
},
{
"name": "value_double",
"type": [ "null", "double" ],
"default": null
}
]
}
}
],
"default": null
},
{
"name": "crowding_tag",
"type": [
"null",
"string"
]
}
]
}
CSV
Pembatasan token
Untuk setiap data vektor, tambahkan pasangan yang dipisahkan koma dari format
name=value
untuk menentukan pembatasan namespace token. Nama yang sama dapat diulang jika ada beberapa nilai dalam namespace.Misalnya,
color=red,color=blue
mewakiliTokenNamespace
ini:{ "namespace": "color" "string_tokens": ["red", "blue"] }
Untuk setiap data vektor, tambahkan pasangan yang dipisahkan koma dari format
name=!value
guna menentukan nilai yang dikecualikan untuk pembatasan namespace token.Misalnya,
color=!red
mewakiliTokenNamespace
ini:{ "namespace": "color" "string_blacklist_tokens": ["red"] }
Pembatasan numerik
Untuk setiap data vektor, tambahkan pasangan yang dipisahkan koma dari format
#name=numericValue
dengan akhiran jenis angka untuk menentukan pembatasan namespace numerik.Akhiran jenis angka adalah
i
untuk int,f
untuk float, dand
untuk double. Nama yang sama tidak boleh diulang karena harus ada satu nilai yang terkait per namespace.Misalnya,
#size=3i
mewakiliNumericRestrictNamespace
ini:{ "namespace": "size" "value_int": 3 }
#ratio=0.1f
mewakiliNumericRestrictNamespace
ini:{ "namespace": "ratio" "value_float": 0.1 }
#weight=0.3d
mewakiliNumericRestriction
ini:{ "namespace": "weight" "value_double": 0.3 }
Langkah selanjutnya
- Pelajari cara membuat kueri indeks untuk menemukan tetangga terdekatnya.
- Pelajari cara memilih, membuat kueri, dan menampilkan metrik ini di Metrics Explorer.