RAG avec Ollama et Qdrant comme moteur de recherche universel pour ses propres données

Dans un monde de l'information de plus en plus confus, il est de plus en plus important de rendre ses propres bases de données consultables de manière ciblée - non pas par une recherche classique en plein texte, mais par des réponses sémantiquement pertinentes. C'est précisément là qu'intervient le principe de la base de données RAG, c'est-à-dire une solution de recherche assistée par l'IA, qui se compose de deux éléments centraux :


Sujets d'actualité sur l'intelligence artificielle

  1. d'une base de données vectorielle (comme Qdrant), dans laquelle tout contenu est stocké sous forme de vecteurs numériques,
  2. et un modèle linguistique (par exemple via Ollama) qui combine intelligemment les requêtes respectives avec le contenu approprié.

Au lieu de laisser le modèle "deviner", cette architecture utilise ses propres sources de connaissances - comme par exemple :

  • des documentaires rédigés par eux-mêmes,
  • le contenu des pages web,
  • des manuels techniques,
  • Bases de données de support,
  • Listes de questions fréquentes,
  • ou n'importe quelle source de texte archivée (par exemple, à partir d'anciennes bases de données).

Ce qui est décisif : Toutes ces sources peuvent être préparées et "chunkées" (c'est-à-dire découpées en petites unités de texte) au préalable, afin de pouvoir fournir ultérieurement des extraits de texte aussi pertinents que possible pour une question d'utilisateur.

Que l'on souhaite donc rendre analysable une base de connaissances propre, une documentation interne ou des archives de produits entières - avec Ollama + Qdrant réussit à le faire sur son propre Mac, sans contrainte de cloud et avec un contrôle total sur les données.

Qu'est-ce qu'une base de données RAG - et pourquoi même "chunking" ?

RAG est l'abréviation de Retrieval-Augmented Generation, c'est-à-dire qu'il s'agit d'une IA qui génère du texte et qui fournit une aide à la recherche d'informations. Au lieu d'entraîner un modèle linguistique comme GPT, Mistral ou LLaMA uniquement sur ce qu'il "sait" déjà, il peut accéder à des informations supplémentaires qui lui sont propres grâce à une base de connaissances connectée (généralement une base de données dite vectorielle).

exemple :

Si l'on demande à un modèle linguistique : "Que dit ma déclaration d'impôts de 2023 ?", il devra deviner sans avoir accès aux données originales. Mais s'il a accès à une représentation vectorielle de ce document, stockée localement, il peut récupérer les informations correspondantes de manière ciblée et les intégrer dans sa réponse.

Pourquoi les contenus sont "chunkés" ?

Les documents, les pages web ou les livres sont généralement beaucoup trop longs pour être traités ou recherchés en une seule fois. Même les modèles linguistiques modernes ont des limites de jetons - c'est-à-dire une longueur de texte limitée qu'ils peuvent comprendre en une seule fois (souvent environ 4.000 à 8.000 jetons, voire 32.000 ou plus pour les modèles les plus récents).

C'est pourquoi l'astuce suivante est utilisée chez RAG :

  1. Le texte original est divisé en petites sections (chunks).
  2. Chaque chunk est converti en un vecteur par un modèle de langage (embedding).
  3. Ces vecteurs sont stockés dans une base de données telle que Qdrant.
  4. En cas de requête de l'utilisateur, l'invite est également traduite en un vecteur - et les chunks les plus similaires sont récupérés.
  5. Ces contenus sont ensuite ajoutés au modèle linguistique - par exemple par le biais d'une invite système ou d'une injection de contexte.

On obtient ainsi un système qui se comporte comme une mémoire - toutefois sans mots-clés classiques ou recherche plein texte, mais purement basé sur la signification (sémantique).

Conditions préalables et objectif

Nous construisons un système RAG local composé de :

  • un LLM local via Ollama
  • d'une base de données vectorielle appelée Qdrant
  • un script Python qui chunked, vectorise et insère des textes dans la base de données
  • en option : une interface simple ou une API de consultation

Plateforme cible : macOS (Intel ou Apple Silicon)

Condition préalable :

  • macOS 12 ou plus récent (Monterey ou version ultérieure)
  • Connaissances de base sur les terminaux
  • Python 3.10 ou plus récent
  • Facultatif : Homebrew installiert

1ère étape : Ollama 1TP12Animaux

Ollama est un outil léger qui permet de faire fonctionner des modèles linguistiques locaux comme Mistral, LLaMA, Gemma ou Codellama sur son propre ordinateur, même sans Internet.

Installation sur le Mac :

curl -fsSL https://ollama.com/install.sh | sh

Il est également possible de programmer Ollama via Homebrew install :
brew install ollama

Après l'installation :

ollama run mistral

Cela télécharge le modèle Mistral 7B et le démarre localement. Ollama apporte une API REST que nous utiliserons plus tard pour la vectorisation. Tu peux bien sûr utiliser d'autres modèles comme Gemma3 (12B), Mistral Small (24B) ou d'autres LLM.

Étape 2 : Qdrant 1TP12Animaux (base de données locale des vecteurs)

Qdrant est une base de données vectorielle rapide comme l'éclair, basée sur Rust. Elle est gratuite, open source et facile à démarrer sur Mac - de préférence via Docker. Si tu n'as pas encore installé Docker sur ton Mac install, tu peux l'installer sur le site de l'association. Site web de Docker et l'exécuter sur ton Mac en tant qu'application de bureau 1TP12 normale. Tu peux également lancer Docker via Homebrew install si tu utilises déjà Homebrew :

brew install --cask docker

Démarrer ensuite Qdrant via Docker :

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Qdrant sera ensuite joignable à l'adresse suivante :

http://localhost:6333

Pour tester :

curl http://localhost:6333/collections

3e étape : préparer l'environnement Python

Pour le chunking, l'embedding et la communication avec Qdrant, nous avons besoin de Python.

Préparation :

python3 -m venv rag-env
source rag-env/bin/activate
pip install qdrant-client sentence-transformers ollama numpy

Si ollama n'est pas reconnu comme un paquet Python, utilise l'API REST directement par requests :

pip install requests

4e étape : Chunking et embedding

Tu trouveras ci-dessous un exemple de script qui divise un document texte en chunks, crée des embeddings via Ollama et les insère dans Qdrant :

import requests
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct
import uuid

# Konfiguration
CHUNK_SIZE = 500 # Zeichen
COLLECTION_NAME = "mein_rag_wissen"

# Text vorbereiten
with open("mein_text.txt", "r") as f:
text = f.read()

chunks = [text[i:i+CHUNK_SIZE] for i in range(0, len(text), CHUNK_SIZE)]

# Qdrant vorbereiten
client = QdrantClient("localhost", port=6333)

# Neue Collection anlegen (falls noch nicht vorhanden)
client.recreate_collection(
collection_name=COLLECTION_NAME,
vectors_config={"size": 4096, "distance": "Cosine"}
)

def get_embedding_ollama(text):
response = requests.post(
"http://localhost:11434/api/embeddings",
json={"model": "mistral", "prompt": text}
)
return response.json()["embedding"]

# Embeddings erzeugen und in Qdrant speichern
points = []
for i, chunk in enumerate(chunks):
vector = get_embedding_ollama(chunk)
points.append(PointStruct(
id=str(uuid.uuid4()),
vector=vector,
payload={"text": chunk}
))

client.upsert(collection_name=COLLECTION_NAME, points=points)
print(f"{len(points)} Chunks erfolgreich eingefügt.")

Étape 5 : Interrogation via la recherche sémantique

Tu peux maintenant envoyer des requêtes sous forme de vecteur à Qdrant et faire en sorte qu'il trouve les sections de texte les plus pertinentes :

query = "Wie funktioniert ein RAG-System?"
query_vector = get_embedding_ollama(query)

results = client.search(
collection_name=COLLECTION_NAME,
query_vector=query_vector,
limit=3
)

for r in results:
print(r.payload["text"])

Tu peux ensuite transmettre ces chunks à Ollama, par exemple via une invite système, et les faire formuler sous forme de réponse contextuelle.

Chunking + exportation JSON dans FileMaker et autres bases de données

Dans de nombreux cas, le chunking peut déjà être effectué dans une solution de base de données existante - par exemple dans FileMaker. C'est exactement comme cela que cela fonctionne dans mon propre environnement de travail : les données sources - comme le contenu des pages web, les entrées de support ou les articles techniques - sont déjà disponibles sous forme structurée dans FileMaker.

Voici comment se déroule le processus :

  1. Au sein de FileMaker, les textes sont divisés en sections de 300 à 500 caractères par exemple, selon une logique de chunking propre.
  2. Chaque chunk reçoit son propre identifiant ainsi que, le cas échéant, des métadonnées (titre, catégorie, source, langue, etc.).
  3. Tous les chunks sont automatiquement exportés sous forme de fichiers JSON - par exemple dans un répertoire spécifique sur un lecteur réseau ou directement sur le disque dur du serveur d'IA.
  4. Un script Python sur le serveur lit ces fichiers JSON et les enregistre dans la base de données Qdrant.

Exemple de fichier chunk exporté (chunk_00017.json)

{
"id": "00017",
"text": "Dies ist ein einzelner Textabschnitt mit ca. 400 Zeichen, der aus einer größeren Quelle stammt. Er wurde in FileMaker vorbereitet und enthält alle relevanten Inhalte, die für eine semantische Suche benötigt werden.",
"metadata": {
"source": "support_center",
"category": "Fehlermeldung",
"language": "de",
"title": "Drucker wird nicht erkannt"
}
}

Le script d'importation qui s'ensuit peut alors être exécuté automatiquement ou régulièrement via le terminal - par exemple via une tâche cron ou un appel manuel :

python3 import_json_chunks.py /Users/markus/Desktop/chunks/

Le script lit chaque chunk JSON, génère le vecteur correspondant (par ex. via Ollama ou SentenceTransformers) et transmet l'entrée à la base de données Qdrant.

Cette méthode n'est pas seulement transparente, elle se combine aussi très bien avec les structures informatiques existantes - en particulier dans les entreprises qui utilisent déjà FileMaker ou qui, pour des raisons de clarté des processus, aiment tout représenter de manière centralisée et sous contrôle visuel.

Connecter n'importe quelle base de données à ton IA locale

Avec Ollama et Qdrant, il est possible de mettre en place un système RAG complet et performant sur Mac en peu de temps :

  • Local, sans cloud ni abonnement
  • Extensible, avec des contenus propres
  • Sécurité des données, car rien ne quitte l'ordinateur
  • Efficace, car Qdrant reste rapide même sur de grandes quantités de données

Celui qui veut utiliser son IA non seulement pour bavarder, mais aussi comme un véritable système de connaissances et de mémoire, ne peut guère passer à côté de cette combinaison. Et : cela fonctionne déjà avec peu d'efforts - tout en gardant un contrôle total sur ses propres données.


Dernière enquête sur l'utilisation des systèmes d'IA locaux

Quelle est ta position sur les logiciels d'intelligence artificielle fonctionnant en local, comme MLX ou Ollama ?

Perspectives d'avenir : Ce qui sera possible avec RAG, Ollama et Qdrant

La configuration décrite dans cet article constitue la base technique d'une nouvelle forme de gestion des connaissances - locale, contrôlée et extensible de manière flexible. Mais le voyage ne s'arrête pas là. Une fois que l'on a compris l'interaction entre le chunking, l'embedding, la recherche sémantique et les modèles de langage, on se rend vite compte de la polyvalence de cette architecture dans la pratique.

1. connexion à des bases de données propres

Qu'il s'agisse de FileMaker, MySQL, PostgreSQL ou MongoDB, des requêtes ciblées permettent d'extraire régulièrement n'importe quel contenu, de le chunkériser et de l'insérer automatiquement dans la base de données vectorielle. Une base de données classique se transforme ainsi en une source de connaissances pouvant faire l'objet de recherches sémantiques. En particulier dans les systèmes de support, les archives de produits ou les bibliothèques numériques, cela ouvre de toutes nouvelles possibilités d'accès pour les collaborateurs ou les clients.

2. importation automatique de pages web, de PDF ou de documents

Les contenus ne doivent pas être transférés manuellement. Des outils comme BeautifulSoup, readability, pdfplumber ou docx2txt permettent de lire automatiquement des pages web entières, des manuels PDF ou des documents Word, de les mettre en forme de texte et de les préparer pour le chunking. Ainsi, les wikis techniques, les portails clients ou les documentations en ligne, par exemple, peuvent être alimentés régulièrement et de manière actualisée dans la base de données RAG.

3. développement des connaissances à long terme grâce à la structuration

Contrairement à une application d'IA classique qui part de zéro à chaque question, une configuration RAG permet d'élargir et de curater progressivement les connaissances sous-jacentes. En sélectionnant et en préparant les chunks de manière ciblée, on crée sa propre mémoire sémantique, dont la valeur augmente à chaque entrée.

4. connexion avec les graphes de connaissances (Neo4j)

Si l'on veut aller encore plus loin, on peut non seulement classer les informations de manière sémantique, mais aussi les relier de manière logique. Neo4j, une base de données de graphes, permet de visualiser les relations entre les termes, les personnes, les thèmes ou les catégories et de les interroger de manière ciblée. Ainsi, une collection de textes devient un graphe de connaissances structuré qui peut être utilisé aussi bien par l'homme que par l'IA - par exemple pour rendre visibles des chaînes de causalité, des déroulements temporels ou des clusters thématiques.

5. utilisation dans des outils, des applications ou des chatbots personnels

Une fois configurée, la logique RAG peut être intégrée dans presque toutes les applications : comme fonction de recherche sémantique dans une application web interne, comme aide à la saisie intelligente dans un système CRM ou comme chatbot avec sa propre expertise sur le site web de l'entreprise. Grâce à l'utilisation d'API locales (par ex. Ollama REST et Qdrant gRPC), tous les composants restent flexibles et extensibles - même au-delà des frontières classiques de l'entreprise.

Ceux qui ont le courage de se familiariser avec ces outils jettent les bases de systèmes d'IA indépendants et locaux ayant une réelle valeur d'usage, dans un esprit de contrôle, de souveraineté et de clarté technique.


Thèmes actuels autour des logiciels ERP

Foire aux questions sur RAG avec Ollama + Qdrant

1. qu'est-ce qu'une base de données RAG - et à quoi sert-elle ?

Une base de données RAG (Retrieval-Augmented Generation) combine une base de données vectorielle avec un modèle linguistique. Elle permet de rendre ses propres contenus - par exemple des documentations ou des pages web - sémantiquement consultables, de sorte que les modèles d'IA puissent accéder de manière ciblée à des extraits pertinents de sa propre base de données.

2. que signifie "chunking" dans ce contexte ?

Le chunking consiste à découper de longs textes en sections (chunks) plus petites et cohérentes - généralement entre 200 et 500 caractères. Cela permet de stocker efficacement des parties de texte individuelles dans la base de données vectorielle et de les retrouver plus tard en cas de questions.

3. pourquoi ne peut-on pas simplement enregistrer des textes entiers dans Qdrant ?

Parce que les modèles d'IA et les recherches vectorielles fonctionnent avec des longueurs de texte limitées. De grands documents "cacheraient" des contenus importants ou les rendraient imprécis. Le chunking augmente la précision, car des sections ciblées sont comparées au lieu de textes complets.

4. puis-je utiliser des contenus provenant de n'importe quelle source ?

Oui, tant que tu as les textes sous une forme modifiable (par exemple en texte brut, HTML, Markdown, PDF, entrées FileMaker, etc.), tu peux les préparer, les chunk et les intégrer dans Qdrant. Des sources mixtes sont également possibles.

5. dois-je savoir programmer pour construire un tel système ?

Des connaissances de base en Terminal et Python sont utiles, mais pas obligatoires. De nombreuses étapes (par exemple le chunking dans FileMaker, l'exportation JSON) peuvent être réalisées visuellement et de manière automatisée. Le script d'importation Qdrant peut être facilement adapté.

6. puis-je également gérer plusieurs documents ou catégories ?

Oui, chaque chunk peut contenir des métadonnées, par exemple le titre, la source, la langue ou la catégorie. Celles-ci peuvent être prises en compte lors de la recherche afin de filtrer les résultats de manière plus ciblée.

7. quels sont les modèles adaptés à la création d'embeddings ?

Tu peux utiliser soit un modèle local via Ollama (par exemple mistral, llama2, gemma), soit un modèle d'embedding séparé comme all-MiniLM de sentence-transformers. L'important est que le modèle génère des sorties d'embedding sous forme de vecteurs.

8. comment démarrer Qdrant sur Mac ?

Le plus simple est d'utiliser la commande Docker :

docker run -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant

Qdrant fonctionne ensuite sous http://localhost:6333

9. quelle est la taille maximale de mes données ?

Qdrant est très performant et peut gérer sans problème des dizaines ou des centaines de milliers de chunks. La principale limite est celle de la RAM et de la mémoire, pas celle du nombre.

10. est-ce que cela fonctionne aussi avec FileMaker ?

Oui, tu peux faire tout le chunking et l'export JSON directement dans FileMaker. Les chunks sont exportés sous forme de fichiers JSON individuels, qui sont ensuite importés dans Qdrant via un script Python - totalement indépendant du système d'origine.

11. est-ce que je peux aussi faire fonctionner cela sur un autre serveur au lieu de Mac ?

Tout à fait. L'installation fonctionne également sous des serveurs Linux, Raspberry Pi, ou dans le cloud (si on le souhaite). Docker le rend indépendant de la plateforme. Pour une utilisation productive, il est généralement recommandé d'utiliser un serveur avec plus de RAM et un support GPU.

12. comment combiner la recherche vectorielle avec Ollama ?

Tu crées d'abord un vecteur pour une question d'utilisateur via Ollama (Embedding API), tu l'utilises pour rechercher les chunks les plus pertinents dans Qdrant et tu les donnes au modèle linguistique comme contexte. Ollama traite ensuite la question + les informations contextuelles pertinentes et génère une réponse fondée.

Image (c) geralt @ pixabay

Laisser un commentaire