Pular para o conteúdo

IA: Pesquisa vetorial ordena as linhas de uma tabela consoante a proximidade da sua coluna Vector a um vetor de consulta e escreve as linhas mais próximas — com a distância que as classificou — numa tabela de destino. Se lhe indicar vários vetores de consulta, cada um recebe o seu próprio conjunto de correspondências, tudo numa única passagem pela tabela de origem e tudo numa única tabela de saída.

A pesquisa é exata. Cada linha que passa o filtro do passo é comparada com todos os vetores de consulta, pelo que as correspondências são as linhas verdadeiramente mais próximas e não uma aproximação — e o trabalho cresce com o número de linhas analisadas multiplicado pelo número de vetores de consulta. Não existe nenhum índice vetorial para construir, ajustar ou usar como alternativa.

todas as linhas filtradas são comparadas — sem índice, sem aproximaçãovetores de consultatabela a pesquisarfiltrada primeirodistânciamenor é mais próximotabela de destinomelhores resultados por consultauma linha cuja distância não pode ser medida fica de fora, não é classificada em primeiro lugar
As linhas são filtradas, depois cada linha restante é pontuada em relação a cada vetor de consulta e as mais próximas são mantidas. Restringir o filtro é o que torna rápida uma tabela grande, porque não há índice a que recorrer.
  • Tabela a pesquisar — a tabela cujos vetores armazenados são pesquisados.
  • Tabela de destino — a tabela onde as correspondências são escritas.
  • Coluna de vetores — a coluna Vector da tabela a pesquisar em relação à qual a distância é medida. Qualquer outro tipo de dados é recusado, nomeando a coluna e o tipo que ela realmente contém.
  • Métrica de distância — Cosseno ou Euclidiana (L2). O cosseno mede o ângulo entre dois vetores e ignora as suas magnitudes, o que é o pretendido para incorporações de texto; a euclidiana mede a distância em linha reta e tem em conta a magnitude. Em ambas, uma distância menor significa uma linha mais próxima. O cosseno é a predefinição.
  • Correspondências por consulta — quantas linhas mais próximas manter para cada vetor de consulta. A predefinição é 10.

O separador Vetores de consulta aceita uma matriz JSON com uma entrada por consulta, cada uma com um id e um vector:

[
{"id": "q1", "vector": [0.1, 0.2, 0.3]},
{"id": "q2", "vector": [0.4, 0.5, 0.6]}
]

Cada consulta devolve o seu próprio conjunto de correspondências, e o id é o que as identifica na saída. Os ids têm de ser únicos, todos os valores têm de ser números finitos e todos os vetores de consulta têm de ter o mesmo número de valores que os vetores armazenados — só é possível definir uma distância entre vetores de igual largura. Uma divergência é recusada, nomeando a consulta, o número de valores que contém e a largura que a coluna tem ou declara.

Um filtro restringe as linhas que são candidatas. As linhas são filtradas antes de serem classificadas, pelo que as correspondências são as linhas mais próximas que passam o filtro — e não as linhas mais próximas no total, filtradas depois. Este é o principal controlo sobre a quantidade de trabalho que o passo faz; consulte Dimensionar uma pesquisa.

Cada correspondência é escrita como uma linha com as colunas que selecionou no separador Seleção de dados da tabela, mais duas colunas calculadas cujos nomes controla:

  • Coluna do nome da consulta — o id do vetor de consulta a que esta linha responde. A predefinição é query_id.
  • Coluna de distância — a distância medida entre a correspondência e esse vetor de consulta. A predefinição é distance. É também a chave de classificação.

O nome da consulta vem primeiro na saída, seguem-se as colunas que selecionou e a distância vem em último. Os nomes das colunas de saída têm de ser únicos.

Uma linha cuja distância não pode ser medida é excluída das correspondências em vez de ser devolvida como se fosse a mais próxima. O caso que encontrará é o de um vetor cuja magnitude excede o intervalo de um número de vírgula flutuante de 32 bits: não é devolvida nenhuma distância mensurável para ele e, como nada disponível ordena uma distância não mensurável em último lugar, incluir uma linha dessas colocaria no topo de cada resultado as linhas sobre as quais a pesquisa menos sabe.

Execute o fluxo de trabalho com o Modo de diagnóstico ativado para ver a contagem. O registo do fluxo de trabalho indica então quantas linhas cada consulta deixou de fora, ou declara que o passo mediu todas as linhas que pesquisou. Obter essa contagem custa uma segunda passagem pela tabela, pelo que só é cobrada quando a pede; com o Modo de diagnóstico desativado, o registo declara que as linhas não mensuráveis são deixadas de fora por conceção e remete-o para o Modo de diagnóstico para obter o número.

Um vetor armazenado com um valor em falta dentro da matriz é um caso diferente: não é possível medir nenhuma distância em relação a uma matriz que contenha um, pelo que a pesquisa é recusada de imediato, nomeando a coluna, em vez de devolver silenciosamente um resultado parcial. Corrija ou remova essas linhas e execute de novo.

O custo de uma execução é o número de linhas candidatas multiplicado pelo número de vetores de consulta, e o passo recusa uma pesquisa cujo total exceda dez mil milhões de medições de distância — indicando o número de linhas, o número de consultas e o limite — em vez de iniciar um trabalho que não consegue terminar. Duas coisas mantêm uma pesquisa bem dentro desse limite:

  • Filtre para a fatia que interessa. Restrinja os candidatos a uma entidade, um período ou um conjunto de documentos em vez de analisar um corpus inteiro para responder a uma pergunta sobre parte dele.
  • Divida a tabela pela dimensão por que filtra sempre e pesquise a tabela relevante. Reduzir o número de candidatos é muito mais eficaz do que qualquer outra coisa disponível aqui.

Declarar uma Largura do vetor na coluna também ajuda: com ela declarada, o passo obtém a largura da declaração em vez de amostrar uma linha para a descobrir. Consulte Tipo de dados Vector.

Uma coluna Vector é recusada como chave de junção, como coluna de agrupamento e como alvo de agregação — neste passo e em todos os outros. A mensagem nomeia a coluna e a função em que foi usada, tanto quando guarda o passo como quando um passo guardado anteriormente é executado. Junte e agrupe antes pelas chaves de negócio junto ao vetor. Transportar um vetor através de um passo como coluna de saída normal é permitido, tal como contar linhas e contar valores distintos.

  • Tipo de dados Vector — declarar uma coluna Vector, definir a sua largura e carregar incorporações nela
  • Spatial Find Nearest — a mesma forma de vizinho mais próximo sobre geometria em vez de incorporações
  • Table Lookup — traga colunas descritivas de volta para as linhas correspondidas
  • Import Parquet — carregue incorporações a partir de um ficheiro Parquet