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 berdasarkan pembatasan kategoris dan numerik. Menambahkan batasan, atau "memfilter" hasil indeks Anda, berguna karena beberapa alasan, seperti contoh berikut:

  • Peningkatan relevansi hasil: Penelusuran Vektor adalah alat yang efektif untuk menemukan item yang mirip secara semantik. Pemfilteran dapat digunakan untuk menghapus hasil yang tidak relevan dari hasil penelusuran, seperti item yang tidak dalam bahasa, kategori, harga, atau rentang tanggal yang benar.

  • Mengurangi jumlah hasil: Penelusuran Vektor dapat menampilkan hasil dalam jumlah besar, terutama untuk set data besar. Pemfilteran dapat digunakan untuk mengurangi jumlah hasil menjadi jumlah yang lebih mudah dikelola, sekaligus tetap menampilkan hasil yang paling relevan.

  • Hasil yang tersegmentasi: Pemfilteran dapat digunakan untuk mempersonalisasi hasil penelusuran sesuai dengan kebutuhan dan preferensi masing-masing pengguna. Misalnya, pengguna mungkin ingin memfilter hasil agar hanya menyertakan item yang diberi rating tinggi sebelumnya atau yang berada 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 batasan token dan nilai untuk batasan numerik. Batasan ini dapat berlaku dari setiap beberapa kategori atribut, yang juga dikenal sebagai namespace.

Dalam aplikasi contoh berikut, vektor diberi tag dengan color, price, dan shape:

  • color, price, dan shape adalah namespace.
  • 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 atau biru": {color: red, blue}, {shape: square}.
  • Untuk menentukan objek tanpa warna, hapus namespace "warna" di kolom restricts.
  • Untuk menentukan batasan numerik untuk objek, perhatikan namespace dan nilai di kolom yang sesuai untuk jenis tersebut. 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 boleh 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.
  • Batasan 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 layak jika nilainya lebih kecil atau sama dengan nilai yang digunakan dalam kueri.

Contoh kode berikut mengidentifikasi atribut vektor pada 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
    ],
    "restricts": [
      {
        "namespace": "class",
        "allow": [
          "cat",
          "pet"
        ]
      },
      {
        "namespace": "category",
        "allow": [
          "feline"
        ]
      }
    ]
  },
  {
    "id": "43",
    "embedding": [
      0.6,
      1
    ],
    "sparse_embedding": {
      "values": [
        0.1,
        0.2
      ],
      "dimensions": [
        1,
        4
      ]
    },
    "restricts": [
      {
        "namespace": "class",
        "allow": [
          "dog",
          "pet"
        ]
      },
      {
        "namespace": "category",
        "allow": [
          "canine"
        ]
      }
    ]
  }
]
  • Untuk setiap data vektor, tambahkan kolom bernama numeric_restricts, untuk menampung 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
    ],
    "numeric_restricts": [
      {
        "namespace": "size",
        "value_int": 3
      },
      {
        "namespace": "ratio",
        "value_float": 0.1
      }
    ]
  },
  {
    "id": "43",
    "embedding": [
      0.6,
      1
    ],
    "sparse_embedding": {
      "values": [
        0.1,
        0.2
      ],
      "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": "sparse_embedding",
      "type": [
        "null",
        {
          "type": "record",
          "name": "sparse_embedding",
          "fields": [
            {
              "name": "values",
              "type": {
                "type": "array",
                "items": "float"
              }
            },
            {
              "name": "dimensions",
              "type": {
                "type": "array",
                "items": "long"
              }
            }
          ]
        }
      ]
    },
    {
      "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 format name=value yang dipisahkan koma untuk menentukan batasan namespace token. Nama yang sama dapat diulang jika terdapat beberapa nilai dalam satu namespace.

      Misalnya, color=red,color=blue merepresentasikan TokenNamespace ini:

      {
        "namespace": "color"
        "string_tokens": ["red", "blue"]
      }
      
    • Untuk setiap data vektor, tambahkan pasangan format name=!value yang dipisahkan koma untuk menentukan nilai yang dikecualikan untuk pembatasan namespace token.

      Misalnya, color=!red merepresentasikan TokenNamespace ini:

      {
        "namespace": "color"
        "string_blacklist_tokens": ["red"]
      }
      
  • Batasan numerik

    • Untuk setiap data vektor, tambahkan pasangan format #name=numericValue yang dipisahkan koma dengan akhiran jenis angka untuk menentukan batasan 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 merepresentasikan 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
      }
      
    • Berikut adalah contoh titik data dengan id: "6", embedding: [7, -8.1], sparse_embedding: {values: [0.1, -0.2, 0.5], dimensions: [40, 901, 1111]}}, tag kepadatan test, daftar yang diizinkan token color: red, blue, daftar yang ditolak token color: purple, dan batasan numerik ratio dengan float 0.1:

      6,7,-8.1,40:0.1,901:-0.2,1111:0.5,crowding_tag=test,color=red,color=blue,color=!purple,
      ratio=0.1f
      

Langkah selanjutnya