Embeddings & Similaridade
Embeddings convertem texto em vetores de tamanho fixo onde a similaridade semântica corresponde à proximidade geométrica. Eles potencializam a busca semântica, clustering e recuperação RAG.
Busque em todas as páginas da documentação
Embeddings convertem texto em vetores de tamanho fixo onde a similaridade semântica corresponde à proximidade geométrica. Eles potencializam a busca semântica, clustering e recuperação RAG.
Cartão de receita de referência rápida - pronto para copiar e colar.
from openai import OpenAI
import numpy as np
client = OpenAI()
emb = client.embeddings.create(model="text-embedding-3-small", input=["texto da consulta"])
vec = np.array(emb.data[0].embedding)
# similaridade de cosseno
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))Quando usar isso:
"""embeddings_similarity.py - incorporar, indexar e pesquisar documentos."""
from __future__ import annotations
import numpy as np
from openai import OpenAI
client = OpenAI()
MODEL = "text-embedding-3-small"
documents = [
"FastAPI é um framework web moderno em Python para construir APIs.",
"PyTorch é um framework de deep learning com grafos de computação dinâmicos.",
"pandas 2.2 fornece operações de DataFrame para análise de dados tabulares.",
"pytest é o framework padrão de testes para projetos Python.",
]
def embed_texts(texts: list[str]) -> np.ndarray:
response = client.embeddings.create(model=MODEL, input=texts)
vectors = [item.embedding for item in response.data]
arr = np.array(vectors, dtype=np.float32)
norms = np.linalg.norm(arr, axis=1, keepdims=True)
return arr / norms # Normalização L2 para cosseno via produto escalar
doc_embeddings = embed_texts(documents)
query = "Como eu testo meu código Python?"
query_vec = embed_texts([query])[0]
scores = doc_embeddings @ query_vec # similaridade de cosseno (normalizada)
ranked = sorted(zip(scores, documents), reverse=True)
for score, doc in ranked:
print(f"{score:.3f} {doc}")O que isso demonstra:
text-embedding-3-small.| Modelo | Dims | Provedor | Uso |
|---|---|---|---|
| text-embedding-3-small | 1536 | OpenAI | Propósito geral, custo-benefício |
| text-embedding-3-large | 3072 | OpenAI | Maior qualidade |
| all-MiniLM-L6-v2 | 384 | Local (sentence-transformers) | Offline, rápido |
| voyage-3 | 1024 | Voyage AI | Otimizado para recuperação |
# Embeddings locais com sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
vectors = model.encode(documents, normalize_embeddings=True)| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Embeddings de API (OpenAI) | Sem GPU, alta qualidade | Dados não podem sair da sua rede |
| sentence-transformers | Local/offline, grátis | Precisa da mais alta qualidade de recuperação |
| Busca por palavra-chave BM25 | Correspondência exata de termos | Necessita correspondência semântica/paráfrase |
| Híbrido (BM25 + denso) | RAG de produção | Protótipo simples com poucos documentos |
client.embeddings.create(model="text-embedding-3-small", input=texts, dimensions=512)Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026