O que um vetor guarda

Prévia grátis 5 min de leitura

Dois cursos já trataram o embedding como um dado pronto: entra texto, saem 1024 floats, e vetores próximos indicam textos relacionados. Funcionou, e a pergunta interessante nem chegou a ser feita.

Por que isso funciona? Nada em [0.021, -0.113, 0.008, ...] lembra significado.

As representações que vieram antes

O jeito mais antigo de transformar uma palavra em vetor é dar a cada palavra do vocabulário uma dimensão própria e ligar só essa:

vocabulário: [gato, cachorro, assinatura, cobrança]

"gato"       →  [1, 0, 0, 0]
"cachorro"   →  [0, 1, 0, 0]
"assinatura" →  [0, 0, 1, 0]

Isso é codificação one-hot. É honesta e inútil para busca. Qualquer par de palavras distintas fica à mesma distância: gato está tão longe de cachorro quanto de assinatura. A representação não traz nada que a lista do vocabulário já não tivesse.

O bag-of-words leva a ideia para documentos contando as palavras. O BM25 refina essa contagem. Como compara as próprias palavras, a busca lexical vai tão bem em termos exatos. Só que a cegueira continua. "cancelar minha assinatura" e "parar de ser cobrado" não têm nenhuma palavra em comum, então os vetores são ortogonais: matematicamente, tão sem relação quanto dois documentos podem ser.

A dimensionalidade também é brutal. Um vocabulário realista tem centenas de milhares de palavras, e cada documento vira um vetor com centenas de milhares de números, quase todos zero.

Deixe o modelo aprender os números

Um embedding denso abandona a ideia de que cada dimensão corresponde a uma palavra. No lugar dela:

  • O vetor é curto: de 256 a 4096 números, contra 300.000.
  • Toda dimensão é usada para toda entrada; nada fica quase todo zerado.
  • Nenhuma dimensão tem nome. Os valores são aprendidos, não atribuídos.

Esse último ponto costuma confundir, então vale dizer com todas as letras: a dimensão 42 não é "formalidade" nem "fala de dinheiro". Às vezes alguém encontra uma direção interpretável, mas ninguém pediu ao modelo que criasse uma. O treinamento produz um espaço em que as distâncias carregam significado. Os eixos em si são só uma base arbitrária desse espaço.

flowchart TB
  subgraph Sparse["One-hot / bag-of-words"]
    S1["300.000 dimensões"]
    S2["Atribuídas: uma palavra por dimensão"]
    S3["Palavras sem relação ficam equidistantes"]
  end
  subgraph Dense["Embedding aprendido"]
    D1["1.024 dimensões"]
    D2["Aprendidas: nenhuma dimensão tem nome"]
    D3["Significados relacionados caem perto"]
  end

Significado como geometria

Pense num mapa do Brasil. As coordenadas do Recife são dois números que, sozinhos, não dizem nada sobre a cidade. Eles só fazem sentido ao lado das coordenadas de outras cidades. O mapa é útil porque cidades próximas na realidade ficam próximas no papel.

Um espaço de embeddings funciona igual, com mil eixos em vez de dois. "cancelar minha assinatura" e "como paro de ser cobrado" não têm palavra em comum e mesmo assim ficam perto uma da outra. O modelo foi treinado com dados em que frases assim apareciam como equivalentes.

Daí vem a limitação que você viu no curso de RAG. O mapa põe o Rio perto de Niterói, mas não diz qual das duas vale a visita. Da mesma forma, "o plano Pro inclui logs de auditoria" e "o plano Pro não inclui logs de auditoria" tratam do mesmo assunto e caem quase no mesmo lugar. A geometria registra o assunto de um texto. Se ele é verdadeiro, ela não sabe.

Por que mais dimensões comportam mais distinções

Com duas dimensões dá para arrumar um punhado de conceitos de modo que os relacionados fiquem juntos. Com uma terceira, essas relações continuam lá e ainda sobra um eixo novo de variação. Cada dimensão abre espaço para mais uma distinção sem bagunçar as que já existem.

O espaço de alta dimensão tem uma esquisitice que vale conhecer: quanto mais dimensões, mais perto de perpendiculares ficam dois vetores sorteados ao acaso. Isso é bom para a capacidade: mil dimensões têm espaço para uma quantidade enorme de direções quase independentes, então muitas distinções cabem sem atrapalhar umas às outras. Só que modelos treinados não espalham o texto ao acaso. Cada modelo coloca os pares sem relação numa faixa própria de pontuação, perto de zero em alguns e em 0,7 ou mais em outros (a família e5, por exemplo). Só a ordem das pontuações tem significado, e por isso o curso de pgvector calculou os limiares para cada modelo e corpus em vez de chutar.

O que este curso cobre

  1. O que um vetor guarda (você está aqui).
  2. De texto a um vetor: tokens, contexto e pooling.
  3. Como modelos de embedding são treinados: aprendizado contrastivo.
  4. Bi-encoders e cross-encoders: a arquitetura por trás de recuperar e reordenar.
  5. Dimensões, treinamento Matryoshka e truncamento.
  6. Como escolher um modelo, e por que os leaderboards enganam.
  7. Adaptação ao seu domínio, e quando fine-tuning é a ferramenta errada.

A seguir: o que acontece entre a sua frase e aqueles 1024 números.

Aula 1 de 7 · grátis

Continue com a aula 2

De texto a um vetor: tokens e pooling

Percorre tokenização, contextualização e pooling, e mostra como cada estágio explica problemas com trechos longos, códigos de erro e truncamento.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...