33 pontos por GN⁺ 2025-01-16 | 2 comentários | Compartilhar no WhatsApp
  • 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

 
mhj5730 2025-01-20

Que material incrível.

 
GN⁺ 2025-01-16
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"

    • Nos exemplos de pgvector-python, um modelo cross-encoder é usado para fazer o re-ranking
    • Também é possível usar um modelo de linguagem para reordenar, mas ele pode ter desempenho inferior ao de um modelo especializado em re-ranking
    • Na abordagem RAG da Azure, é usado o AI Search semantic ranker que o Bing utiliza para reordenar resultados de busca
  • Vetores de palavras resolvem o problema de duas palavras poderem estar fortemente relacionadas mesmo sem aparecerem no mesmo contexto

    • "Python" e "Ruby" podem não aparecer no mesmo contexto, mas "scripting" pode ser encontrado no contexto de ambos
    • No entanto, muitas vezes isso não funciona bem por causa da maldição da dimensionalidade
    • É apresentada a ideia de representar embeddings de palavras como vértices em vez de vetores
  • Nos EUA, o word2vec pode considerar espresso e cappuccino quase idênticos, mas na Itália não

    • A melhor abordagem é comparar diretamente os dois itens usando uma consulta ao LLM
    • Um LLM pode considerar "Onde deixei minha carteira?" e "Onde deixei minhas chaves?" muito semelhantes
  • A similaridade por cosseno é usada na maior parte da busca semântica baseada em deep learning

    • Modelos como SentenceTransformers são treinados para usar similaridade por cosseno
    • Modelos como CLIP também usam similaridade por cosseno para representações vetoriais de imagens
  • Comparar diretamente dois itens usando uma consulta ao LLM é a abordagem mais poderosa

    • Cross-encoder é uma solução com ótimo desempenho e rápida
  • HyDE é um método que gera uma resposta hipotética para a pergunta e compara a similaridade

    • Uma abordagem melhor é padronizar o formato dos chunks e gerar a resposta hipotética no mesmo formato
  • Similaridade por cosseno e RAG top-k parecem ultrapassados

    • A similaridade por cosseno é apenas uma propriedade acidental dos dados
    • Modelos de embedding mais novos são treinados para usar similaridade por cosseno como medida de similaridade
  • 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

    • É possível melhorar a modelagem dos dados de treinamento deixando o modelo definir embeddings, formato e processo de busca
  • 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