Nesta página, descrevemos como escolher entre as funções de distância vetorial fornecidas no Spanner para medir a semelhança entre embeddings vetoriais.
Depois de gerar embeddings a partir dos dados do Spanner, é possível realizar uma pesquisa por similaridade usando funções de distância vetorial. A tabela a seguir descreve as funções de distância vetorial no Spanner.
Função | Descrição | Fórmula | Relação com similaridade crescente |
---|---|---|---|
Produto escalar | Calcula o cosseno do ângulo \(\theta\) multiplicado pelo produto das magnitudes vetoriais correspondentes. | \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) | Aumentos |
Distância do cosseno | A função de distância do cosseno subtrai a semelhança de cosseno de um (cosine_distance() = 1 - cosine similarity ). A similaridade do cosseno mede o cosseno do ângulo \(\theta\) entre dois vetores.
|
1 - \(\frac{a^T b}{|a| \cdot |b|}\) | Diminui |
Distância euclidiana | Mede a distância em linha reta entre dois vetores. | \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) | Diminui |
Escolher uma medida de similaridade
Dependendo se todos os embeddings vetoriais estão ou não normalizados, é possível determinar qual medida de similaridade usar para encontrar a similaridade. Um embedding de vetor normalizado tem uma magnitude (comprimento) de exatamente 1,0.
Dados normalizados
Se você tiver um conjunto de dados em que todos os embeddings vetoriais são normalizados, as três funções fornecerão os mesmos resultados de pesquisa semântica. Em essência, embora cada
função retorne um valor diferente, esses valores são classificados da mesma maneira. Quando os embeddings são normalizados, DOT_PRODUCT()
é geralmente o mais eficiente em termos computacionais, mas a diferença é insignificante na maioria dos casos. No entanto, se o
aplicativo for altamente sensível ao desempenho, o DOT_PRODUCT()
poderá ajudar no
ajuste.
Dados não normalizados
Se você tiver um conjunto de dados em que os embeddings de vetores não são normalizados, não é matematicamente correto usar DOT_PRODUCT()
como uma função de distância, porque o produto escalar como uma função não mede a distância. Dependendo de como os embeddings foram gerados e do tipo de pesquisa preferido, a distância do cosseno ou a função de distância euclidiana podem produzir resultados de pesquisa subjetivamente melhores do que a outra função.
Não tenho certeza se os dados são normalizados ou não normalizados
Se você não tiver certeza se os dados estão normalizados ou não e quiser usar
DOT_PRODUCT()
, recomendamos o uso de COSINE_DISTANCE()
.
COSINE_DISTANCE()
é como DOT_PRODUCT()
com normalização integrada.
A semelhança medida usando os valores de COSINE_DISTANCE()
varia de -1
a 1
. Um resultado próximo de 0
indica que os vetores são muito semelhantes.
A seguir
- Saiba mais sobre como executar uma pesquisa de vetor encontrando o vizinho k-mais próximo.
- Saiba como exportar embeddings para a Vertex AI Vector Search.
- Saiba mais sobre as funções
COSINE_DISTANCE()
,EUCLIDEAN_DISTANCE()
eDOT_PRODUCT()
do GoogleSQL. - Saiba mais sobre as funções PostgreSQL
spanner.cosine_distance()
,spanner.euclidean_distance(), and spanner.dot_product()
.