Filtros na correspondência de vetores

Ao realizar a correspondência vetorial no Vertex Matching Engine, é possível restringir as pesquisas a um subconjunto do índice usando regras booleanas. Especifique predicados booleanos que informam ao mecanismo de correspondência quais vetores no índice devem ser ignorados das pesquisas de similaridade.

Atributos vetoriais

Considere um exemplo de aplicativo que está fazendo uma pesquisa de similaridade vetorial em um banco de dados de vetores. Cada vetor também pode ser descrito por zero ou mais atributos (ou tokens) de cada uma das várias categorias de atributos (ou namespaces).

Neste aplicativo de exemplo, os vetores são marcados com um color e um shape:

  • color e shape são namespaces.
  • red e blue são tokens do namespace color.
  • square e circle são tokens do namespace shape.

Especificar atributos vetoriais

Para especificar os atributos de vetor no aplicativo de exemplo:

  • Para especificar um "círculo vermelho": {color: red}, {shape: circle}.
  • Para especificar um "quadrado vermelho e azul": {color: red, blue}, {shape: square}.
  • Para especificar um objeto sem cor, basta não ignorar o namespace "color" em restrições.

Consulte a seção "Formato de dados de entrada para especificar atributos e namespaces" para o esquema de especificação desses dados.

Consultas

  • Uma consulta que especifica **{color: red, blue}, {shape: square, circle}** corresponde a todos os pontos do banco de dados que satisfazem, **(red || blue) && (square || circle)**. As consultas expressam um AND em namespaces e um OR em cada namespace.
  • Uma consulta que especifica, **{color: red}**, corresponde a todos os objetos **red** de qualquer tipo, sem restrição em **shape**.

Lista de bloqueio

Para cenários mais avançados, oferecemos suporte a uma forma especial de negação, conhecida como tokens de lista de bloqueio. Quando uma consulta nega um token, as correspondências são excluídas com qualquer ponto de dados que tenha o token da lista de proibições. Observe que, se um namespace de consulta tiver apenas tokens de lista de negação, todos os pontos que não foram explicitamente incluídos na lista serão correspondentes, da mesma forma que um namespace vazio corresponde a todos os pontos.

Os pontos de dados também podem negar um token, excluindo correspondências com qualquer consulta que especifique esse token.

Veja alguns exemplos para esclarecer os recursos de filtragem. Vamos definir os seguintes pontos de dados com os tokens especificados:

  1. {} // conjunto vazio corresponde a tudo

vermelho

// apenas um token 'vermelho'

blue

// apenas um token "azul"

laranja

// apenas um token "laranja"

vermelho, azul

// vários tokens

vermelho, azul

// negar o token "azul"

vermelho, azul, !azul

// um caso extremo estranho

blue

// somente negação (semelhante a empty-set)

Esse é o comportamento intuitivo que a maioria das pessoas espera do sistema.

  • Os namespaces de consulta vazios são caracteres curingas correspondentes. Por exemplo, Q:{} corresponde a DB:{color:red}
  • Os namespaces de pontos de dados vazios não são. Por exemplo, Q:{color:red} não corresponde a DB:{}.

Gráfico que mostra pontos de consulta e banco de dados

Especificar namespaces e tokens nos dados de entrada

Para saber como estruturar os dados de entrada de maneira geral, consulte Formato e estrutura de dados de entrada.

Nesta seção, descrevemos como especificar os namespaces e tokens associados a cada vetor de entrada.

JSON

  • Para cada registro de vetor, adicione um campo chamado "restricts", que deve conter uma matriz de objetos e cada um deles será um namespace.

    • Cada objeto precisa ter um campo chamado "namespace". Trata-se do TokenNamespace.namespace.
    • O valor do campo "allow", se presente, precisa ser uma matriz de strings. Esta é a lista de TokenNamespace.string_tokens.
    • O valor do campo "deny", se presente, precisa ser uma matriz de strings. Esta é a lista de TokenNamespace.string_denylist_tokens.

Veja a seguir dois registros de exemplo no 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"]}]}

Avro

Os registros Avro precisam ter uma estrutura semelhante à definida no formato JSON. Especificamente, ele deve estar de acordo com o seguinte esquema:

{
   "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": "crowding_tag", "type": ["null", "string"]}]
}

A seguir