Projeto M9, Assistente sobre Documentos com RAG

Assistente educacional que responde perguntas com base em um conjunto de notas de aula, usando Retrieval-Augmented Generation. É o projeto que fecha o Módulo 9 e reúne tudo o que ele ensinou.

O que o assistente faz

  • Indexa notas de aula com metadados (a disciplina de cada trecho).
  • Recupera os trechos mais relevantes para uma pergunta, por similaridade.
  • Filtra a busca por disciplina, quando pedido.
  • Monta o contexto citando as fontes e instrui o modelo a usar só elas.
  • Trata a ausência: se nada relevante é encontrado, admite que não sabe, em vez de inventar.
  • Gera a resposta com um LLM local via Ollama, com um fallback extrativo quando o Ollama não está disponível.

Como rodar

O assistente roda do zero, só com a biblioteca padrão do Python, sem instalar nada.

# Demonstração de ponta a ponta
python rag_assistant.py

A demonstração responde a três perguntas, uma de cálculo, uma de álgebra (filtrando a disciplina) e uma fora do material, mostrando o tratamento da ausência.

Usando no seu código

from rag_assistant import AssistenteRAG, Documento

assistente = AssistenteRAG()
assistente.indexar([
    Documento("A derivada mede a taxa de variação de uma função.", "calculo"),
    Documento("Uma matriz organiza números em linhas e colunas.", "algebra"),
])

r = assistente.responder("o que é a derivada?")
print(r.resposta)
print("Fontes:", r.fontes)
print("Encontrou no material:", r.encontrou)

Testes

Os testes não dependem de Ollama nem de bibliotecas externas. Eles exercitam a recuperação, o filtro por disciplina e o tratamento da ausência.

pytest projects/m09-rag-assistant/

Como melhorar (próximos passos sugeridos)

  • Trocar o embedding TF-IDF por um Sentence Transformer, para busca por sentido.
  • Trocar o banco vetorial em memória pelo ChromaDB ou pelo Qdrant.
  • Adicionar chunking dos documentos longos, como na Aula 2.
  • Avaliar a fidelidade das respostas às fontes citadas.

Decisões de projeto

O assistente foi escrito do zero, com TF-IDF e busca por cosseno, para que toda a lógica de RAG fique visível e rode sem dependências. As versões com embeddings densos e bancos vetoriais de produção aparecem como caminhos opcionais nas aulas e nos notebooks do módulo. A remoção de stopwords, do Módulo 3, é usada para evitar casamentos espúrios por preposições e artigos.