Oi, Gustavo!.
Primeiro, vale separar dois problemas que costumam ser confundidos:
- Recuperação ruim: o retriever trouxe trechos que não contêm a resposta (por similaridade semântica superficial, chunk mal cortado, pergunta ambígua).
- Alucinação propriamente dita: o contexto até tinha (ou não tinha) a informação, mas o modelo inventou algo que não está lá.
O caso que você descreveu é o primeiro, e ele frequentemente causa o segundo, o modelo recebe um contexto irrelevante e, pressionado a responder, preenche as lacunas. Por isso o tratamento é em camadas, não numa solução única.
1. Prompt (a camada mais barata e a primeira a aplicar)
Instrua explicitamente o modelo a responder somente com base no contexto e a admitir quando não encontrar. Algo como:
Responda exclusivamente com base nos trechos fornecidos em <contexto>. Se os trechos não contiverem informação suficiente para responder à pergunta, responda apenas: "Não encontrei essa informação na base de conhecimento." Não use conhecimento próprio nem faça inferências além do contexto.
Isso resolve boa parte dos casos, mas não é garantia, é instrução, não trava.
2. Melhorar a recuperação
- Revisar a estratégia de chunking (tamanho e overlap). Chunk grande demais dilui o embedding; pequeno demais corta a resposta ao meio. No Bedrock Knowledge Bases dá para testar fixed-size, hierarchical e semantic chunking.
- Busca híbrida (semântica + palavra-chave), que ajuda quando a pergunta tem termos técnicos, códigos ou nomes próprios.
- Filtros por metadados, quando a base tem documentos de domínios distintos.
- Reescrita da query antes da busca, a pergunta do usuário nem sempre é o melhor texto para buscar.
3. Reranking
Em vez de mandar direto os top-k da busca vetorial para o LLM, um modelo reranker reordena os trechos por relevância real à pergunta. Ele calcula a relevância dos chunks em relação à query e reordena os resultados pelas pontuações, o que permite recuperar menos trechos, porém mais relevantes, reduzindo também custo e latência. O Bedrock oferece isso pela Rerank API, e no Knowledge Bases basta habilitar nas operações Retrieve e RetrieveAndGenerate. É provavelmente o melhor custo-benefício para o problema exato que você descreveu.
4. Guardrails com contextual grounding check
Essa é a trava de verdade. O Amazon Bedrock Guardrails oferece checagem de embasamento contextual para detectar e filtrar alucinações, gerando pontuações de confiança de grounding e relevance para cada resposta, com limiares configuráveis para filtrar o que ficar abaixo do mínimo aceitável. Repare que são duas métricas diferentes e a segunda é exatamente o seu caso: grounding verifica se a resposta está apoiada nos trechos; relevance verifica se ela de fato responde à pergunta feita. Se a resposta ficar abaixo do limiar, ela é bloqueada e você devolve uma mensagem de fallback em vez de uma resposta enganosa.
5. Citações e avaliação
Sempre devolva as fontes junto da resposta, o Knowledge Bases já retorna as citações. Isso permite que a própria pessoa perceba quando o embasamento não bate. E, num projeto real, vale montar um conjunto de perguntas de teste e medir métricas como faithfulness (fidelidade ao contexto) e context recall antes e depois de cada ajuste, senão você fica otimizando no escuro.
A ordem que eu sugiro é: ajustar o prompt → medir → mexer em chunking/busca → adicionar reranker → colocar o Guardrails como rede de segurança final.
Espero ter ajudado, Gustavo.
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!