Filtra corrispondenze vettoriali

In Vector Search, puoi limitare le ricerche che corrispondono a vettori a un sottoinsieme dell'indice utilizzando le regole booleane. I predicati booleani indicano alla ricerca vettoriale i vettori dell'indice da ignorare. In questa pagina scoprirai come funziona l'applicazione di filtri, vedrai esempi e come eseguire query efficienti sui tuoi dati in base alla somiglianza vettoriale.

Con Vector Search puoi limitare i risultati in base a restrizioni categoriche e numeriche. L'aggiunta di restrizioni o il "filtro" dei risultati dell'indice sono utili per diversi motivi, come i seguenti esempi:

  • Migliore pertinenza dei risultati: Vector Search è un potente strumento per trovare elementi semanticamente simili. Puoi utilizzare i filtri per rimuovere i risultati irrilevanti dai risultati di ricerca, ad esempio articoli che non sono nella lingua, nella categoria, nel prezzo o nell'intervallo di date corretti.

  • Numero ridotto di risultati: Vector Search può restituire un numero elevato di risultati, in particolare per set di dati di grandi dimensioni. Puoi utilizzare i filtri per ridurre il numero di risultati a un numero più gestibile, pur restituendo i risultati più pertinenti.

  • Risultati di ricerca: è possibile applicare filtri per personalizzare i risultati di ricerca in base alle esigenze e alle preferenze individuali dell'utente. Ad esempio, un utente potrebbe voler filtrare i risultati in modo da includere solo gli articoli che hanno ricevuto una valutazione elevata in passato o che rientrano in una specifica fascia di prezzo.

Attributi vettoriali

In una ricerca di somiglianza vettoriale su un database di vettori, ogni vettore è descritto da zero o più attributi. Questi attributi sono noti come token per le limitazioni dei token e valori per le restrizioni numeriche. Queste limitazioni possono essere applicate da ciascuna delle numerose categorie di attributi, note anche come spazi dei nomi.

Nella seguente applicazione di esempio, ai vettori viene assegnato il tag color, price e shape:

  • color, price e shape sono spazi dei nomi.
  • red e blue sono token dallo spazio dei nomi color.
  • square e circle sono token dallo spazio dei nomi shape.
  • 100 e 50 sono valori dello spazio dei nomi price.

Specifica gli attributi dei vettori

  • Per specificare un "cerchio rosso": {color: red}, {shape: circle}.
  • Per specificare un "quadrato rosso o blu": {color: red, blue}, {shape: square}.
  • Per specificare un oggetto senza colore, ometti lo spazio dei nomi "color" nel campo restricts.
  • Per specificare limitazioni numeriche per un oggetto, prendi nota dello spazio dei nomi e del valore nel campo appropriato per il tipo. Il valore Int deve essere specificato in value_int, il valore in virgola mobile deve essere specificato in value_float e il valore doppio deve essere specificato in value_double. Deve essere usato un solo tipo di numero per un determinato spazio dei nomi.

Per informazioni sullo schema utilizzato per specificare questi dati, consulta Specificare gli spazi dei nomi e i token nei dati di input.

Query

  • Le query esprimono un operatore logico AND negli spazi dei nomi e un operatore logico OR all'interno di ogni spazio dei nomi. Una query che specifica {color: red, blue}, {shape: square, circle}, corrisponde a tutti i punti del database che soddisfano (red || blue) && (square || circle).
  • Una query che specifica {color: red}, corrisponde a tutti gli oggetti red di qualsiasi tipo, senza limitazioni su shape.
  • Le limitazioni numeriche nelle query richiedono namespace, uno dei valori numerici di value_int, value_float e value_double e l'operatore op.
  • L'operatore op è uno dei seguenti: LESS, LESS_EQUAL, EQUAL, GREATER_EQUAL e GREATER. Ad esempio, se viene utilizzato l'operatore LESS_EQUAL, i punti dati sono idonei se il loro valore è inferiore o uguale al valore utilizzato nella query.

I seguenti esempi di codice identificano gli attributi vettoriali nell'applicazione di esempio:

{
  namespace: "price"
  value_int: 20
  op: LESS
}

{
  namespace: "length"
  value_float: 0.3
  op: GREATER_EQUAL
}

{
  namespace: "width"
  value_double: 0.5
  op: EQUAL
}

Lista bloccata

Per consentire scenari più avanzati, Google supporta una forma di negazione nota come token di negazione. Quando una query inserisce un token nella lista bloccata, le corrispondenze vengono escluse per qualsiasi punto dati che contiene il token. Se lo spazio dei nomi di una query contiene solo token negati, tutti i punti non esplicitamente inclusi nella lista bloccata corrispondono esattamente allo stesso modo in cui uno spazio dei nomi vuoto corrisponde a tutti i punti.

I punti dati possono anche inserire un token nella lista bloccata, escludendo le corrispondenze con qualsiasi query che specifichi quel token.

Ad esempio, definisci i seguenti punti dati con i token specificati:

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)

Il sistema si comporta nel seguente modo:

  • Gli spazi dei nomi delle query vuoti sono caratteri jolly di corrispondenza per tutti. Ad esempio, D:{} corrisponde a DB:{color:red}.
  • Gli spazi dei nomi dei punti dati vuoti non corrispondono a tutti i caratteri jolly. Ad esempio, D:{color:red} non corrisponde a DB:{}.

    Query e punti di database.

Specifica gli spazi dei nomi, i token o i valori nei dati di input

Per informazioni su come strutturare i dati di input nel complesso, consulta Formato e struttura dei dati di input.

Le seguenti schede mostrano come specificare gli spazi dei nomi e i token associati a ciascun vettore di input.

JSON

  • Per ogni record di un vettore, aggiungi un campo chiamato restricts per contenere un array di oggetti, ognuno dei quali è uno spazio dei nomi.

    • Ogni oggetto deve avere un campo denominato namespace. Questo campo è lo spazio dei nomi TokenNamespace.namespace.
    • Il valore del campo allow, se presente, è un array di stringhe. Questo array di stringhe è l'elenco TokenNamespace.string_tokens.
    • Il valore del campo deny, se presente, è un array di stringhe. Questo array di stringhe è l'elenco TokenNamespace.string_denylist_tokens.

Di seguito sono riportati due record di esempio in formato 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"]}]}
  • Per ogni record di un vettore, aggiungi un campo denominato numeric_restricts per contenere un array di oggetti, ognuno dei quali è una limitazione numerica.

    • Ogni oggetto deve avere un campo denominato namespace. Questo campo è lo spazio dei nomi NumericRestrictNamespace.namespace.
    • Ogni oggetto deve avere uno dei seguenti valori: value_int, value_float e value_double.
    • Ogni oggetto non deve avere un campo denominato op. Questo campo è destinato solo alla query.

Di seguito sono riportati due record di esempio in formato 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

I record Avro utilizzano il seguente schema:

{
  "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

  • Limitazioni token

    • Per ogni record vettoriale, aggiungi coppie di formato name=value separate da virgole per specificare le limitazioni dello spazio dei nomi del token. Lo stesso nome può essere ripetuto se ci sono più valori in uno spazio dei nomi.

      Ad esempio, color=red,color=blue rappresenta questo TokenNamespace:

      {
        "namespace": "color"
        "string_tokens": ["red", "blue"]
      }
      
    • Per ogni record vettoriale, aggiungi coppie di formato separate da virgole name=!value per specificare il valore escluso per le restrizioni dello spazio dei nomi del token.

      Ad esempio, color=!red rappresenta questo TokenNamespace:

      {
        "namespace": "color"
        "string_blacklist_tokens": ["red"]
      }
      
  • Limitazioni numeriche

    • Per ogni record vettoriale, aggiungi coppie di formato #name=numericValue separate da virgole con il suffisso del tipo numerico per specificare le limitazioni di spazio dei nomi numerici.

      Il suffisso del tipo di numero è i per int, f per numero in virgola mobile e d per doppio. Lo stesso nome non deve essere ripetuto poiché dovrebbe essere associato un singolo valore per spazio dei nomi.

      Ad esempio, #size=3i rappresenta questo NumericRestrictNamespace:

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

      #ratio=0.1f rappresenta questo NumericRestrictNamespace:

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

      #weight=0.3d rappresenta questo NumericRestriction:

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

Passaggi successivi