04-02-01 — Modelos de embedding
TL;DR
Embedding model é o coração do RAG — ele transforma texto em vetores que permitem busca semântica. Para a maioria dos projetos Azure/OpenAI, text-embedding-3-small é o ponto de partida (barato, bom). Use text-embedding-3-large quando precisar de precisão máxima em retrieval. Benchmark independente: MTEB. Dimensionalidade menor = mais rápido, mas menos preciso.
O que é um embedding?
Um embedding é uma representação numérica de texto num espaço vetorial de alta dimensão. A ideia central: textos com significado similar devem ficar próximos nesse espaço, independentemente das palavras exatas usadas.
Exemplo prático:
- "rescisão contratual" → vetor A
- "encerramento do contrato" → vetor B
- "término do acordo" → vetor C
Os vetores A, B e C ficam próximos no espaço. Uma busca por "como cancelar o contrato" os encontra todos, mesmo sem nenhuma palavra em comum.
Isso é o que diferencia RAG de um CTRL+F sofisticado. Busca por keyword exige as palavras certas. Busca semântica via embeddings entende intenção e significado.
Os principais modelos
OpenAI / Azure OpenAI
| Modelo | Dimensões | Max tokens | Custo (por 1M tokens) | Quando usar |
|---|---|---|---|---|
| text-embedding-3-small | 1536 | 8191 | $0.02 | Padrão — melhor custo-benefício |
| text-embedding-3-large | 3072 | 8191 | $0.13 | Alta precisão, corpus pequeno |
| text-embedding-ada-002 | 1536 | 8191 | $0.10 | Legacy — evite em novos projetos |
No Azure OpenAI, você deploya o modelo com um nome customizado (ex: "embedding-small"). Use esse nome no parâmetro model do SDK. O texto-embedding-3-small está disponível em todas as regiões Azure desde jan/2024.
Cohere Embed
O embed-english-v3.0 e embed-multilingual-v3.0 são competitivos no MTEB. Diferencial: suportam compressão de dimensionalidade (Matryoshka Representation Learning) e têm uma feature de input type (search_document vs search_query) que melhora retrieval assimétrico.
import cohere
co = cohere.Client("SUA_API_KEY")
# Na indexação — usar input_type="search_document"
doc_embeddings = co.embed(
texts=chunks,
model="embed-multilingual-v3.0",
input_type="search_document"
).embeddings
# Na query — usar input_type="search_query"
query_embedding = co.embed(
texts=[user_question],
model="embed-multilingual-v3.0",
input_type="search_query"
).embeddings[0]
Modelos open-source (self-hosted)
| Modelo | Dimensões | Destaques |
|---|---|---|
| nomic-embed-text-v1.5 | 768 | Gratuito, bom multilíngue, Apache 2.0 |
| BAAI/bge-m3 | 1024 | Melhor open-source no MTEB multilíngue |
| intfloat/multilingual-e5-large | 1024 | Excelente para português |
| sentence-transformers/all-MiniLM-L6-v2 | 384 | Ultra leve, bom para prototipagem |
MTEB — o benchmark que importa
O Massive Text Embedding Benchmark (MTEB) é o padrão da indústria para comparar modelos de embedding. Avalia 56 datasets em 8 categorias (retrieval, classification, clustering, etc.).
O que olhar no MTEB para RAG:
- Retrieval score: mais importante — mede nDCG@10
- Multilingual score: crítico se você tem documentos em português
- Latência p95: impacta tempo de indexação em batch
MTEB é benchmark genérico. Um modelo top-5 no MTEB pode ser mediocre no seu domínio específico (jurídico, médico, técnico). Sempre faça benchmark no seu próprio corpus antes de escolher o modelo para produção.
Dimensionalidade — tradeoffs
Dimensionalidade mais alta = representação mais rica = melhor retrieval. Mas tem custo:
- Armazenamento: 1M chunks × 3072 dims × 4 bytes = ~12 GB vs 6 GB com 1536 dims
- Velocidade de busca: ANN (approximate nearest neighbor) fica mais lento com dimensões maiores
- Custo de API: text-embedding-3-large custa 6,5x mais que o small
A boa notícia: text-embedding-3 suporta Matryoshka Representation Learning — você pode truncar o vetor para dimensões menores (ex: 256) com degradação mínima de qualidade.
# Gerar embedding com dimensionalidade reduzida (MRL)
response = client.embeddings.create(
input="texto do chunk",
model="text-embedding-3-small",
dimensions=256 # reduz de 1536 para 256 — 83% menor, ~5% piora no retrieval
)
Português e multilíngue
Para documentos em português, valide o modelo no seu corpus. Opções:
- text-embedding-3-small/large: suporte multilíngue razoável, incluindo português
- Cohere embed-multilingual-v3.0: treinado especificamente para 100+ idiomas
- BAAI/bge-m3: open-source, excelente para multilíngue, inclusive português
Como isso se conecta
- 04-03-02 — Similaridade — como os vetores gerados aqui são comparados
- 04-02-02 — Vector databases — onde esses vetores são armazenados
- 04-04-01 — Re-ranking — como refinar os resultados após o retrieval vetorial
Fontes
- OpenAI. New embedding models and API updates. openai.com/blog
- Muennighoff, N. et al. (2022). MTEB: Massive Text Embedding Benchmark. arxiv.org/abs/2210.07316
- Cohere. Embed API Reference. docs.cohere.com
- Kusupati, A. et al. (2022). Matryoshka Representation Learning. arxiv.org/abs/2205.13147