Modelos de Embeddings
O que são modelos de incorporação?
Modelos de incorporação (embedding models) mapeiam texto de comprimento variável (uma palavra, frase, parágrafo ou documento) em um vetor de comprimento fixo (uma incorporação (embedding)) de modo que a similaridade semântica (semantic similarity) no texto corresponda à similaridade geométrica no espaço vetorial (vector space). Na prática, modelos de incorporação são o “motor” por trás de:
- Busca semântica (semantic search) e recuperação (retrieval) (recuperação densa (dense retrieval))
- Agrupamento (clustering) e descoberta de tópicos
- Detecção de duplicatas / detecção de quase-duplicatas
- Recomendação e correspondência (consulta–item, usuário–conteúdo)
- Pipelines de reranqueamento (reranking pipelines) (recuperação com bi-codificador seguida de pontuação com codificador cruzado)
- Sistemas de Geração Aumentada por Recuperação (Retrieval-Augmented Generation, RAG)
Modelos de incorporação ficam na interseção entre aprendizado de representações (representation learning) e recuperação de informação (information retrieval). Se você quer a base de “como texto vira números”, veja Representação de Texto. Se você quer fundamentos de recuperação e métricas de ranqueamento, veja Recuperação de Informação e Busca Semântica.
Como incorporações de texto modernas são produzidas
Arquiteturas de codificador
A maioria dos modelos de incorporação de ponta são codificadores Transformador (Transformer) ou adaptações no estilo codificador de modelos de linguagem (language models, LMs) somente-decodificador (decoder-only). Veja Arquitetura Transformer para a mecânica subjacente.
Arquiteturas comuns usadas para incorporações:
- Bi-codificador (bi-encoder) (codificador duplo (dual encoder)): um codificador produz incorporações para consultas e documentos de forma independente. A similaridade é computada com similaridade do cosseno (cosine similarity) ou produto interno (dot product).
- Prós: indexação rápida e busca rápida por vizinho mais próximo
- Contras: menos expressivo do que modelagem conjunta
- Codificador cruzado (cross-encoder): consulta e documento são concatenados e pontuados conjuntamente.
- Prós: forte modelagem de relevância
- Contras: lento demais para pesquisar grandes corpora; usado para reranqueamento dos itens top-k recuperados
Em recuperação em produção, uma pilha típica é:
- Bi-codificador recupera candidatos top-k via busca vetorial
- Codificador cruzado reranqueia esses candidatos para a ordenação final
Agregação: transformando vetores de tokens em um único vetor
Transformadores produzem um vetor por token (token). Modelos de incorporação precisam de um único vetor por texto. Estratégias comuns de agregação (pooling):
- Agregação por média (mean pooling) sobre incorporações de tokens (frequentemente forte e estável)
- Agregação por [CLS] ([CLS] pooling) (usando um token de classificação designado)
- Agregação ponderada (weighted pooling) (por exemplo, ponderada por atenção ou mistura da última camada)
- Interação tardia (late interaction) (por exemplo, recuperação em nível de token no estilo ColBERT; um híbrido entre recuperação densa e recuperação baseada em interação)
Muitos modelos também aplicam:
- Normalização L2 (L2 normalization) (vetores de comprimento unitário) para tornar similaridade do cosseno equivalente a produto interno
- Branqueamento (whitening) / truques de normalização para reduzir anisotropia (anisotropy) (“tudo aponta na mesma direção”)
Treinando incorporações de texto: objetivos e intuição
Modelos de incorporação geralmente são treinados para satisfazer um requisito simples:
Pares positivos devem ficar próximos no espaço de incorporação; pares negativos devem ficar distantes.
Isso normalmente é obtido usando aprendizado contrastivo (contrastive learning).
Aprendizado contrastivo e a família InfoNCE / NT-Xent
Um objetivo comum é InfoNCE (também chamado de NT-Xent em configurações no estilo SimCLR). Suponha que temos um lote (batch) de tamanho B contendo pares ((x_i, y_i)) que devem corresponder (por exemplo, consulta e passagem relevante). Seja:
- (q_i = f_\theta(x_i)) a incorporação da consulta
- (d_i = g_\theta(y_i)) a incorporação do documento (frequentemente (f=g), mesmo codificador)
- (s(q, d)) a similaridade (produto interno ou similaridade do cosseno)
- (\tau) um hiperparâmetro de temperatura (temperature)
A perda para uma consulta é:
[ \mathcal{L}i = -\log \frac{\exp(s(q_i, d_i)/\tau)}{\sum{j=1}^{B} \exp(s(q_i, d_j)/\tau)} ]
O denominador trata outros documentos no lote como negativos no lote (in-batch negatives). Isso escala bem porque cada lote fornece muitos negativos “de graça”.
Pontos práticos importantes:
- Tamanho de lote maior frequentemente melhora a qualidade (mais negativos)
- Negativos difíceis (hard negatives) (não-correspondências desafiadoras) podem melhorar drasticamente a recuperação
- Temperatura (\tau) controla quão “pontuda” é a distribuição; frequentemente é ajustada
Perdas triplas e baseadas em margem
Outra família de objetivos usa tríplices explícitos ((q, d^+, d^-)):
- Perda tripla (triplet loss) incentiva (s(q,d^+) \ge s(q,d^-)+m) para margem (m).
- Útil quando você tem negativos curados, mas frequentemente menos escalável do que métodos no lote.
Perda de ranqueamento com múltiplos negativos (Multiple Negatives Ranking loss) (popular em Sentence-Transformers)
Uma formulação prática amplamente usada é “MultipleNegativesRankingLoss”:
- Cada par positivo ((q_i, d_i)) é comparado contra todos os demais (d_j) no lote como negativos.
- É essencialmente InfoNCE para recuperação e é fácil de implementar de forma eficiente.
Dados contrastivos supervisionados vs auto-supervisionados
A qualidade das incorporações é frequentemente limitada mais pelos dados do que pela perda exata.
Fontes comuns de supervisão:
- Conjuntos de dados NLI (Natural Language Inference) (acarretamento/contradição) transformados em supervisão de similaridade
- Pares de paráfrase (por exemplo, duplicatas de perguntas)
- Pares pergunta–resposta / consulta–passagem
- Logs de cliques e feedback implícito (busca industrial)
- Pares sintéticos gerados por LLMs (útil, mas cuidado com vieses/artefatos)
Estratégias auto-supervisionadas:
- Baseadas em aumentação (augmentation): diferentes “visões” do mesmo texto (dropout, mascaramento de spans, retrotradução)
- Destilação professor–aluno (teacher–student distillation): treinar um bi-codificador para corresponder às pontuações de um codificador cruzado mais forte
Adaptação de domínio e incorporações no estilo instrução
Modelos de incorporação modernos suportam cada vez mais prompting instrucional (instructional prompting), por exemplo:
- “Represente esta frase para recuperação”
- “Represente este documento para classificação”
- “Represente esta pergunta para QA”
Isso ajuda um único modelo a atender múltiplos “modos” de incorporação. A adaptação de domínio normalmente é feita com ajuste fino (fine-tuning) em pares do domínio (por exemplo, consultas jurídicas ↔ passagens jurídicas). Para base sobre otimização, veja Descida do Gradiente.
Representações otimizadas para recuperação: o que significa “bom para recuperação”
Incorporações podem ser “semanticamente boas” para agrupamento, mas medianas para recuperação. Recuperação impõe restrições adicionais:
1) Separabilidade sob busca por vizinho mais próximo
A recuperação normalmente usa índices de vizinhos mais próximos aproximados (approximate nearest neighbor, ANN) (HNSW, IVF, PQ). Esses métodos funcionam melhor quando:
- itens relevantes estão entre os vizinhos mais próximos sob similaridade de cosseno/produto interno
- as incorporações não são excessivamente anisotrópicas
- o espaço vetorial preserva bem as vizinhanças locais
2) Escolha de métrica: cosseno vs produto interno
- Similaridade do cosseno (frequentemente com incorporações normalizadas) enfatiza direção em vez de magnitude.
- Produto interno pode incorporar magnitude como um sinal de confiança.
Muitos modelos de recuperação normalizam incorporações e usam similaridade do cosseno por estabilidade e ajuste mais fácil.
3) Negativos difíceis e “realismo de recuperação”
Um motivo-chave pelo qual o treinamento contrastivo funciona é a presença de negativos significativos:
- Negativos aleatórios geralmente são fáceis demais (tópicos diferentes).
- Negativos difíceis são “próximos, mas errados” (mesmas entidades, formulação parecida, resposta diferente).
Negativos difíceis podem ser minerados por:
- recuperar top-k com um modelo de incorporação baseline, excluindo o positivo verdadeiro
- usar BM25 (recuperação esparsa (sparse retrieval)) para encontrar textos lexicalmente similares, mas irrelevantes
- usar um codificador cruzado para encontrar itens que parecem relevantes, mas estão incorretos
Isso se relaciona de perto com ideias clássicas de IR; veja Recuperação de Informação.
4) Assimetria consulta–documento
Consultas são curtas e pouco especificadas; documentos são longos e ricos. Duas abordagens comuns:
- Codificador compartilhado para consulta e doc (mais simples)
- Codificadores duplos com parâmetros separados (melhor quando as distribuições diferem)
5) Efeitos de comprimento e segmentação
Documentos frequentemente são segmentados em passagens (por exemplo, 200–500 tokens). A segmentação afeta:
- revocação (recall) (trechos menores aumentam as chances de correspondência)
- precisão (precision) (pequenos demais podem perder contexto)
- tamanho do índice e latência (latency)
A tokenização (tokenization) também importa para texto multilíngue (multilingual) ou específico de domínio; veja Mergulho Profundo em Tokenização.
Avaliação: como sabemos que incorporações são “boas”
Diversidade de tarefas e os limites de métricas de número único
Nenhuma métrica única captura todos os casos de uso de incorporações. Incorporações são usadas para:
- recuperação (qualidade de ranqueamento)
- similaridade semântica textual (Semantic Textual Similarity, STS) (correlação com julgamentos humanos de similaridade)
- classificação (desempenho de sondagem linear (linear probe))
- agrupamento (pureza de cluster / NMI)
Cuidado: otimizar para uma pode prejudicar outra. Para uma filosofia mais ampla de avaliação, veja Avaliação para PLN.
MTEB: o Benchmark Moderno de Incorporações de Texto
MTEB é uma suíte de benchmarks amplamente usada para comparar modelos de incorporação em muitas tarefas e domínios. Ela inclui categorias como:
- Recuperação (frequentemente avaliada com nDCG@k, Recall@k, MAP)
- STS (correlação de Spearman/Pearson)
- Classificação (acurácia/F1 com classificadores simples)
- Reranqueamento (correlação de ranqueamento / variantes de nDCG)
- Agrupamento (NMI, ARI)
- Classificação de pares (por exemplo, detecção de perguntas duplicadas)
Por que o MTEB importa:
- Ele incentiva robustez (robustness): modelos não devem se ajustar demais a um único estilo de conjunto de dados.
- Ele dá suporte a fichas de modelo (model cards) e avaliação reprodutível em muitos conjuntos de dados.
- Ele evidencia trade-offs: alguns modelos se destacam em recuperação, mas são mais fracos em STS, ou vice-versa.
Dicas práticas de interpretação:
- Olhe especificamente o subconjunto de Recuperação se seu principal caso de uso é busca/geração aumentada por recuperação.
- Verifique aderência de domínio: desempenho em recuperação biomédica pode não acompanhar o desempenho em recuperação geral na web.
- Considere trilhas multilíngues se relevante.
Exemplo: avaliando um modelo com a biblioteca `mteb` (Python)
# pip install mteb sentence-transformers
from mteb import MTEB
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("intfloat/e5-base-v2") # example embedding model
evaluation = MTEB(tasks=["MSMARCO", "NFCorpus"]) # retrieval tasks
results = evaluation.run(model, output_folder="mteb_results")
print(results)
Notas:
- Nomes exatos de tarefas e disponibilidade podem mudar; consulte a documentação do MTEB para listas de tarefas atuais.
- Algumas tarefas são grandes e podem exigir computação/tempo significativos.
Uso prático: construindo um sistema de recuperação com incorporações
Um pipeline padrão de recuperação baseada em incorporação:
- Escolha um modelo de incorporação apropriado para seu domínio e idioma(s).
- Segmente documentos e compute incorporações.
- Indexe incorporações em um banco de dados vetorial (vector database) / índice ANN.
- No momento da consulta, gere a incorporação da consulta e recupere os vizinhos mais próximos.
- Opcionalmente, reranqueie com um codificador cruzado e aplique lógica de negócio.
Exemplo: incorporar e buscar com Sentence-Transformers + FAISS
# pip install sentence-transformers faiss-cpu
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer
docs = [
"Contrastive learning trains embeddings by pulling positives together and pushing negatives apart.",
"FAISS provides efficient similarity search over dense vectors.",
"Tokenization splits text into subword units for transformer models."
]
query = "How do we train embeddings with negatives?"
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
doc_emb = model.encode(docs, normalize_embeddings=True)
q_emb = model.encode([query], normalize_embeddings=True)
# Build an index for cosine similarity via inner product on normalized vectors
dim = doc_emb.shape[1]
index = faiss.IndexFlatIP(dim)
index.add(doc_emb.astype(np.float32))
scores, ids = index.search(q_emb.astype(np.float32), k=2)
for score, idx in zip(scores[0], ids[0]):
print(score, docs[idx])
Em um sistema real você adicionaria:
- armazenamento persistente (banco vetorial ou índice FAISS salvo)
- filtragem por metadados (por data, permissões, idioma)
- reranqueamento e deduplicação
- monitoramento de deriva (drift) (mudanças na distribuição de consultas)
Treinando seu próprio modelo de incorporação: uma receita prática
Treinar do zero é raro, a menos que você tenha dados/computação massivos. Mais comum:
1) Comece a partir de um Transformador pré-treinado (pretrained transformer)
Inicialize a partir de um modelo codificador (ou de um ponto de verificação (checkpoint) pronto para incorporações).
2) Construa pares positivos
Exemplos:
- (pergunta, passagem de resposta aceita)
- (título, corpo) para páginas web
- (consulta do usuário, descrição de produto clicada)
3) Adicione negativos
- Negativos no lote por padrão
- Minere negativos difíceis periodicamente:
- recupere top-k usando seu modelo atual
- remova positivos verdadeiros
- adicione “quase-acertos” bem ranqueados como negativos
4) Escolha um objetivo
- InfoNCE / MultipleNegativesRankingLoss para treinamento de recuperação escalável
- Adicione perdas baseadas em margem (margin-based losses) se você tiver supervisão explícita de negativos
- Considere treinamento multi-tarefa se você precisar tanto de STS quanto de recuperação
5) Valide com métricas de recuperação e tarefas no estilo MTEB
Meça:
- Recall@k / nDCG@k em recuperação do domínio
- latência e pegada de memória
- robustez (consultas curtas, erros de digitação (typos), multilíngue)
Passo contrastivo mínimo em estilo PyTorch (esboço)
import torch
import torch.nn.functional as F
def info_nce_loss(q, d, temperature=0.05):
# q, d: [B, D] normalized embeddings
logits = (q @ d.T) / temperature # [B, B]
labels = torch.arange(q.size(0), device=q.device)
return F.cross_entropy(logits, labels)
# q = encoder(queries); d = encoder(docs)
# q = F.normalize(q, dim=-1); d = F.normalize(d, dim=-1)
# loss = info_nce_loss(q, d)
Esse é o núcleo de muitos treinadores de incorporações para recuperação.
Modos comuns de falha e como lidar com eles
Colapso de incorporação (embedding collapse) / anisotropia
Sintomas:
- Muitos textos não relacionados são altamente similares.
- Vizinhos mais próximos parecem genéricos.
Mitigações:
- negativos mais fortes / mineração de negativos difíceis
- melhor diversidade de lote
- normalização e ajuste de temperatura
- evitar escolhas de agregação agressivas demais
“Similaridade semântica” vs “relevância”
Uma passagem pode ser semanticamente similar, mas não responder à consulta. Recuperação precisa de relevância.
Mitigações:
- treinar em pares consulta–passagem relevante (não apenas paráfrases)
- destilar a partir de um codificador cruzado que modele relevância melhor
- incluir negativos difíceis que sejam semanticamente próximos, mas irrelevantes
Incompatibilidade de domínio
Incorporações de uso geral têm desempenho inferior em jargão especializado.
Mitigações:
- continuar o treinamento em pares do domínio
- incorporar corpora e terminologia específicos do domínio
- avaliar em conjuntos de recuperação do domínio, não apenas em médias gerais do MTEB
Problemas multilíngues e de alternância de código (code-switching)
Um modelo pode incorporar bem o inglês, mas falhar em outros idiomas.
Mitigações:
- usar pontos de verificação multilíngues de incorporação
- adicionar dados de mineração de sentenças paralelas
- avaliar em tarefas multilíngues de recuperação e STS
Incorporações no ecossistema mais amplo de PLN
Modelos de incorporação complementam (não substituem) outras abordagens:
- Recuperação esparsa (BM25) se destaca em palavras-chave raras e correspondência exata.
- Recuperação densa se destaca em paráfrases e correspondência semântica.
- Recuperação híbrida (hybrid retrieval) (esparsa + densa) costuma ser a melhor na prática.
- Reranqueamento com codificadores cruzados melhora a precisão nos melhores resultados.
- Modelos de linguagem generativos (generative LMs) otimizam previsão do próximo token (next-token prediction), não recuperação. Veja Modelagem de Linguagem para entender por que esse objetivo difere.
Tendências atuais (e o que observar)
- Incorporações ajustadas por instruções (instruction-tuned embeddings): um modelo suporta múltiplas tarefas via prompts/instruções.
- Melhor mineração de negativos difíceis: usando professores mais fortes, mineração iterativa e negativos sintéticos, mas verificados.
- Métodos híbridos e de interação tardia (late-interaction methods): melhorando relevância sem o custo total de codificadores cruzados.
- Modelos focados em eficiência: codificadores menores com desempenho competitivo para busca no dispositivo (on-device) ou busca de alto QPS (high-QPS).
- Maturidade de avaliação: suítes mais amplas como MTEB mais benchmarks específicos de domínio; mais atenção a robustez, viés (bias) e calibração (calibration).
Resumo
Modelos de incorporação aprendem representações vetoriais de texto que suportam busca eficiente por similaridade e correspondência semântica. Sistemas modernos tipicamente:
- treinam com objetivos contrastivos (InfoNCE/NT-Xent e variantes)
- dependem de negativos no lote e negativos difíceis para moldar um espaço amigável à recuperação
- enfatizam representações otimizadas para recuperação (agregação, normalização, assimetria consulta/doc)
- avaliam de forma ampla usando suítes como MTEB, com foco em métricas de recuperação quando busca é o objetivo
- implantam como parte de um pipeline: recuperação com bi-codificador + índice ANN + reranqueamento opcional com codificador cruzado
Para detalhes práticos de implantação, modelos de incorporação se conectam mais diretamente a Busca Semântica e Recuperação de Informação, enquanto sua filosofia de avaliação se conecta a Avaliação para PLN.