Embeddings
Embeddings mapeiam texto para um espaço onde distância vira semântica: 'cão' e 'pet' ficam perto, 'cão' e 'satélite' ficam longe. É o motor da busca por similaridade do RAG.
O que é
Embedding é um vetor denso de números reais (tipicamente entre 300 e 3072) que representa um trecho de texto. A propriedade útil é geométrica: dois textos com significado parecido ficam a pouca distância no espaço, e dois textos sem relação ficam longe. A 'distância' é medida por cosseno, produto interno ou euclidiana.
O vetor é gerado por um modelo treinado em pares de texto (origem e tradução, pergunta e resposta, ou títulos parecidos). Depois do treino, o modelo aprendeu a colocar palavras e frases próximas de palavras similares e longe de outras. Não há regra simbólica. O arranjo é puramente estatístico.
Modelos e dimensões
Três famílias dominam. Modelos de uso geral, como text-embedding-3-small da OpenAI ou embed-multilingual-v3 da Cohere, retornam vetores de 384 a 3072 e funcionam razoavelmente em qualquer domínio. Modelos ajustados por domínio (jurídico, biomédico, código) ganham precisão quando o corpus é técnico, e perdem quando saem dele. Modelos locais via sentence-transformers rodam sem chamada externa, custam mais CPU e são úteis quando o dado não pode sair da infraestrutura.
Mais dimensões custam mais armazenamento, mais memória e mais tempo de busca. Para um corpus pequeno, 384 dimensões são suficientes; para um milhão de documentos, vale medir se o ganho de subir para 1024 cobre o custo.
Similaridade na prática
A similaridade do cosseno mede o ângulo entre dois vetores e ignora a magnitude, então dois textos longos e dois curtos podem ter o mesmo valor de similaridade por conteúdo. A fórmula é a do produto interno dividido pela norma de cada vetor.
type Vec = number[];
export function dot(a: Vec, b: Vec): number {
let s = 0;
for (let i = 0; i < a.length; i++) s += a[i] * b[i];
return s;
}
export function norm(a: Vec): number {
return Math.sqrt(dot(a, a));
}
export function cosine(a: Vec, b: Vec): number {
const denom = norm(a) * norm(b);
if (denom === 0) return 0;
return dot(a, b) / denom;
}
// uso
const doc: Vec = await embedder.embed("rag combina busca e geração");
const query: Vec = await embedder.embed("como funciona rag?");
const score = cosine(doc, query);
console.log(score.toFixed(3));Escolhendo o modelo
Quatro perguntas determinam a escolha. Primeira: o domínio é geral ou técnico? Modelo multilingual ajuda em PT-BR; modelo de código ajuda em bases de código. Segunda: precisa rodar offline ou pode chamar API? Offline força sentence-transformers ou BGE local. Terceira: qual o orçamento de armazenamento? Vetores de 3072 dimensões para 10 milhões de documentos são 120 GB só de embeddings. Quarta: precisa de consistência semântica ao longo do tempo? Trocar o modelo de embedding depois da indexação obriga reindexar tudo.
A regra que evita mais arrependimento: defina o modelo antes de indexar e congele essa decisão. Reindexação é cara, e ficar alternando entre modelos no meio do projeto degrada a qualidade do retrieval sem aviso.
Pontos fortes
- comprensão semântica aproximada sem regras: frases diferentes com o mesmo sentido ficam perto, sem precisar de sinônimos hardcoded
- modelos prontos de qualidade: open weights (BGE, E5, mE5) e APIs gerenciadas cobrem a maior parte dos casos sem treinamento
- custo por chamada baixo: embeddings são tipicamente ordens de grandeza mais baratos do que a geração do LLM
Limitações
- cegueira lexical: 'alface' e 'verdura' ficam perto, mas 'alface' e 'Alface S.A.' (empresa) também ficam, e o retrieval não sabe distinguir
- modelo desatualizado: o modelo viu dados até a data do treino; termos novos não têm posição boa no espaço
- sem garantia de alinhamento entre idiomas: modelos multilingues aproximam, mas traduções literais saem na frente de paráfrases
- custo de trocar: mudar o modelo de embedding é reindexação completa, então a decisão inicial pesa
conexões no mapa
atualizado em 14/10/2026 · fontes para aprofundar · reportar erro
Estude antes
Desbloqueia
teste o que entendeu
Carregando perguntas…