Memfilter kecocokan vektor

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, dan shape adalah ruang nama.
  • red dan blue adalah token dari namespace color.
  • square dan circle adalah token dari namespace shape.
  • 100 dan 50 adalah nilai dari namespace price.

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 dalam value_float, dan nilai ganda harus ditentukan dalam value_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 objek red dari jenis apa pun, tanpa batasan pada shape.
  • Pembatasan numerik dalam kueri memerlukan namespace, salah satu nilai angka dari value_int, value_float, dan value_double, serta operator op.
  • Operator op adalah salah satu dari LESS, LESS_EQUAL, EQUAL, GREATER_EQUAL, dan GREATER. Misalnya, jika operator LESS_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:{}.

    Titik kueri dan database.

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 namespace TokenNamespace.namespace.
    • Nilai kolom allow, jika ada, merupakan array string. Array string ini adalah daftar TokenNamespace.string_tokens.
    • Nilai kolom deny, jika ada, merupakan array string. Array string ini adalah daftar TokenNamespace.string_denylist_tokens.

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 namespace NumericRestrictNamespace.namespace.
    • Setiap objek harus memiliki salah satu dari value_int, value_float, dan value_double.
    • Setiap objek tidak boleh memiliki kolom bernama op. Kolom ini hanya untuk kueri.

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 mewakili TokenNamespace 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 mewakili TokenNamespace 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, dan d untuk double. Nama yang sama tidak boleh diulang karena harus ada satu nilai yang terkait per namespace.

      Misalnya, #size=3i mewakili NumericRestrictNamespace ini:

      {
        "namespace": "size"
        "value_int": 3
      }
      

      #ratio=0.1f mewakili NumericRestrictNamespace ini:

      {
        "namespace": "ratio"
        "value_float": 0.1
      }
      

      #weight=0.3d mewakili NumericRestriction ini:

      {
        "namespace": "weight"
        "value_double": 0.3
      }
      

Langkah selanjutnya