1. Comece pelas perguntas que você precisa recuperar#

Um sistema RAG tem pelo menos dois trabalhos distintos: encontrar evidências pertinentes e montar uma resposta a partir delas. Avalie cada um separadamente. Se a busca devolve o documento errado, trocar o modelo generativo pode esconder a falha atrás de uma explicação mais convincente.

Escreva perguntas com os respectivos documentos ou trechos válidos. Inclua consultas exatas por identificador, paráfrases, vocabulário interno e perguntas sem resposta no corpus. Num repositório, uma assinatura de função e uma pergunta sobre comportamento podem exigir caminhos de recuperação diferentes. Teste a busca léxica junto com a semântica antes de assumir que tudo precisa de vetores.

2. Fragmente preservando estrutura e procedência#

Um chunk precisa ter contexto suficiente para ser entendido e precisão suficiente para não diluir o assunto. Preserve cabeçalhos, caminhos, versão do documento e limites de funções quando fizer sentido. Registre um identificador estável e um hash do conteúdo para detectar mudanças. Não corte tabelas ou exemplos de código ao meio sem uma estratégia para reconstruí-los.

Não existe tamanho universal. Compare várias configurações com as mesmas perguntas e revise os erros. Uma sobreposição (overlap) grande pode melhorar a continuidade, mas também duplica texto recuperado, custo de ingestão e armazenamento. Meça quantos trechos trazem evidência diferente para o contexto final.

  • Guarde document_id, chunk_id, versão, procedência e permissões junto com o vetor.
  • Detecte exclusões e mudanças de acesso; atualizar texto não é a única operação de sincronização.
  • Use o tokenizador e os limites do provedor. Caracteres não equivalem a tokens.

3. Versione o espaço vetorial#

A dimensão define a forma do vetor, não o seu significado. Dois modelos que devolvem 1024 números não produzem necessariamente espaços compatíveis. Versione modelo, dimensão, normalização e estratégia de fragmentação como uma unidade. Mudar qualquer um deles exige uma avaliação e, quando o espaço muda, um índice separado.

Alguns provedores diferenciam o tipo de entrada query do tipo document. Essa configuração faz parte do contrato: não a omita ao comparar resultados. Também vale falhar de forma explícita diante de entradas longas demais durante a ingestão, em vez de truncar silenciosamente e perder o parágrafo que continha a resposta.

Documentação: Voyage: tipos de entrada, dimensões e truncamento ↗ · Mistral: embeddings para código ↗

4. Autorize antes de recuperar#

O tenant ou workspace da busca precisa vir de uma sessão verificada no servidor. Um identificador enviado pelo navegador não comprova acesso. Aplique as restrições de visibilidade dentro da consulta ao índice e verifique as permissões de novo ao carregar o conteúdo. Filtrar depois de entregar os trechos ao modelo já é tarde demais.

Pseudocódigo
session = requireVerifiedSession(request)
scope = authorizeWorkspace(session, requestedWorkspace)
queryVector = embedQuery(query, indexVersion)
hits = searchIndex(queryVector, {
  workspace: scope.id,
  allowedResources: scope.resourceIds,
  indexVersion
})
context = loadAuthorizedChunks(session, hits)
answer = generateWithCitations(query, context)
Esquema de responsabilidades, não um SDK executável. O mecanismo de busca precisa aplicar o filtro de acesso antes de devolver resultados.

Um cache compartilhado precisa incluir o escopo de autorização e a versão do índice na chave. Projete também a invalidação quando permissões forem revogadas. O isolamento não termina na consulta vetorial: ele se estende a citações, links de download, traces e respostas armazenadas.

5. Meça a recuperação antes de redigir#

Para perguntas com vários trechos relevantes conhecidos, o recall@k expressa que fração deles aparece entre os primeiros k resultados. Se você marca só um documento aceitável, também pode medir a proporção de perguntas em que ele aparece nesse grupo. Defina exatamente a sua unidade de relevância; trocar de documento para chunk muda a interpretação.

ExperimentoO que observar
Só busca léxicaReferências exatas, nomes próprios e códigos de erro.
Busca vetorialParáfrases e vocabulário diferente com o mesmo significado.
Recuperação combinadaCobertura adicional versus custo e complexidade.
Reranking de candidatosOrdem da evidência útil e latência adicionada.

O próximo passo é avaliar a resposta: embasamento nas fontes, contradições, citações que realmente contêm a afirmação e capacidade de se abster. Registre também a ausência de evidência. Um sistema que sempre responde pode parecer ter uma experiência excelente e ainda assim ter baixa confiabilidade.

6. Migre com uma comparação em paralelo#

Construa o novo índice ao lado do anterior e reproduza um conjunto de consultas autorizado sobre os dois. Revise qualidade, permissões, latência e custo antes de mudar a leitura. Mantenha um cursor de ingestão para incorporar as modificações que acontecerem durante a migração. A troca precisa incluir um ponto claro de rollback.

Orce a ingestão inicial, as atualizações, os vetores armazenados, o índice de busca e o contexto enviado ao gerador. A tarifa de embeddings cobre só uma parte. Use o comparador para escolher candidatos e confirme o resultado com o seu corpus, principalmente se ele tiver código, imagens ou documentos multilíngues.

Documentação: Cohere: modalidades e dimensões do Embed ↗

Fontes e escopo

Documentação consultada em 25 de setembro de 2026. Os exemplos e critérios de decisão são propostas editoriais; adapte-os ao contrato da sua aplicação e valide-os no seu ambiente de testes autorizado.

Do design à decisão

Compare modelos de embeddings

Confira preços, limites, condições e fontes de cada opção.

Abrir comparador