Une application RAG (Retrieval-Augmented Generation) moderne permettant de poser des questions intelligentes sur vos documents PDF. Construite avec les dernières technologies web et IA.
Note : Ce projet est un proof-of-concept focalisé sur l'apprentissage et la compréhension des systèmes RAG. L'authentification n'a pas été implémentée volontairement pour se concentrer sur l'aspect technique du RAG.
- 📄 Upload de documents PDF - Importez vos documents pour les interroger
- 💬 Chat intelligent - Posez des questions en langage naturel
- 🔍 Recherche contextuelle - Réponses basées sur le contenu de vos documents
- 🎨 Interface moderne - Design épuré et responsive
- ⚡ Performance optimale - Réponses rapides grâce à Neon Database
- 🧠 Embeddings vectoriels - Utilise Google text-embedding-004 (768 dimensions)
- 🚀 Recherche HNSW - Algorithme optimisé pour la recherche sémantique
- React - Bibliothèque UI
- Next.js - Framework React avec SSR
- TypeScript - Typage statique
- Tailwind CSS - Styling moderne
- Vercel AI SDK - Intégration IA simplifiée
- Google AI - Modèle de langage Gemini
- Google text-embedding-004 - Génération d'embeddings (768D)
- Neon - PostgreSQL serverless avec pgvector
- Drizzle ORM - ORM TypeScript moderne et performant
Node.js 18+
npm ou yarn
Compte Neon Database (avec extension pgvector)
Clé API Google AI- Cloner le repository
git clone https://github.com/votre-username/rag-assistant.git
cd rag-assistant- Installer les dépendances
npm install
# ou
yarn install- Configuration des variables d'environnement
Créez un fichier .env.local à la racine du projet :
# Neon Database (avec pgvector activé)
DATABASE_URL=your_neon_database_url
# Google AI
GOOGLE_AI_API_KEY=your_google_ai_api_key
# Next.js
NEXT_PUBLIC_APP_URL=http://localhost:3000- Initialiser la base de données
npm run db:push
# ou
yarn db:push- Lancer l'application
npm run dev
# ou
yarn devOuvrez http://localhost:3000 dans votre navigateur.
rag-assistant/
├── app/ # Routes Next.js App Router
│ ├── api/ # API Routes
│ │ └── chat/ # Route API du chat
│ ├── chat/ # Page de chat
│ ├── types/ # Définitions TypeScript
│ ├── upload/ # Page d'upload
│ │ ├── actions.ts # Server Actions
│ │ └── page.tsx # Interface d'upload
│ ├── favicon.ico
│ ├── globals.css
│ ├── layout.tsx # Layout principal
│ └── page.tsx # Page d'accueil
├── components/ # Composants React
│ └── ui/ # Composants UI (shadcn/ui)
├── lib/ # Utilitaires et configurations
│ ├── chunking.ts # Découpage de documents
│ ├── db-config.ts # Configuration Drizzle
│ ├── db-schema.ts # Schéma de la base de données
│ ├── embeddings.ts # Génération d'embeddings
│ ├── search.ts # Recherche vectorielle
│ └── utils.ts # Fonctions utilitaires
├── migrations/ # Migrations SQL Drizzle
│ ├── 0000_narrow_network.sql
│ └── 0001_burly_sersi.sql
├── public/ # Fichiers statiques
├── .clerk/ # Config Clerk (non utilisé)
├── .next/ # Build Next.js
├── node_modules/
├── .env.local # Variables d'environnement
├── .eslintrc.json
├── .gitignore
├── components.json # Config shadcn/ui
├── drizzle.config.ts # Config Drizzle
├── next-env.d.ts
├── next.config.ts
├── package.json
├── postcss.config.mjs
├── README.md
└── tsconfig.json
- Ingestion - Les PDFs sont uploadés et convertis en texte
- Chunking - Le texte est divisé en segments logiques (via
lib/chunking.ts) - Embedding - Chaque segment est transformé en vecteur 768D avec Google text-embedding-004 (via
lib/embeddings.ts) - Stockage - Les vecteurs sont stockés dans Neon PostgreSQL avec l'extension pgvector
- Retrieval - Recherche de similarité cosinus avec index HNSW (via
lib/search.ts) - Generation - Le LLM Gemini génère une réponse contextuelle basée sur les chunks pertinents
User → Upload PDF → Text Extraction → Chunking
↓
Embeddings
↓
Neon Database (pgvector)
User → Question → Similarity Search → Context → LLM → Response
// documents
id: string
userId: string
filename: string
content: text
uploadedAt: timestamp
// chunks
id: string
documentId: string
content: text
embedding: vector(1536)
position: integer
// conversations
id: string
userId: string
createdAt: timestamp
// messages
id: string
conversationId: string
role: enum('user', 'assistant')
content: text
createdAt: timestamp- 📚 Recherche documentaire - Trouvez rapidement des informations dans vos documents
- 📖 Résumés automatiques - Obtenez des synthèses de vos PDFs
- 💼 Assistant professionnel - Interrogez vos rapports, contrats, manuels
- 🎓 Aide aux études - Posez des questions sur vos cours et livres
- Authentification requise pour toutes les opérations
- Isolation des données par utilisateur
- Validation des uploads de fichiers
- Rate limiting sur les requêtes API
- Sanitization des entrées utilisateur
# Installer Vercel CLI
npm i -g vercel
# Déployer
vercelConfigurez les variables d'environnement dans le dashboard Vercel.
# Build
docker build -t rag-assistant .
# Run
docker run -p 3000:3000 --env-file .env.local rag-assistant- ⚡ Temps de réponse moyen : < 2s
- 📦 Taille du bundle : ~150KB (gzipped)
- 🎯 Score Lighthouse : 95+
- 🔄 Support du streaming des réponses
Les contributions sont les bienvenues ! Pour contribuer :
- Forkez le projet
- Créez une branche (
git checkout -b feature/amazing-feature) - Committez vos changements (
git commit -m 'Add amazing feature') - Pushez vers la branche (
git push origin feature/amazing-feature) - Ouvrez une Pull Request
- Support multi-langues
- Upload de documents Word/Excel
- Partage de conversations
- Exportation des chats en PDF
- Mode collaboratif
- API publique
- Application mobile
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Votre Nom
- GitHub: @votre-username
- LinkedIn: Votre Profil
- Portfolio: votre-site.com
⭐ Si ce projet vous a aidé, n'hésitez pas à lui donner une étoile !
Pour toute question ou opportunité professionnelle :
- Email: phanuel.alibia@gmail.com
💼 Disponible pour des opportunités freelance et CDI
