Oii, Marcos! Tudo bem?
É muito legal ver sua atenção aos detalhes durante o vídeo. Essa percepção sobre a repetição dos trechos é um excelente ponto de partida para entendermos melhor como os bancos vetoriais e as buscas semânticas funcionam na prática.
Por que os trechos apareceram duplicados?
A causa mais comum para esse comportamento é a persistência de dados no banco vetorial (ChromaDB). No código do projeto, utilizamos um diretório específico para salvar os dados:
PERSIST_DIRECTORY = "./chroma_rh"
O que acontece é o seguinte:
- Acúmulo de inserções: Se a função que carrega os documentos e cria a Vector Store for executada mais de uma vez sem limpar o banco anterior, o Chroma adiciona os novos embeddings aos que já existiam lá. Como os documentos são os mesmos, ele acaba tendo "cópias" idênticas do mesmo texto com vetores de busca iguais.
- Recuperação (Retrieval): Quando você faz a pergunta, o sistema busca os 8 pedaços mais próximos (conforme definido no parâmetro
k=8 da função similarity_search). Se o banco tem duplicatas, os resultados mais relevantes serão justamente essas cópias idênticas. - Reranking: Mesmo com a etapa de reordenação pelo LLM, ele analisa a relevância de cada pedaço individualmente. Se os textos são iguais, ambos recebem notas altas e acabam figurando entre os 4 melhores que são exibidos na interface.
Como evitar isso no seu projeto?
Pra garantir que sua aplicação não exiba informações repetidas, você pode adotar duas estratégias simples:
- Limpeza do banco: Antes de iniciar um novo carregamento de dados, você pode deletar a pasta
./chroma_rh. Assim, o banco será criado do zero apenas com uma cópia de cada trecho. - Tratamento de duplicatas no código: Você pode implementar uma lógica na função
responder_pergunta pra filtrar documentos que possuam o mesmo conteúdo (page_content) antes de exibi-los ao usuário.
Isso é muito comum em ambientes de desenvolvimento onde testamos o código várias vezes. Na prática, garantir a "unicidade" dos dados no banco de vetores ajuda muito na qualidade da resposta final e economiza processamento do modelo de linguagem.
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!