Uma aplicação completa de Retrieval-Augmented Generation (RAG) para busca inteligente em documentos PDF, construída com TypeScript, Node.js e tecnologias modernas de IA.
- Visão Geral
- Tecnologias Utilizadas
- Arquitetura
- Pré-requisitos
- Configuração
- Como Executar
- Como Usar
- Exemplos de Perguntas
- Estrutura do Projeto
- Funcionalidades
- Troubleshooting
Este projeto implementa um sistema RAG completo que permite fazer perguntas em linguagem natural sobre o conteúdo de documentos PDF. O sistema processa documentos, cria embeddings vetoriais, armazena em um banco de dados PostgreSQL com pgVector e responde perguntas usando Google Gemini.
- Ingestão: O sistema carrega e processa documentos PDF, dividindo-os em chunks
- Vetorização: Cada chunk é convertido em embeddings usando Google Gemini
- Armazenamento: Os embeddings são armazenados no PostgreSQL com extensão pgVector
- Busca: Quando você faz uma pergunta, o sistema encontra os chunks mais relevantes
- Geração: O Google Gemini gera uma resposta baseada no contexto encontrado
- Node.js 22+ - Runtime JavaScript
- TypeScript - Linguagem de programação tipada
- LangChain.js - Framework para aplicações de IA
- TSX - Executor TypeScript para desenvolvimento
- PostgreSQL 15 - Banco de dados relacional
- pgVector - Extensão para busca vetorial
- Docker & Docker Compose - Containerização
- Google Gemini API - Modelo de linguagem para embeddings e chat
- models/embedding-001 - Modelo para criar embeddings
- gemini-2.0-flash - Modelo para geração de respostas
- pdf-parse - Extração de texto de PDFs
- RecursiveCharacterTextSplitter - Divisão inteligente de texto
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ PDF Document │ │ Text Splitter │ │ Embeddings │
│ │───▶│ │───▶│ (Gemini) │
│ document.pdf │ │ LangChain.js │ │ │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ User Question │ │ Similarity │ │ PostgreSQL │
│ │───▶│ Search │◀───│ + pgVector │
│ "Qual empresa │ │ │ │ │
│ tem maior │ └──────────────────┘ └─────────────────┘
│ faturamento?" │ │
└─────────────────┘ ▼
▲ ┌──────────────────┐
│ │ Context │
│ │ Assembly │
│ │ │
│ └──────────────────┘
│ │
│ ▼
│ ┌──────────────────┐
│ │ Google Gemini │
└──────────────│ Response │
│ Generation │
└──────────────────┘
- Node.js 22+ instalado
- Docker & Docker Compose instalados
- Google AI Studio API Key (gratuita)
- Git para clonar o repositório
git clone https://github.com/glaucia86/rag-search-ingestion-langchainjs-gemini.git
cd rag-search-ingestion-langchainjs-gemininpm installCrie um arquivo .env na raiz do projeto:
# Google AI API Configuration
GOOGLE_API_KEY=sua_api_key_aqui
# Database Configuration
DB_HOST=localhost
DB_PORT=5432
DB_NAME=rag
DB_USER=postgres
DB_PASSWORD=postgres
# Vector Database Configuration
VECTOR_DIMENSION=768- Acesse Google AI Studio
- Crie uma nova API Key
- Copie e cole no arquivo
.env
docker-compose up -dnpm run dev:ingestnpm run dev:chatApós executar o chat, você verá a interface:
============================================================
🤖 RAG CHAT - Sistema de Perguntas e Respostas em PDF
Powered by Google Gemini + LangChain + pgVector
⚡ TypeScript + Node.js Implementation
============================================================
Sistema pronto! Digite sua pergunta ou "help" para ver comandos.
💬 Faça uma pergunta: _
help- Mostra ajuda e comandos disponíveisstatus- Verifica o status do sistemaclear- Limpa a telaexit- Sai do chat
Qual empresa teve o maior faturamento?
Qual o faturamento da empresa Aliança Energia?
Liste as 5 empresas com maior receita
Quais empresas faturaram mais de 1 bilhão?
Quantas empresas estão listadas no documento?
Qual empresa foi fundada mais recentemente?
Liste empresas fundadas na década de 1990
Qual empresa tem o menor faturamento?
Qual setor tem mais empresas?
Compare o faturamento entre diferentes setores
Qual a média de faturamento das empresas?
Quantas empresas foram fundadas em cada década?
Existe alguma empresa de tecnologia na lista?
Quais empresas têm "Sustentável" no nome?
Liste empresas do setor de energia
Qual empresa do setor automotivo tem maior faturamento?
rag-search-ingestion-langchainjs-gemini/
├── src/
│ ├── chat.ts # Interface de chat interativo
│ ├── search.ts # Pipeline RAG e busca semântica
│ ├── ingest.ts # Processamento e ingestão de PDFs
│ └── google-client.ts # Cliente Google Gemini API
├── docker-compose.yml # Configuração PostgreSQL + pgVector
├── document.pdf # Documento de exemplo
├── package.json # Dependências e scripts
├── tsconfig.json # Configuração TypeScript
├── .env # Variáveis de ambiente (criar)
└── README.md # Esta documentação
chat.ts- Interface principal do usuário com readlinesearch.ts- Implementa o pipeline RAG completo (4 etapas)ingest.ts- Processa PDFs e cria embeddings vetoriaisgoogle-client.ts- Integração com Google Gemini API
- Encontra informações relevantes mesmo com sinônimos
- Busca contextual usando embeddings vetoriais
- Ranking de relevância automático
- Respostas em português natural
- Baseadas exclusivamente no conteúdo do PDF
- Contexto preservado durante a conversa
- Cache de embeddings no PostgreSQL
- Busca vetorial ultrarrápida com pgVector
- Processamento assíncrono
- Validação de entrada robusta
- Fallbacks para problemas de API
- Mensagens de erro amigáveis
# Verificar se PostgreSQL está rodando
docker ps
# Reiniciar containers
docker-compose down
docker-compose up -d- Verifique se a API Key está correta no
.env - Confirme que a API está ativa no Google AI Studio
- Verifique se não há espaços ou caracteres extras
# Executar ingestão novamente
npm run dev:ingest
# Verificar documentos no banco
docker exec postgres_rag_ts psql -U postgres -d rag -c "SELECT COUNT(*) FROM pdf_documents;"- Aguarde alguns minutos (limite de quota)
- Verifique seu plano no Google AI Studio
- Consider usar uma nova API Key se disponível
npm run build # Compila TypeScript para JavaScript
npm run start # Executa versão compilada
npm run dev:chat # Chat interativo (desenvolvimento)
npm run dev:ingest # Ingestão de PDF (desenvolvimento)Contribuições são bem-vindas! Sinta-se à vontade para:
- Fazer fork do projeto
- Criar uma feature branch
- Fazer commit das mudanças
- Criar um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
- Twitter - @glaucia86
- LinkedIn - Glaucia Lemos
- YouTube - Glaucia Lemos
⭐ Se este projeto foi útil, deixe uma estrela no GitHub!