- Cientistas de dados transformam tudo em vetores. Essa é a linguagem da IA
- Mas aplicar similaridade de cosseno cegamente pode levar na direção errada
- Este texto explica como usar similaridade de forma mais intencional para obter resultados melhores.
Embeddings
- Embeddings são representações vetorizadas de dados, muito úteis para representar relações entre entidades ou encontrar itens semelhantes
- Por exemplo, "brother" e "sister" não têm relação como IDs brutos, mas, quando vetorizados, podem expressar uma relação semântica
- Vetores são usados como estrutura de entrada para modelos de machine learning ou, por si só, em busca por similaridade
- Embeddings de sentenças baseados em LLM são hoje um dos casos de uso mais populares de embeddings
- Esse poder exige responsabilidade com segurança de dados e uso intencional
Exemplo: comparando frases com similaridade de cosseno
- Comparação de três frases
- A: "Python can make you rich."
- B: "Python can make you itch."
- C: "Mastering Python can fill your pockets."
- Comparação baseada em caracteres
- Ao comparar as strings brutas, A e B diferem em 2 caracteres, enquanto A e C diferem em 21 caracteres
- Mas, semanticamente, A e C são mais semelhantes (ambas falam de dinheiro)
- Comparação baseada em vetores
- Usando OpenAI text-embedding-3-large para gerar vetores de embedding como estes:
- A:
[-0.003738, -0.033263, -0.017596, 0.029024, -0.015251, ...]
- B:
[-0.066795, -0.052274, -0.015973, 0.077706, 0.044226, ...]
- C:
[-0.011167, 0.017812, -0.018655, 0.006625, 0.018506, ...]
- Número de dimensões do vetor: 3072 (longo, mas pode ser reduzido sem perda de qualidade)
- Cálculo da similaridade de cosseno
- A e C: 0.750 (semanticamente semelhantes)
- A e B: 0.576 (semelhantes na forma escrita)
- Resultado: o significado é um fator de similaridade mais importante do que a ortografia
O que é similaridade de cosseno?
- Similaridade de cosseno (cosine similarity) mede a semelhança entre dois vetores calculando o cosseno do ângulo entre eles
- Como os vetores existem em um espaço de alta dimensão, a intuição geométrica costuma falhar
- Matematicamente, é o produto escalar (dot product) de vetores normalizados
- Principais características:
- Vetores idênticos resultam em 1
- Vetores aleatórios tendem a ficar próximos de 0 (efeito de média em alta dimensão)
- O valor resultante fica entre -1 e 1
- Essa simplicidade pode ser enganosa
- O fato de o valor estar entre 0 e 1 não significa que ele seja uma probabilidade ou uma escala semanticamente significativa
- Ex.: um valor de 0.6 pode não significar alta similaridade
- Valores negativos raramente representam oposição semântica
- Na maioria das vezes, são resultados sem sentido ou próximos de ruído
- Ao usar Glove(
glove.6B.300d) para buscar palavras semelhantes a "dog":
- As palavras mais próximas são previsíveis
- As mais distantes frequentemente produzem resultados sem sentido
- Similaridade de cosseno é como uma "fita adesiva" versátil: simples e rápida para comparar vários tipos de vetores
- Dá para comparar imagens, texto, áudio, código etc.
- Mas continua sendo um remendo, que pode esconder problemas mais profundos
- Ex.: como consertar um encanamento com fita adesiva, não é algo muito confiável nem permanente
- Às vezes parece funcionar bem, mas, quando falha, é difícil entender o motivo
- Isso costuma levar a soluções improvisadas, que podem criar novos problemas
Relação entre similaridade de cosseno e coeficiente de correlação
- O coeficiente de correlação de Pearson é calculado em três etapas:
- Subtrair a média para centralizar os dados
- Normalizar os vetores para vetores unitários
- Calcular o produto escalar (dot product) entre os dois vetores
- Quando os vetores estão centralizados e normalizados:
- coeficiente de correlação de Pearson = similaridade de cosseno = produto escalar
- Forma prática de uso
- Não se centraliza nem normaliza os vetores a cada comparação em pares
- Em vez disso, faz-se o pré-processamento antes e depois calcula-se apenas o produto escalar
- Se é possível usar similaridade de cosseno, o coeficiente de correlação de Pearson também pode ser usado da mesma forma
- Na prática, as duas medidas podem ser usadas em contextos equivalentes
Problemas ao usar similaridade de cosseno como medida de similaridade
- Usar similaridade de cosseno como objetivo de treino de um modelo de machine learning é matematicamente válido
- O problema aparece em áreas que vão além da adequação matemática da similaridade de cosseno:
- quando a função de perda usada no treinamento do modelo não é a similaridade de cosseno
- quando o objetivo de treinamento difere do que a aplicação real precisa
- Em geral, modelos são treinados com vetores não normalizados:
- Ex.: previsão de probabilidade baseada em produto escalar (dot product) e função de perda logística
- Alguns modelos aprendem a aproximar itens da mesma classe minimizando distância euclidiana
- A normalização fornece propriedades matemáticas (como limitar o resultado entre -1 e 1), mas isso é um "remendo"
- Só é seguro usar diretamente modelos treinados com similaridade de cosseno ou funções diretamente derivadas dela
- Mesmo quando o modelo foi treinado explicitamente com similaridade de cosseno, a definição de similaridade continua ambígua:
- crítico literário: compartilham tema
- bibliotecário: pertencem ao mesmo gênero
- leitor: provocam reação emocional parecida
- diagramador: têm número de páginas e formato semelhantes
- Similaridade de cosseno simplifica várias definições em um único número, o que pode induzir ao erro
- Exemplo: "espresso" e "cappuccino"
- O word2vec trata essas duas palavras como quase idênticas (na perspectiva dos EUA)
- Mas, na Itália, elas não seriam consideradas a mesma coisa
Quando a similaridade de cosseno falha
- Exemplo simples: uma pergunta para encontrar chaves
- Pergunta: "What did I do with my keys?"
- Frases comparadas:
- "I left them in my pocket"
- "They are on the table"
- "What did I put my wallet?"
- "What I did to my life?"
- Problema
- Resultado usando similaridade de cosseno:
- A frase mais próxima não é uma resposta adequada, mas outra pergunta ("What I did to my life?")
- Ela se apoia na semelhança estrutural da frase, e não na relevância semântica
- Já frases relacionadas a Python têm similaridade quase 0, refletindo corretamente que são irrelevantes
- Limitações no mundo real
- Em aplicações reais, lidamos com milhares de documentos
- Em datasets grandes que excedem a janela de contexto, o método fica ainda mais sensível a ruído
- Quanto maior o dataset, mais a pontuação de similaridade passa a funcionar como uma roleta em alta dimensão
Que alternativas usar no lugar da similaridade de cosseno?
A abordagem mais poderosa
- Usar consultas com LLM:
- Usar um modelo de linguagem forte para comparar dois itens
- Ex.: "Is {sentence_a} a plausible answer to {sentence_b}?"
- Com um LLM, é possível fazer comparações significativas:
- distinguir uma pergunta simples de uma resposta
- fornecer o resultado em formato estruturado, como JSON
- Porém, em datasets grandes, isso é ineficiente e caro
Otimização de embeddings
- Gerar embeddings específicos para a tarefa:
- Fine-tuning para ajustar os pesos de um modelo existente
- Transfer Learning para aproveitar o conhecimento do modelo e criar embeddings novos e mais focados
- Similaridade simétrica:
- Representar no espaço vetorial a pergunta "A e B são semelhantes?"
- Reduzir dimensões desnecessárias e manter apenas características relevantes
- Similaridade assimétrica:
- Ex.: representar como probabilidade se "o documento B é a resposta correta para a pergunta A"
- Transformar consulta e chave em espaços especializados distintos
Prompt engineering
- Adicionar prompts para definir contexto:
- Ex.: "Nationality of {person}" para enfatizar contexto relacionado à nacionalidade
- Em vez de prompts simples, usar frases específicas:
- "This is a country that has produced many influential historical figures, including {person}"
- A qualidade do resultado melhora bastante, mas não fica perfeita
Reescrita de texto e extração de contexto
- Pré-processar o texto antes do embedding:
- Usar um prompt simples como "resuma o texto a seguir em inglês padrão, em até 200 palavras" para remover similaridades superficiais
- Ignorar elementos formais desnecessários (erros de digitação, formatação etc.) e focar no conteúdo
- Gerar contexto estruturado:
- Resumir conversas com clientes para extrair requisitos e problemas com clareza:
- "Resuma a conversa em no máximo 10 tópicos em Markdown"
- Converter páginas para o mesmo formato também permite um matching mais preciso
Conclusão
- Esses métodos alternativos ajudam a compensar as limitações da similaridade de cosseno e fornecem resultados mais confiáveis
- Escolha e aplique a abordagem mais adequada ao contexto do projeto
Resumo
- Limites da similaridade de cosseno:
- Similaridade de cosseno fornece valores entre -1 e 1, mas isso não deve ser tratado como probabilidade
- A maioria dos modelos não é treinada para otimizar similaridade de cosseno, e os resultados são apenas correlações sem garantia
- Mesmo que o modelo tenha aprendido similaridade de cosseno, é preciso entender se essa definição de similaridade realmente corresponde ao que precisamos
- Como usar similaridade vetorial de forma eficaz:
- Treinar embeddings especializados para os seus dados
- Projetar prompts focados nos aspectos relevantes
- Limpar e padronizar o texto antes de gerar embeddings
2 comentários
Que material incrível.
Opiniões do Hacker News
Em aplicações RAG que usam similaridade por cosseno, é recomendável reordenar os resultados usando um "semantic re-ranker" ou um "modelo de re-ranking L2"
pgvector-python, um modelo cross-encoder é usado para fazer o re-rankingVetores de palavras resolvem o problema de duas palavras poderem estar fortemente relacionadas mesmo sem aparecerem no mesmo contexto
Nos EUA, o word2vec pode considerar espresso e cappuccino quase idênticos, mas na Itália não
A similaridade por cosseno é usada na maior parte da busca semântica baseada em deep learning
Comparar diretamente dois itens usando uma consulta ao LLM é a abordagem mais poderosa
HyDE é um método que gera uma resposta hipotética para a pergunta e compara a similaridade
Similaridade por cosseno e RAG top-k parecem ultrapassados
Após tentar a abordagem RAG, houve frustração, e a ideia é que ela deveria ser estruturada para que o modelo pudesse executar RAG durante o treinamento
Em gráficos 3D e física, importância e precisão são claras, mas em machine learning o espaço vetorial representa coisas demais, então o uso do produto escalar parece ambíguo