01-04-02 — Embeddings: a intuição geométrica
TL;DR
Um embedding é um vetor de números reais que representa o significado de um token (ou frase, imagem, documento) em espaço multidimensional. Conceitos similares ficam próximos geometricamente. Isso é o que permite que modelos "entendam" analogias: rei − homem + mulher ≈ rainha. Embeddings são a base de busca semântica, RAG e sistemas de recomendação modernos.
O problema que embeddings resolvem
Token IDs são arbitrários: o ID 4523 para "gato" e 4524 para "cachorro" não dizem nada sobre a relação entre os conceitos. Um modelo que trata IDs como números absolutos não consegue generalizar.
A solução: mapear cada ID para um vetor denso em espaço de alta dimensão (tipicamente 768 a 4096 dimensões), onde a posição codifica significado semântico.
O que é um vetor de embedding
Imagine um espaço com 300 dimensões (simplificando para 3 no diagrama abaixo). Cada palavra ocupa uma posição nesse espaço. Palavras semanticamente relacionadas ficam próximas; palavras não relacionadas ficam distantes.
Word2Vec: a prova de conceito histórica
Em 2013, pesquisadores do Google (Mikolov et al.) publicaram o Word2Vec — um modelo simples que demonstrou que embeddings treinados em texto capturam estrutura semântica e sintática:
vetor("rei") − vetor("homem") + vetor("mulher") ≈ vetor("rainha")
Isso funciona porque "realeza" é uma direção no espaço de embeddings. Subtrair "homem" e adicionar "mulher" navega nessa direção preservando o conceito de poder/realeza.
Mais exemplos que funcionam:
Paris − França + Itália ≈ Roma(capitais)andar − anda + correr ≈ corre(conjugação verbal)maior − grande + pequeno ≈ menor(comparativos)
Similaridade por cosseno
Para medir o quão similares dois embeddings são, usa-se a similaridade por cosseno — o cosseno do ângulo entre os dois vetores:
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Resultado: 1.0 = idênticos, 0.0 = sem relação, -1.0 = opostos
# Exemplo com embeddings reais via OpenAI
from openai import OpenAI
client = OpenAI()
def get_embedding(text):
response = client.embeddings.create(
input=text,
model="text-embedding-3-small" # 1536 dimensões
)
return np.array(response.data[0].embedding)
rei = get_embedding("rei")
rainha = get_embedding("rainha")
gato = get_embedding("gato")
print(f"rei ↔ rainha: {cosine_similarity(rei, rainha):.3f}") # ~0.85
print(f"rei ↔ gato: {cosine_similarity(rei, gato):.3f}") # ~0.15
Similaridade por cosseno mede direção, não magnitude. Dois vetores apontando na mesma direção têm similaridade 1.0 independente do tamanho. É por isso que ela funciona melhor que distância euclidiana para comparar significados.
Embeddings modernos vs. Word2Vec
| Característica | Word2Vec (2013) | Embeddings de LLMs (2024+) |
|---|---|---|
| Dimensões | 50–300 | 768–4096+ |
| Uma representação por palavra? | Sim (estática) | Não (contextual) |
| "banco" (financeiro vs. assento) | Mesmo vetor | Vetores diferentes por contexto |
| Multilíngue | Por idioma | Modelos multilíngues unificados |
Embeddings contextuais (BERT, text-embedding-3) são superiores porque a representação de uma palavra muda de acordo com a frase ao redor.
Onde embeddings são usados na prática
RAG — Retrieval-Augmented Generation
O padrão arquitetural mais importante para aplicações enterprise com LLMs. Você armazena seus documentos como embeddings num banco vetorial (Pinecone, pgvector, Azure AI Search). Na query, a pergunta do usuário vira embedding e você busca os trechos mais similares — aí passa esses trechos como contexto para o LLM responder.
Busca semântica
Diferente de full-text search (que busca palavras exatas), busca semântica encontra documentos pelo significado. "contrato de trabalho encerrado" retorna resultados sobre "demissão" mesmo sem essa palavra.
Clustering e classificação
Agrupar tickets de suporte por similaridade semântica, classificar sentimento, detectar duplicatas.
Azure AI Search tem suporte nativo a busca vetorial com embeddings. Integrado ao Azure OpenAI, permite RAG enterprise sem montar infraestrutura de banco vetorial separada. Para projetos .NET, o SDK Azure.AI.OpenAI e Azure.Search.Documents cobrem o pipeline completo.
Modelos de embedding disponíveis
| Modelo | Provedor | Dimensões | Custo |
|---|---|---|---|
| text-embedding-3-small | OpenAI | 1536 | $0,02/1M tokens |
| text-embedding-3-large | OpenAI | 3072 | $0,13/1M tokens |
| text-embedding-ada-002 | OpenAI (legado) | 1536 | $0,10/1M tokens |
| all-MiniLM-L6-v2 | Hugging Face (open) | 384 | Grátis (local) |
| e5-large-v2 | Microsoft (open) | 1024 | Grátis (local) |
Agora você tem os dois blocos básicos: tokens (como texto vira IDs) e embeddings (como IDs viram vetores com significado). Com isso, você entende o que entra num Transformer. Os próximos módulos constroem sobre essa base para explicar como LLMs são treinados e como usá-los na prática.
Como isso se conecta
- 01-04-01 Tokens — o passo anterior: texto → IDs
- 01-02-03 Transformers — a arquitetura que usa embeddings posicionais e de atenção
- 01-05-01 Glossário — definições formais de inference, fine-tuning e context window
Fontes
- Mikolov et al. — Efficient Estimation of Word Representations in Vector Space (Word2Vec original, 2013)
- OpenAI — Embeddings guide (documentação oficial)
- Microsoft — Vector search in Azure AI Search (documentação oficial)
- Hugging Face — Getting Started With Embeddings
- Pinecone — What are Vector Embeddings? (guia prático)