Intermédiaire 18 minRAG

PrivateGPT v2 : chatbot documents 100% privé

PrivateGPT v2 est un chatbot documents 100% privé pour discuter avec ses PDF, Word, Markdown sans qu'un seul octet ne sorte de la machine. La v2 a abandonné son moteur LLM intégré pour s'appuyer sur Ollama : on garde la qualité d'un RAG bien fait, on bénéficie de tous les modèles disponibles via Ollama, et on simplifie radicalement la stack. Ce guide couvre l'installation, la connexion à Ollama et trois cas métiers concrets (RH, juridique, comptable).

Par Mohamed Meguedmi·Màj 2026-06-03·Testé sur Windows, macOS, Linux

#Pourquoi PrivateGPT v2 pour un chatbot documents locaux

Le besoin est classique : pouvoir poser des questions en langage naturel à un corpus de documents internes (contrats, fiches de paie, factures, comptes-rendus) sans envoyer ces données à OpenAI, Anthropic ou Google. C'est exactement ce que vise PrivateGPT depuis la première version sortie en 2023.

La v2 du projet a tranché net : plus de moteur LLM embarqué, plus de gestion de quantization en interne. À la place, PrivateGPT v2 délègue la génération à un backend externe — Ollama dans la majorité des cas. Cela rend le projet bien plus maintenable et donne accès à toute la bibliothèque de modèles Ollama (Mistral, Llama, Qwen, Phi, etc.) sans configuration spécifique.

100% local
Tout tourne sur votre machine. Aucune télémétrie, aucun appel sortant une fois les modèles téléchargés.
UI Gradio incluse
Une interface web s'ouvre sur localhost, prête à chatter avec vos documents — pas besoin de bricoler un front.
API OpenAI-compatible
Le serveur PrivateGPT expose aussi des endpoints REST proches du format OpenAI, utiles si vous voulez le brancher dans une app maison.
Formats supportés
PDF, DOCX, PPTX, MD, TXT, HTML, EPUB, CSV, et plusieurs autres via les loaders LlamaIndex sous-jacents.
i
Architecture en deux blocs
PrivateGPT v2 = pipeline RAG (chunking, embeddings, vector store, retrieval, prompt assembly) + UI Gradio. Ollama = moteur d'inférence LLM. Les deux communiquent en HTTP local sur le port 11434.

#Prérequis

Python 3.11
PrivateGPT v2 ne supporte officiellement que Python 3.11. Avec 3.12+, certaines dépendances cassent encore.
Poetry
Le projet utilise Poetry pour gérer ses dépendances avec extras (ui, llms-ollama, embeddings-ollama, vector-stores-qdrant).
Ollama installé et actif
Daemon Ollama joignable sur http://localhost:11434. Si vous ne l'avez pas, installez-le d'abord — l'installateur prend 3 minutes.
8 Go de RAM minimum
16 Go confortables. Si vous chargez un modèle 7B Q4 en VRAM via Ollama, comptez 5 Go côté GPU en plus.
GPU recommandé (optionnel)
Un RTX 3060 12 Go ou supérieur permet d'utiliser des modèles 7B–14B avec un temps de réponse correct. Sans GPU, restez sur du 3B.
Pas d'Ollama installé ?
Suivez d'abord notre guide d'installation Ollama pour votre OS, puis revenez ici. PrivateGPT v2 part du principe que la commande "ollama run" fonctionne déjà.

#1. Installer PrivateGPT v2

Le projet vit sur GitHub à zylon-ai/private-gpt. On clone, on installe Poetry si ce n'est pas déjà fait, puis on installe les dépendances avec les extras qui correspondent au backend choisi.

Cloner le repo
git clone https://github.com/zylon-ai/private-gpt.git
cd private-gpt
Installer Poetry (si absent)
curl -sSL https://install.python-poetry.org | python3 -
# Ajoutez ~/.local/bin au PATH si ce n'est pas déjà fait
Installer PrivateGPT avec les extras Ollama
poetry install --extras "ui llms-ollama embeddings-ollama vector-stores-qdrant"

Cette commande installe quatre groupes d'extras : l'UI Gradio, le client LLM Ollama, le client d'embeddings Ollama, et Qdrant comme base vectorielle locale embarquée. L'installation prend 5 à 15 minutes selon votre connexion — il y a beaucoup de dépendances scientifiques (numpy, scipy, transformers).

!
Python 3.12 et 3.13 : prudence
Au moment où ces lignes sont écrites, les builds de certaines dépendances natives (notamment llama-index et les composants tokenizers) ne sont pas tous publiés pour 3.12+. Si Poetry vous renvoie des erreurs de compilation, créez un venv Python 3.11 dédié : "pyenv install 3.11.9 && pyenv local 3.11.9".

#2. Configurer Ollama comme backend LLM et embeddings

PrivateGPT v2 utilise un système de profils YAML dans settings/. On active le profil ollama via la variable d'environnement PGPT_PROFILES.

Avant tout, on tire les deux modèles dont on aura besoin : un modèle de génération et un modèle d'embeddings. Pour du français, Mistral 7B est un bon défaut côté LLM, et nomic-embed-text est un excellent choix d'embeddings multilingue léger.

Préparer les modèles dans Ollama
# LLM de génération
ollama pull mistral:7b-instruct-v0.3-q4_K_M

# Modèle d'embeddings (137M, ~280 Mo)
ollama pull nomic-embed-text

On vérifie ensuite le fichier settings/settings-ollama.yaml fourni dans le repo. Il doit pointer vers les bons noms de modèles et la bonne URL d'Ollama :

settings/settings-ollama.yaml
llm:
  mode: ollama
  max_new_tokens: 512
  context_window: 8192

embedding:
  mode: ollama

ollama:
  llm_model: mistral:7b-instruct-v0.3-q4_K_M
  embedding_model: nomic-embed-text
  api_base: http://localhost:11434
  embedding_api_base: http://localhost:11434
  request_timeout: 120.0

vectorstore:
  database: qdrant

qdrant:
  path: local_data/private_gpt/qdrant
Fenêtre de contexte
context_window: 8192 est un compromis raisonnable pour Mistral 7B. Sur un GPU avec plus de VRAM, passez à 16384 ou 32768 pour avaler des documents plus longs sans découpage agressif. Attention : la VRAM utilisée par le KV cache grimpe vite.

#3. Lancer le serveur et l'UI

  1. 01
    Vérifier qu'Ollama tourne
    Tapez "ollama list" dans un terminal. Si la commande répond avec la liste des modèles, le daemon est actif. Sinon, lancez "ollama serve" dans un terminal séparé.
  2. 02
    Activer le profil ollama
    Dans le terminal où vous allez lancer PrivateGPT, exportez la variable PGPT_PROFILES=ollama. C'est ce qui dit au projet de charger settings-ollama.yaml par-dessus settings.yaml.
  3. 03
    Démarrer le serveur
    Depuis la racine du repo, lancez "PGPT_PROFILES=ollama make run". Le serveur démarre sur le port 8001, et Gradio ouvre l'UI sur la même adresse.
  4. 04
    Ouvrir l'UI
    Rendez-vous sur http://localhost:8001 dans votre navigateur. Vous arrivez sur une interface chat avec un panneau latéral pour uploader des documents.
Commande de lancement
PGPT_PROFILES=ollama make run

Au premier lancement, vous verrez dans les logs PrivateGPT contacter Ollama pour vérifier que les modèles déclarés sont disponibles. S'il manque un modèle, le serveur s'arrête avec un message explicite — tirez le modèle manquant avec ollama pull, puis relancez.

#4. Indexer ses documents

L'UI Gradio propose un onglet "Ingest" où l'on glisse-dépose ses fichiers. En coulisses, PrivateGPT découpe chaque document en chunks (par défaut ~1024 tokens avec un overlap de 200), calcule les embeddings via Ollama, et stocke le tout dans Qdrant.

PDF
Texte extrait via pypdf. Les PDF scannés (image-only) ne sont pas OCRisés — passez par un outil comme ocrmypdf avant l'ingestion.
DOCX / PPTX
Pris en charge nativement par les loaders LlamaIndex. Tableaux et listes sont préservés en texte brut.
Markdown / TXT / HTML
Indexation immédiate, c'est le format qui marche le mieux pour le RAG en pratique.
CSV
Chaque ligne devient un chunk. Utile pour des bases de FAQ ou des extracts métier.
!
Temps d'indexation à anticiper
L'ingestion appelle Ollama pour calculer les embeddings, document par document. Sur CPU pur, comptez ~5 secondes par page de PDF. Sur GPU, c'est presque instantané. Pour ingérer 500 PDF, prévoyez large et lancez en lot via l'API plutôt que par drag-and-drop.
Ingestion en lot via le script CLI
# Depuis la racine du repo private-gpt
python scripts/ingest_folder.py /chemin/vers/mes/documents \
  --watch  # surveille en continu les nouveaux fichiers

#Cas d'usage métiers concrets

#RH : interroger les fiches de paie et conventions collectives

Cas typique : un service RH avec 200 fiches de paie mensuelles archivées en PDF, plus la convention collective de la branche (souvent 100+ pages). PrivateGPT v2 permet à un collaborateur RH de poser des questions du type "Quel est le coefficient de Mme Dupont en 2025 ?" ou "Que dit la convention collective sur les jours pour enfant malade ?".

Modèle recommandé
Mistral 7B Q4 suffit pour de l'extraction factuelle. Pour de l'interprétation juridique de la convention, montez à Qwen2.5 14B ou Mistral Small 24B si la VRAM suit.
Découpe
Pour les fiches de paie (1 page), un chunk = un document. Pour la convention, le chunking par section (titre H2/H3) marche mieux que le chunking par tokens.
Confidentialité
C'est précisément le cas où PrivateGPT v2 fait la différence : les fiches de paie ne devraient jamais transiter par un service cloud, y compris en mode "entreprise".

#Juridique : analyser un portefeuille de contrats

Cas typique : un service juridique avec quelques centaines de contrats clients/fournisseurs en PDF, parfois scannés. Les questions courantes : "Quels contrats expirent dans les 6 prochains mois ?", "Quelle clause de résiliation s'applique au contrat ACME ?", "Lesquels contiennent une clause d'exclusivité ?".

Pré-traitement
Lancez ocrmypdf sur les scans avant ingestion. Sans OCR, ces PDF sont invisibles pour le retrieval.
Modèle recommandé
Mistral Small 24B ou Qwen2.5 14B Q4 pour la qualité de raisonnement juridique en français. Llama 3.1 8B suffit pour de la recherche pure.
Prompt système
Définissez un system prompt qui contraint à citer le nom du contrat et le numéro de clause à chaque réponse — sinon le modèle a tendance à synthétiser sans sourcer.
i
Toujours vérifier les sources
L'UI Gradio de PrivateGPT v2 affiche les chunks récupérés sous la réponse. Pour un usage juridique sérieux, traitez les réponses comme des pistes et vérifiez systématiquement le passage source — un RAG, c'est de la recherche assistée, pas un avis juridique automatique.

#Comptable : interroger un dossier de factures et de relevés

Cas typique : un cabinet comptable qui veut interroger un corpus de factures fournisseurs et de relevés bancaires d'un client (PDF + CSV). Questions visées : "Quel est le total des factures Free Mobile en 2025 ?", "Y a-t-il une facture impayée chez le fournisseur X ?".

Limite à connaître
Le RAG n'agrège pas naturellement : il retrouve les passages pertinents mais ne fait pas la somme parfaitement sur de gros volumes. Pour de l'analytique stricte, exportez le CSV des factures dans un outil dédié et utilisez PrivateGPT pour le contexte qualitatif.
Format à privilégier
Les CSV de comptabilité s'indexent ligne par ligne — c'est bien pour la recherche unitaire, mauvais pour les calculs. Joignez un PDF de synthèse par mois si vous voulez que le LLM ait une vue d'ensemble.
Modèle
Qwen2.5 14B est très solide sur les chiffres et la lecture de tableaux comparé à un Mistral 7B. Si vous avez un RTX 4070 ou plus, c'est le choix par défaut ici.

#Dépannage courant

"Connection refused" au démarrage
Le daemon Ollama n'est pas lancé. Vérifiez avec "curl http://localhost:11434" — vous devez voir "Ollama is running".
Réponses très lentes
Soit Ollama tourne sur CPU (vérifiez avec "ollama ps" — colonne PROCESSOR), soit votre context_window est trop élevée. Réduisez à 4096 pour tester.
"Model not found"
Le nom du modèle dans settings-ollama.yaml doit correspondre exactement à un modèle listé par "ollama list". Attention aux tags de quantization : mistral:7b ≠ mistral:7b-instruct-v0.3-q4_K_M.
Embeddings différents entre ingestion et requête
Si vous changez de modèle d'embeddings après une ingestion, vous devez ré-indexer. Supprimez local_data/private_gpt/qdrant/ et relancez l'ingestion.
UI Gradio inaccessible
Si vous êtes sur une machine distante, lancez avec "PGPT_PROFILES=ollama python -m private_gpt" et reconfigurez l'host dans settings.yaml (server.host: 0.0.0.0).

#Pour aller plus loin

PrivateGPT v2 est un excellent point d'entrée pour du RAG documentaire local, mais ce n'est qu'une brique. Quelques pistes pour aller plus loin :

RAG sans coder avec Open WebUI ou AnythingLLM
Si PrivateGPT vous semble lourd à installer (Poetry, Python 3.11), Open WebUI propose une expérience RAG comparable, plus simple à déployer en Docker.
Embeddings français performants
nomic-embed-text fait le job, mais des modèles spécialisés FR comme Solon ou BGE-M3 donnent de meilleurs résultats sur du contenu juridique ou administratif français.
Stratégies de chunking avancées
Le chunking par section (markdown headers, structure DOCX) bat largement le chunking par tokens fixes sur les corpus structurés — un gain de pertinence facile à obtenir.
Ce guide vous a aidé ?

Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.