Sistema de perguntas e respostas baseado em documentos PDF utilizando RAG (Retrieval Augmented Generation) com LangChain e ChromaDB.
- Python 3.8+
- Chave de API da OpenAI
- Arquivos PDF para base de conhecimento
Clone o projeto
git clone https://github.com/arkmedess/RAG_Python.git
cd RAG_PythonInstale as dependências
pip install -r requirements.txtConfigure as variáveis de ambiente criando um arquivo .env:
OPENAI_API_KEY=sua-chave-api-aqui
RAG_Python
├── base/ # Diretório para armazenar arquivos PDF
├── db/ # Variáveis de ambiente
├── scripts/ # Diretório para scripts
│ ├── criar_db.py
│ └── main.py
├── src/ # Módulos Python
│ └── rag_app/
│ ├── config.py
│ ├── database.py
│ ├── generation.py
│ ├── retrieval.py
│ └── __init__.py
├── tests/ # Diretório para testes
│ ├── conftest.py
│ ├── test_database.py
│ ├── test_generation.py
│ ├── test_retrieval.py
│ └── __init__.py
├── .gitignore
├── README.md
├── requirements-dev.txt
├── requirements.txt
└── setup.py # Arquivo de configuração da instalação
-
Coloque seus arquivos PDF na pasta
base/. -
Crie os bancos vetoriais (um por arquivo). O script vai listar os PDFs e você poderá processar um, vários ou todos. Cada PDF gera um diretório em
db/<nome_do_arquivo>/que contém a base vetorial.
python .\criar_db.py- Ao executar
main.pyo script lista as bases vetoriais disponíveis (subpastas dedb/). Escolha a base desejada antes de fazer a pergunta.
python .\main.pyO sistema opera em duas fases principais:
-
Criação da Base de Conhecimento (
criar_db.py):- Carregamento: Documentos PDF são carregados da pasta
base/. - Divisão: O texto é segmentado em
chunks(pedaços) para otimizar a busca de contexto. - Embedding: Cada
chunké transformado em um vetor numérico usando um modelo de embedding da OpenAI. - Armazenamento: Os vetores são armazenados no ChromaDB, criando um banco de dados vetorial para cada PDF.
- Carregamento: Documentos PDF são carregados da pasta
-
Geração de Respostas (
main.py):- Pergunta do Usuário: O usuário insere uma pergunta via terminal.
- Busca (Retrieval): A pergunta é convertida em um vetor e usada para buscar os
chunksmais relevantes (similares) no ChromaDB. - Aumento (Augmentation): Os
chunksrecuperados são inseridos em um prompt juntamente com a pergunta original. - Geração (Generation): O prompt final é enviado a um modelo de linguagem da OpenAI (
gpt-4o-mini), que gera uma resposta com base no contexto fornecido.
- Criação de Banco Vetorial: Criação automática de um banco vetorial Chroma por PDF.
- Processamento em Lote: Suporte para processar múltiplos PDFs de uma só vez.
- Busca Semântica: Recuperação de contexto baseada em similaridade semântica.
- Monitoramento de Custo: Contagem de tokens de entrada e saída.
- Interface Interativa: Seleção de arquivos e bases de conhecimento via CLI.
- Testes: Cobertura de testes com
pytestpara garantir a qualidade do código.
Python Packages:
- langchain-community
- langchain-text-splitters
- langchain-chroma
- langchain-openai
- python-dotenv
- tiktoken
Serviços:
- OpenAI API (para embeddings e LLM)
- ChromaDB (banco de dados vetorial)
O projeto inclui testes baseados em pytest (arquivo tests/). Para executar os testes locais use:
pip install pytest
pytest -qOs testes cobrem funções de carregamento, divisão e recuperação (ver diretório tests/).
As principais configurações do sistema podem ser ajustadas no arquivo src/rag_app/config.py:
MODEL_NAME: Modelo de linguagem da OpenAI usado para geração de respostas. (Padrão:gpt-4o-mini)TEMPERATURE: Controla a criatividade da resposta. Valores mais baixos tornam a resposta mais centrada. (Padrão:0.2)CHUNK_SIZE: Tamanho máximo de cadachunkde texto (em caracteres). (Padrão:2000)CHUNK_OVERLAP: Número de caracteres sobrepostos entrechunksadjacentes para manter a continuidade do contexto. (Padrão:500)K_RETRIEVER: Número dechunksrelevantes a serem recuperados do banco de dados vetorial. (Padrão:3)SCORE_THRESHOLD: Limiar de similaridade para considerar umchunkcomo relevante. (Padrão:0.5)PROMPT_TEMPLATE: Template do prompt usado para gerar a resposta, formatado para instruir o modelo de linguagem sobre o estilo e o conteúdo esperados.
- Requer chave de API válida da OpenAI
- Processamento limitado ao conteúdo dos PDFs fornecidos
- Consumo de tokens da API OpenAI
- A chave da OpenAI deve ser armazenada no
.env, não versione este arquivo (o.gitignorejá exclui.env). - A variável deve estar nomeada exatamente como
OPENAI_API_KEY, o código localiza automaticamente essa variável compython-dotenvpara carregá-la.
- Ajuste
chunk_sizeechunk_overlapemcriar_db.pyconforme sua necessidade de granularidade. - Caso precise processar coleções muito grandes, considere processamento por lotes e limpeza de dados antes de criar embeddings.