Skip to content

Arkmedess/DocQuery-Python

Repository files navigation

DocQuery - Python

Sistema de perguntas e respostas baseado em documentos PDF utilizando RAG (Retrieval Augmented Generation) com LangChain e ChromaDB.

Requisitos

  • Python 3.8+
  • Chave de API da OpenAI
  • Arquivos PDF para base de conhecimento

Instalação

Clone o projeto

git clone https://github.com/arkmedess/RAG_Python.git
cd RAG_Python

Instale as dependências

pip install -r requirements.txt

Configure as variáveis de ambiente criando um arquivo .env:

OPENAI_API_KEY=sua-chave-api-aqui

Estrutura do Projeto

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

Uso

  1. Coloque seus arquivos PDF na pasta base/.

  2. 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
  1. Ao executar main.py o script lista as bases vetoriais disponíveis (subpastas de db/). Escolha a base desejada antes de fazer a pergunta.
python .\main.py

Como Funciona

O sistema opera em duas fases principais:

  1. 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.
  2. 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 chunks mais relevantes (similares) no ChromaDB.
    • Aumento (Augmentation): Os chunks recuperados 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.

Funcionalidades

  • 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 pytest para garantir a qualidade do código.

Stack Utilizada

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)

Testes

O projeto inclui testes baseados em pytest (arquivo tests/). Para executar os testes locais use:

pip install pytest
pytest -q

Os testes cobrem funções de carregamento, divisão e recuperação (ver diretório tests/).

Configurações

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 cada chunk de texto (em caracteres). (Padrão: 2000)
  • CHUNK_OVERLAP: Número de caracteres sobrepostos entre chunks adjacentes para manter a continuidade do contexto. (Padrão: 500)
  • K_RETRIEVER: Número de chunks relevantes a serem recuperados do banco de dados vetorial. (Padrão: 3)
  • SCORE_THRESHOLD: Limiar de similaridade para considerar um chunk como 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.

Limitações

  • Requer chave de API válida da OpenAI
  • Processamento limitado ao conteúdo dos PDFs fornecidos
  • Consumo de tokens da API OpenAI

Segurança e .env

  • A chave da OpenAI deve ser armazenada no .env, não versione este arquivo (o .gitignore já exclui .env).
  • A variável deve estar nomeada exatamente como OPENAI_API_KEY, o código localiza automaticamente essa variável com python-dotenv para carregá-la.

Observações finais

  • Ajuste chunk_size e chunk_overlap em criar_db.py conforme sua necessidade de granularidade.
  • Caso precise processar coleções muito grandes, considere processamento por lotes e limpeza de dados antes de criar embeddings.

Autor

@arkmedess

About

Projeto voltado ao uso de RAG com IA para busca baseada em chunks

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages