Filtra corrispondenze vettoriali

Nella ricerca vettoriale, puoi limitare le ricerche di corrispondenze vettoriali a un sottoinsieme dell'indice utilizzando le regole booleane. I predicati booleani indicano Vector Search quali vettori nell'indice ignorare. In questa pagina troverai scopri come funziona l'applicazione di filtri, consulta esempi e modalità di esecuzione di query in modo efficiente i dati in base alla somiglianza vettoriale.

Con la ricerca vettoriale puoi limitare i risultati in base a valori categorici e numerici limitazioni. Aggiungere limitazioni o applicare filtri i risultati dell'indice sono utili per come gli esempi seguenti:

  • Maggiore pertinenza dei risultati: la ricerca vettoriale è una molto utile per trovare elementi semanticamente simili. È possibile usare i filtri per rimuovere risultati non pertinenti dai risultati di ricerca, ad esempio elementi che non sono nel lingua, categoria, prezzo o intervallo di date corretti.

  • Riduzione del numero di risultati: Vector Search può restituire un numero elevato di risultati, soprattutto per set di dati di grandi dimensioni. È possibile usare i filtri per ridurre il numero di risultati a un numero più gestibile, continuando a restituire i risultati più pertinenti.

  • Risultati segmentati. I filtri possono essere utilizzati per personalizzare i risultati di ricerca. in base alle esigenze e alle preferenze personali dell'utente. Ad esempio, un utente potrebbe volere per filtrare i risultati in modo da includere solo gli elementi con una valutazione elevata nel o che rientrano in una specifica fascia di prezzo.

Attributi vettoriali

In una ricerca di somiglianze vettoriali in un database di vettori, ogni vettore viene descritti da zero o più attributi. Questi attributi sono noti come token per limitazioni del token e valori per le limitazioni numeriche. È possibile applicare queste limitazioni da ognuna delle varie categorie di attributi, note anche come spazi dei nomi.

Nell'applicazione di esempio seguente, i vettori sono contrassegnati con color, un price e shape:

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

Specificare gli attributi vettoriali

  • 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 "colore" nel campo restricts.
  • Per specificare limitazioni numeriche per un oggetto, prendi nota dello spazio dei nomi e del valore il 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, mentre il valore doppio deve essere specificato in value_double. Per un determinato tipo di numero deve essere utilizzato un solo tipo nello spazio dei nomi.

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

Query

  • Le query esprimono un operatore logico AND tra gli 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 di database che soddisfano (red || blue) && (square || circle).
  • Una query che specifica {color: red}, corrisponde a tutti gli oggetti red di qualsiasi di tipo, senza limitazioni a shape.
  • Le limitazioni numeriche nelle query richiedono namespace, uno dei valori numerici da value_int, value_float, value_double e operatore op.
  • L'operatore op è uno tra LESS, LESS_EQUAL, EQUAL, GREATER_EQUAL e GREATER. Ad esempio, se viene utilizzato l'operatore LESS_EQUAL, i punti dati vengono sono idonei se il loro valore è inferiore o uguale a quello utilizzato nella query.

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

{
  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 contenente il token nella lista bloccata. Se lo spazio dei nomi di una query ha solo i token nella lista bloccata, tutti i punti non esplicitamente inseriti nella lista bloccata, corrispondono esattamente al valore nello 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 specifica il 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 di tutto. Ad esempio: D:{} corrisponde a DB:{color:red}.
  • Gli spazi dei nomi dei punti dati vuoti non sono caratteri jolly per una corrispondenza con tutti. Ad esempio: D:{color:red} non corrisponde a DB:{}.

    Punti di query e database.

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

Per informazioni su come strutturare complessivamente i dati di input, consulta Dati di input formato e struttura.

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

JSON

  • Per il record di ogni vettore, aggiungi un campo chiamato restricts, a contengono 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 è Elenco TokenNamespace.string_tokens.
    • Il valore del campo deny, se presente, è un array di stringhe. Questo array di stringhe è 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], "sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1, 4]},
"restricts": [{"namespace": "class", "allow": ["dog", "pet"]},{"namespace": "category", "allow":
["canine"]}]}
  • Per il record di ogni vettore, aggiungi un campo chiamato numeric_restricts, a contengono 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 è riservato 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], "sparse_embedding": {"values": [0.1, 0.2], "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": "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

  • Limitazioni token

    • Per ogni record del vettore, aggiungi coppie di formati separate da virgole name=value per specificare le limitazioni dello spazio dei nomi del token. Lo stesso nome può essere ripetuto se sono presenti 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 del vettore, aggiungi coppie di formati separate da virgole name=!value per specificare il valore escluso per le limitazioni dello spazio dei nomi dei token.

      Ad esempio, color=!red rappresenta questo TokenNamespace:

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

    • Per ogni record del vettore, aggiungi coppie di formati separate da virgole #name=numericValue con suffisso del tipo numerico per specificare valori numerici limitazioni dello spazio dei nomi.

      Il suffisso del tipo di numero è i per int, f per numero in virgola mobile e d per il doppio. Lo stesso nome non deve essere ripetuto come dovrebbe un singolo valore associato per ogni 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
      }
      
    • Ecco un esempio di punto dati con id: "6", embedding: [7, -8.1], sparse_embedding: {values: [0.1, -0.2, 0.5], dimensions: [40, 901, 1111]}}, tag di crowding di test, lista consentita di token di color: red, blue, lista bloccata di token di color: purple e limitazione numerica di ratio con numero in virgola mobile 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
      

Passaggi successivi