Capítulo 1: O que são Embeddings?
Introdução
Embeddings são representações vetoriais densas de texto que capturam o significado semântico. Eles permitem que computadores compreendam e comparem o significado de textos, e não apenas as palavras.
O Conceito
Pense em embeddings como coordenadas em um "espaço de significados":
"happy" → [0.2, 0.8, -0.1, 0.5, ...]
"joyful" → [0.21, 0.79, -0.12, 0.48, ...] // Semelhante!
"sad" → [-0.3, 0.1, 0.7, -0.4, ...] // Diferente!
Significados semelhantes = Vetores semelhantes = Próximos no espaço
Como Embeddings Funcionam
1. Texto para Vetor
from openai import OpenAI
client = OpenAI()
# Texto vira um vetor
text = "Machine learning is fascinating"
response = client.embeddings.create(
input=text,
model="text-embedding-3-small"
)
embedding = response.data[0].embedding
# Resultado: [0.023, -0.891, 0.156, ..., 0.342]
# 1536 dimensões
2. Cálculo de Similaridade
import numpy as np
def cosine_similarity(vec1, vec2):
"""Calculate cosine similarity between two vectors"""
dot_product = np.dot(vec1, vec2)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
return dot_product / (norm1 * norm2)
# Exemplo
similarity = cosine_similarity(
embed("What is RAG?"),
embed("Explain Retrieval Augmented Generation")
)
# Resultado: ~0.92 (muito semelhante!)
similarity = cosine_similarity(
embed("What is RAG?"),
embed("How to cook pasta")
)
# Resultado: ~0.15 (não semelhante)
Dimensões do Embedding
| Modelo | Dimensões | Tamanho do Vetor |
|---|---|---|
| text-embedding-3-small | 1536 | 6KB |
| text-embedding-3-large | 3072 | 12KB |
| Cohere embed-v3 | 1024 | 4KB |
| BGE-small | 384 | 1.5KB |
| BGE-large | 1024 | 4KB |
Por que as Dimensões Importam
- Mais dimensões = Representações mais detalhadas
- Menos dimensões = Busca mais rápida, menos armazenamento
- Trade-off entre qualidade e eficiência
Métricas de Similaridade
Similaridade Cosseno
Mais comum para embeddings de texto:
# Intervalo: -1 a 1
# 1 = mesma direção
# 0 = ortogonal (não relacionado)
# -1 = direção oposta
cosine_sim = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
Distância Euclidiana
Mede a distância em linha reta:
# Menor = mais semelhante
euclidean_dist = np.linalg.norm(a - b)
Produto Escalar
Quando os vetores são normalizados:
# Para vetores normalizados, igual à similaridade cosseno
dot_product = np.dot(a, b)
Visualizando Embeddings
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# Reduz para 2D para visualização
texts = ["cat", "dog", "car", "truck", "happy", "sad"]
embeddings = [embed(t) for t in texts]
tsne = TSNE(n_components=2, random_state=42)
reduced = tsne.fit_transform(embeddings)
plt.scatter(reduced[:, 0], reduced[:, 1])
for i, text in enumerate(texts):
plt.annotate(text, (reduced[i, 0], reduced[i, 1]))
plt.show()
Clusters esperados:
- "cat", "dog" → Cluster de animais
- "car", "truck" → Cluster de veículos
- "happy", "sad" → Cluster de emoções
Propriedades-Chave de Bons Embeddings
| Propriedade | Descrição |
|---|---|
| Similaridade Semântica | Significados semelhantes → Vetores próximos |
| Composicionalidade | Frases codificadas de forma significativa |
| Cross-lingual | Mesmo conceito semelhante entre idiomas |
| Denso | Todas as dimensões carregam significado |
Embeddings em RAG
Resumo
- Embeddings convertem texto em vetores numéricos
- Significados semelhantes produzem vetores semelhantes
- Similaridade cosseno é a métrica padrão
- Dimensões afetam qualidade versus eficiência
- Embeddings permitem busca semântica em RAG
Próximos Passos
Continue para Capítulo 2: Modelos de Embedding para explorar as opções disponíveis.