Sentence Transformers v6.0 adiciona `MultiVectorEncoder`, um quarto tipo de modelo que traz recuperação com interação tardia ao estilo ColBERT para a mesma biblioteca que gerencia bi-encoders densos, modelos esparsos e rerankers cross-encoder. Modelos PyLate, ColBERT do Stanford-NLP e modelos visuais colpali-engine são carregados com um único comando: `pip install -U sentence-transformers`.
Modelos densos enfrentam um problema de compressão. Um vetor de 768-dimensional deve representar cada entidade, cláusula e quantificador em um texto. Uma consulta como "sofá verde com pernas de madeira e almofadas arredondadas" desaba em um único ponto—então um sofá verde com pernas erradas recebe pontuação próxima ao que você queria. `MultiVectorEncoder` evita isso ao projetar cada token em 128 dimensões e mantém todos eles. Uma passagem de 9-token se torna uma matriz 9×128, não um vetor 1×128.
A pontuação usa MaxSim: para cada token de consulta, encontre sua maior similaridade de cosseno contra qualquer token de documento, depois some esses máximos. Os embeddings de token são L2-normalized, então cada produto escalar cai em [−1, 1], e os totais ficam dentro de [−num_query_tokens, num_query_tokens]. Ao codificar "Where do penguins live?" contra "Penguins inhabit Antarctica." com `lightonai/mLateOn`, o token de consulta "live" encontra similaridade de cosseno de 0.94 em "inhabit"—sem caracteres compartilhados, puro alinhamento contextual. BM25 perde isso completamente. Modelos densos encaixam "live" em um vetor compartilhado que acomoda todo outro token; especificidade é espremida sob compressão com perdas.
Modelos multi-vetor preservam correspondência granular em ambas as direções. Quando a correspondência exata importa—um código de produto, um nome de função, um sobrenome raro—o token permanece isolado no momento da pontuação. Modelos densos o misturam com a passagem durante a codificação. MaxSim não; cada token é comparado independentemente contra o documento no momento da recuperação.
O posicionamento na pilha de recuperação importa. Um cross-encoder passa tanto a consulta quanto o documento pelo modelo junto, o que é preciso mas exige recodificação de cada documento para cada consulta. Um bi-encoder usa um produto escalar entre dois resumos finalizados e negocia precisão por velocidade. `MultiVectorEncoder` fica entre os dois: documentos são codificados offline e indexados, mas a pontuação no momento da consulta compara cada token de consulta contra cada token de documento. O índice cresce, mas documentos não precisam de recodificação por consulta.
Equipes limitadas no tamanho do índice podem usar retrieve-and-rerank: execute recuperação densa de primeira etapa para obter os top-K candidatos, depois use `MultiVectorEncoder` para repontuar essa lista. O índice permanece pequeno; a qualidade de ranking com interação tardia se aplica apenas onde importa. A biblioteca suporta ambos os modos da mesma API.
A recuperação de documentos visuais é um caso de uso de primeira classe. Modelos ColPali-engine são carregados diretamente em `MultiVectorEncoder`, permitindo que consultas de texto correspondam imagens de página sem OCR—atualmente o estado da arte para recuperação de imagem de documento. Token pooling comprime o índice agrupando embeddings de token em nível de palavra ou sentença, negociando qualidade de ranking por armazenamento reduzido.
Alinhamento MaxSim mostra exatamente qual token de consulta correspondeu qual token de documento, um bônus prático para interpretabilidade. Engenheiros depurando falhas de recuperação podem ler esse alinhamento diretamente em vez de ficar olhando para uma pontuação de similaridade escalar opaca—algo que bi-encoders densos não podem oferecer.
Se a precisão de recuperação densa é um gargalo em sua pilha RAG e a latência do cross-encoder é proibitiva, `MultiVectorEncoder` em Sentence Transformers v6.0 é o caminho de menor atrito para ranking com interação tardia em open-source hoje.