← Blog

Bancos vetoriais, chunking e RAG: similaridade não é verdade

Um embedding é um jeito de transformar um texto em um ponto. Textos que “querem dizer algo parecido” caem perto uns dos outros. A frase parece mágica até você lembrar o que ela não diz: perto não é verdadeiro, não é autorizado, não é vigente. É só perto.

Bancos vetoriais — Pinecone, Qdrant, Weaviate, pgvector, Chroma — guardam esses pontos e respondem “quais são os k vizinhos desta pergunta?”. No RAG, esses vizinhos viram o contexto do modelo. A qualidade do sistema nasce menos da logomarca do banco e mais de duas decisões pobres de glamour: como você corta o texto e o que você guarda junto do vetor.

No artigo de julho sobre por que recuperar contexto, a tese era: não encha o prompt; busque o trecho. Aqui vai o mecanismo dessa busca, e o modo como ele mente com educação.

Geometria do sentido

O modelo de embedding lê um trecho e devolve uma lista de números. Trezentas, mil, três mil dimensões, conforme o modelo. Similaridade de cosseno — o ângulo entre dois vetores — vira a métrica usual. Pergunta e parágrafo com ângulo pequeno sobem na ranking.

Isso captura um tipo de semelhança: tópico, vocabulário, às vezes intenção. “Prazo de devolução” se aproxima de “política de reembolso”. “Volume 3 da coleção” se aproxima de outros volumes. Útil. Insuficiente.

A geometria não sabe que a política de 2024 foi revogada. Não sabe que dois parágrafos usam as mesmas palavras para dizer o contrário. Não sabe que “combo” e “carrinho” são produtos diferentes com regras diferentes, embora morem em frases parecidas. O espaço é de sentido aproximado, não de lógica.

Quem já organizou um acervo sente o paralelo. Dois livros lado a lado na estante “negócios” não concordam. A prateleira é um índice de vizinhança. A verdade de cada um está no argumento, que a prateleira não lê.

flowchart TD
  D[Documento] --> C[Cortar trechos]
  C --> E[Embedding]
  E --> I[Índice]
  Q[Pergunta] --> V[Vetor da pergunta]
  V --> I
  I --> T[Trechos vizinhos]
  T --> G[Geração]
  classDef ouro fill:#FBF5E4,stroke:#C9A227,color:#0B1F18,stroke-width:1.4px
  classDef verde fill:#F3FAF7,stroke:#1E7A57,color:#0B1F18,stroke-width:1.4px
  classDef fim fill:#14513B,stroke:#0F3328,color:#FBFAF6,stroke-width:1.4px
  class D,Q ouro
  class C,E,V,I,T verde
  class G fim

O tamanho do trecho é uma aposta de recall

Chunking é o corte. Cada trecho vira um vetor. Trecho grande carrega contexto e dilui a pergunta: a média do capítulo inteiro se afasta do parágrafo que respondia. Trecho pequeno acerta o parágrafo e perde a condição que estava na frase anterior. Recall — a chance de o trecho certo aparecer no top-k — depende desse corte mais do que da escolha entre dois bancos famosos.

Não existe tamanho universal. Há combinações que se repetem porque falham menos no começo:

  • trechos de algumas centenas de tokens, com sobreposição pequena, para manuais e contratos;
  • corte por seção ou cabeçalho quando o documento já tem estrutura (um sumário, uma cláusula, um capítulo);
  • corte por parágrafo quando a unidade de sentido já é o parágrafo, como em notas e FAQs.

Sobreposição existe para não perder a frase que atravessa a fronteira. Exagerar a sobreposição duplica vetores, encarece o índice e devolve o mesmo parágrafo três vezes, ocupando o k com eco.

Uma pergunta prática organiza o experimento melhor do que um post de rede: o que deve ser recuperável de uma vez só? Se a resposta vive numa tabela de três linhas, a tabela não pode ser partida no meio. Se a resposta é um capítulo de vinte páginas, você não quer o capítulo inteiro no prompt; quer o parágrafo e, se preciso, o título da seção como metadado.

Mude um parâmetro por vez. Meça se o parágrafo de ouro entra no top-k. Só depois discuta o gerador. Um RAG “ruim” é, com frequência, um corte que nunca entregou a evidência.

Metadados são o antídoto parcial à geometria

O vetor não deve viajar sozinho. Junto dele cabem campos que a busca semântica não substitui: livro, volume, data, idioma, tipo de documento, público, permissão, âncora da página.

Filtros de metadado acontecem antes ou junto da busca por vizinhança. “Só a política vigente.” “Só o volume 2.” “Só o que este usuário pode ler.” Sem filtro, o vizinho mais próximo pode ser a edição antiga, o rascunho interno, o contrato de outro autor.

Isso não é detalhe de banco. É o mesmo princípio de um catálogo: você não encontra um título só por “parecer” com outro; usa coleção, idioma, ano. O banco vetorial que só guarda vetores é uma estante sem lombada.

Datas merecem um campo próprio. Quando o documento muda, o vetor antigo precisa morrer ou ganhar versão. Índice velho, como já vimos no RAG, é uma mentira bem indexada. Hash do arquivo e data de ingestão não são burocracia. São o mínimo para saber o que o sistema viu.

O que similaridade não é

Similaridade não é relevância. Um parágrafo pode ser vizinho e inútil: define o termo, não responde a pergunta.

Similaridade não é completude. O trecho certo pode ser o segundo, e o primeiro — mais “parecido” — é um marketing que usa as mesmas palavras.

Similaridade não é verdade. Dois trechos próximos podem ser um fato e uma objeção ao fato. O modelo, se você não disser o contrário, mistura os dois num consenso suave.

Similaridade não é permissão. O parecer jurídico confidencial pode ser o vizinho perfeito da pergunta do leitor. Recuperá-lo é um incidente, não um acerto de recall.

Por isso busca híbrida — léxica mais vetorial — continua a ganhar casos. Nome próprio, SKU, cláusula “5.2”, ISBN: a palavra exata importa. O vetor sozinho dilui o identificador. Um ranking que mistura BM25 e cosseno, depois filtra metadado, costuma ser mais honesto do que “só embeddings, que é o estado da arte”.

Escolher o banco depois de escolher a pergunta

A indústria discute qual vector DB “vence”. Para um acervo de dezenas de milhares de trechos, quase qualquer um com filtro, upsert e backup serve. A pergunta útil é outra:

  • consigo filtrar por metadado sem gambiarra?
  • consigo apagar e reindexar um documento sem corromper o resto?
  • o trecho volta com o texto original, não só o id?
  • a latência cabe no orçamento daquela tela?

Se o volume é pequeno, um índice no Postgres com pgvector reduz uma peça móvel. Se o volume explode e a equipe já opera um serviço gerenciado, o serviço ganha. Trocar de banco para ganhar dois pontos de recall, enquanto o corte parte cláusulas no meio, é otimismo de catálogo.

Um teste que cabe numa tarde

  1. Pegue dez documentos que alguém realmente consulta.
  2. Escreva quinze perguntas com o trecho-resposta marcado.
  3. Corte de três jeitos (parágrafo, seção, tamanho fixo com sobreposição).
  4. Meça, para cada corte, quantas vezes o trecho-resposta entra no top-5.
  5. Só no vencedor ligue o modelo, com a regra de recusar sem evidência.

Você vai discuti-lo menos como “IA” e mais como arquivo: o que indexamos, em que pedaços, com que etiqueta. É um trabalho de editor de acervo. O banco vetorial só guarda a geometria. A verdade continua sendo uma propriedade do texto — e da pessoa que decide se aquele texto ainda vale.

Leia também: RAG: por que recuperar contexto em vez de encher o prompt.

#Vector DB#RAG#Embeddings#Chunking

Thiago Nogueira

Autor de A Caixa Mágica e das séries Programming One e AI One na Editora Pensar Bem.

Capa de AI One

AI One · Volume 1

Do logaritmo ao gradiente, sem fingir que entendeu.