Deep dive into AI world : Mise en place dâune pipeline RAG avec Kotaemon
The future is now ! Bonjour Ă tous, aprĂšs quelques mois dâabsence dus Ă de nombreux side projects, je suis de retour sur le blog avec un nouvel article qui, jâespĂšre, va plaire au plus grand nombre dâentre vous. Dans celui-ci, je vous propose de plonger au cĆur du fonctionnement dâun systĂšme RAG (Retrieval-Augmented Generation) afin que vous puissiez en crĂ©er un vous-mĂȘme chez vous sur un serveur Linux. Je nâĂ©pilogue pas plus, place Ă la technique !
I. Environnement des tests et prérequis
- Ubuntu 24.04.1 â Version du noyau : 6.8.0-49-generic
- Docker (27.3.1 dans mon cas)
- Pour ceux qui nâauraient pas encore Docker installĂ© sur leurs postes, je vous encourage vivement Ă utiliser le script dâautoconfiguration proposĂ© par Docker. En effet, la version disponible dans le rĂ©fĂ©rentiel apt dâubuntu nâest pas Ă jour.
- Voici, comment installer docker
curl https://get.docker.com/ | sh
- LLMs utilisés :
- nomic-rmbed-text
- llama3.1:8b
- « Orchestrateur » : Kotaemon
II. Quâest-ce quâune pipeline RAG ?
Une pipeline RAG (Retrieval-Augmented Generation) est une architecture utilisĂ©e en intelligence artificielle pour combiner des capacitĂ©s de recherche « documentaire » et de gĂ©nĂ©ration de texte afin de rĂ©pondre Ă des questions se basant sur un contenu externes (fichiers). LâidĂ©e principale est de complĂ©ter un modĂšle gĂ©nĂ©ratif « classique » en lâaidant Ă puiser dans une base de connaissances « externe » pour produire des rĂ©ponses plus prĂ©cises, Ă jour et fiables.
Une pipeline RAG regroupe donc deux grandes Ă©tapes :
- Recherche dâinformations (« retrieval« ).
- Assuré par le LLM nomic-embed-text dans cet article
- Génération de la réponse (« generation« ).
- Assuré par le LLM Llama dans cet article

Une fois les documents indexĂ©s, voici Ă quoi ressemble le workflow dâune requĂȘte dâun point de vu utilisateur.
a) Ingestion et préparation des données
- Les documents quâon souhaite indexer pour former notre base documentaire sont indexĂ©s dans une base de donnĂ©es adaptĂ©e Ă la recherche rapide, souvent sous forme de vecteurs.
- Cette Ă©tape convertit les donnĂ©es en reprĂ©sentations numĂ©riques comprĂ©hensibles par les modĂšles dâIA.
b) Recherche dâinformation (retrieval)
- Lorsquâune question est posĂ©e, un module de recherche trouve les documents ou passages les plus pertinents Ă partir de la base indexĂ©e (Câest en quelque sorte un « giga » Ctrl +F). Ce module utilise des embeddings* gĂ©nĂ©rĂ©s par des modĂšles comme nomic-embed-text pour effectuer des correspondances sĂ©mantiques.
Cliquez ici pour plus dâinformation sur la notion dâembeddingsâŠ
Les embeddings sont des reprĂ©sentations vectorielles de donnĂ©es, telles que des mots, phrases transformĂ©es en vecteurs numĂ©riques. Ces vecteurs capturent les relations sĂ©mantiques, permettant aux modĂšles de comparer des Ă©lĂ©ments similaires plus facilement. Ils sont utilisĂ©s pour simplifier et amĂ©liorer des tĂąches comme la recherche dâinformation connexes. Voici un exemple concret dâun embedding sous forme de vecteur pour le mot « chat ». Imaginons que nous utilisons un modĂšle de langage qui transforme des mots en vecteurs Ă 3 dimensions :
Mot : « chat »
Vecteur dâembedding :
[0.2,â0.3,0.8]
Chaque composant du vecteur reprĂ©sente une caractĂ©ristique du mot, comme sa relation avec dâautres mots ou son contexte. Par exemple :
- 0.2 pourrait reprĂ©senter lâassociation avec des animaux domestiques.
- -0.3 pourrait représenter son lien avec des animaux féroces (moins fort).
- 0.8 pourrait ĂȘtre liĂ© Ă des concepts comme « mignon », « poils », ou « ronronner ».
Les mots ayant un sens similaire, comme « felin » ou « animal », auraient des vecteurs proches de « chat ».
c) Consolidation des informations récupérées
- Les informations pertinentes (passages trouvĂ©s) extraites grĂące Ă nomic-embed-text sont regroupĂ©es par lâintermĂ©diaire dâun « orchestrateur » (ici Kotaemon) et transmises au modĂšle gĂ©nĂ©ratif (Llama) comme contexte.
d) Génération de la réponse (generation)
- Le modÚle LLM (Llama) prend ensuite le relais et utilise les informations fournies par la recherche précédente pour générer une réponse complÚte, concise et contextuelle.
Voici le resumé des étapes : B,C,D en un schéma :

source : https://www.aproductstory.com/p/retrieval-augmented-generationrag
Comme toute avancĂ©e technologique, une architecture RAG nâoffre pas que des avantages. Voici un tableau des principaux pros/cons :
Aspect | Description |
---|---|
Avantages dâune pipeline RAG | |
Améliore la précision | Les LLM sont souvent limités par leur date de mise à jour. En combinant une recherche dynamique, on pallie cette limite. |
Réduit les hallucinations | Le LLM est « guidé » par des données précises, ce qui diminue les risques de réponses inventées. |
Personnalisation | La recherche peut ĂȘtre configurĂ©e pour fonctionner sur des donnĂ©es spĂ©cifiques (ex : documentations interne). |
Limitations dâune pipeline RAG | |
ComplexitĂ© de mise en Ćuvre | NĂ©cessite de configurer un systĂšme de recherche performant (indexation, embeddings, types de fichiers supportĂ©s) et de le connecter aux LLMs sous-jacent. |
Performances dĂ©pendantes des donnĂ©es | Si les donnĂ©es sont mal structurĂ©es ou absentes, la qualitĂ© du pipeline sâeffrite |
CoĂ»ts en calcul | LâĂ©tape dâembedding et de recherche est gourmande en ressources. Cela dĂ©pend de la taille des fichiers Ă indexer. |
Maintenant que nous avons vu en quoi consiste une architecture RAG, passons Ă sa construction.
III. Installation et configuration dâOllama
Warning : La diffĂ©rence entre Ollama et Llama est importante, car ces deux termes dĂ©signent des outils distincts, mĂȘme si, syntaxiquement, ils sont proches. Llama (Large Language Model Meta AI) est une famille de modĂšles de langage dĂ©veloppĂ©e par Meta, conçue pour la gĂ©nĂ©ration et la comprĂ©hension de texte. En revanche, Ollama est une plateforme qui facilite lâutilisation et le dĂ©ploiement de modĂšles comme Llama. Ollama agit comme un cadre pratique, permettant dâinstaller, gĂ©rer et interagir avec des modĂšles de langage, tout en offrant des outils supplĂ©mentaires pour simplifier leur intĂ©gration dans des applications, notamment les architectures RAG.
Voici les points essentiels de son fonctionnement :
- ExĂ©cution locale : Ollama permet dâhĂ©berger et dâexĂ©cuter des modĂšles de langage directement sur ton ordinateur, ce qui garantit la confidentialitĂ© des donnĂ©es.
- « Catalogue » de modĂšles : La plateforme propose un « hub » de modĂšles prĂ©entraĂźnĂ©s quâon peut tĂ©lĂ©charger et utiliser facilement. (mĂȘme principe que le docker hub / vagrant hub)
- FacilitĂ© dâutilisation : Une interface en ligne de commande « docker like* » simple pour charger et interagir avec les modĂšles.
- Optimisation : Compatible avec du matĂ©riel grand public, comme des GPU et CPU** standards, grĂące Ă lâoptimisation des modĂšles pour les environnements locaux.
- ConfidentialitĂ© : IdĂ©al pour la souverainetĂ© des donnĂ©es, car Ollama peut ĂȘtre installĂ© « on-premise ».
*Ollama utilise Docker comme sous-couche pour isoler et gĂ©rer les environnements nĂ©cessaires Ă lâexĂ©cution des modĂšles de langage.
**Pour rappel, Ollama peut fonctionner en mode CPU-only, câest-Ă -dire sans recourir Ă une carte graphique dĂ©diĂ©e. Bien que ce mode soit plus lent, car toutes les ressources de calcul reposent sur le CPU, il rend possible lâexĂ©cution locale dâun LLM sur un ordinateur standard, accessible Ă presque tout le monde.
Un script dâautosetup est fourni par le site officiel, prenant en charge la plupart des distributions connues. Pour ceux qui prĂ©fĂšrent une solution entiĂšrement basĂ©e sur Docker, il est Ă©galement possible dâutiliser Docker pour installer Ollama. Cependant, cela ajoute une couche dâabstraction supplĂ©mentaire, qui peut parfois ĂȘtre contre-productive, notamment lorsquâil sâagit dâintĂ©grer des ressources externes dans une architecture RAG, car ces derniĂšres ne sont pas toujours conçues pour fonctionner de cette maniĂšre.
curl -fsSL https://ollama.com/install.sh | sh
DÚs lors, il faut démarrer le service Ollama :
sudo systemctl start ollama
Si-vous souhaitez quâOllama sâinstancie dĂšs que votre ordinateur/serveur dĂ©marre (optionnel) :
sudo systemctl enable ollama
Pour vous assurer que votre installation dâOllama fonctionne correctement, il est recommandĂ© de vĂ©rifier son statut et dâinstancier un LLM simple pour effectuer un test rapide.

ollama run gemma:2b
prompt : Bonjour, qui est-tu ?

IV. Installation et configuration de Kotaemon
Kotaemon est une plateforme open source conçue pour crĂ©er une architecture RAG en interfaçant plusieurs LLM. Elle permet de structurer, interroger et extraire des informations Ă partir de grandes quantitĂ©s de donnĂ©es textuelles. Elle simplifie lâindexation des documents (phase dâembedding), la recherche contextuelle sĂ©mantique (rĂ©alisĂ©e ici avec un LLM dĂ©diĂ©, nomic-embed-text), ainsi que la gĂ©nĂ©ration de rĂ©ponses pertinentes en fonction du contexte par le LLM principal, souvent qualifiĂ© de « penseur » (dans ce cas : llama3.1:8b).
Pour simplifier le dĂ©ploiement de Kotaemon « on the fly », jâai choisi dâinstancier le conteneur de maniĂšre temporaire. Ainsi, dĂšs que je quitte le terminal, le conteneur est automatiquement supprimĂ©. De plus, par dĂ©faut, jâexĂ©cute ce conteneur sur le mĂȘme rĂ©seau que ma machine hĂŽte. Bien que ce ne soit pas recommandĂ© pour un environnement de production « ASoA* », cette configuration me permet de faciliter le dĂ©ploiement et lâinterfaçage entre le socket de lâAPI Ollama qui nâutilise pas Docker (localhost:11434) et le systĂšme RAG portĂ© par Kotaemon (localhost:7860).
*A State of Art
docker run -e GRADIO_SERVER_NAME=0.0.0.0 -e GRADIO_SERVER_PORT=7860 --net=host -it --rm ghcr.io/cinnamon/kotaemon:main-full
source : https://github.com/Cinnamon/kotaemon/issues/224#issuecomment-2483136705
Dans un premier temps, et pour vous faciliter la vie en cas de troubleshooting, je vous conseille de ne pas exĂ©cuter le conteneur Kotaemon en arriĂšre-plan. Ainsi, vous aurez les logs de lâapplication en direct, ce qui vous Ă©vitera de faire des appels intempestifs Ă la commande
docker logs
.

Dans un autre terminal, executez les commandes suivantes :
docker ps
Pour vĂ©rifier que Kotaemon fonctionne correctement avec Ollama, il est essentiel de sâassurer que ce dernier est en mesure dâaccĂ©der Ă lâAPI dâOllama, qui utilise par dĂ©faut le port 11434. Pour ce faire, il suffit dâentrer Ă lâintĂ©rieur du conteneur :
docker exec -it <ID> bash
Puis de saisir la commande suivante :
curl http://localhost:11434 -w '\n'

DĂšs lors, rendez-vous sur lâinterface web de Kotaemon (http://localhost:7860), sĂ©lectionnez Ollama comme « model provider », puis cliquez sur Proceed.

Kotaemon, ayant accĂšs Ă lâAPI dâOllama, il va se charger du tĂ©lĂ©chargement des modĂšles nomic-embed-text et llama3.1:8b (modĂšles par dĂ©faut).
- llama3.1:8b (5go)
- ModĂšle Llama (de Meta), version 3.1, avec 8 milliards de paramĂštres*. Conçu pour accomplir des tĂąches complexes de traitement du langage naturel, telles que la gĂ©nĂ©ration de texte en fonction dâun contexte c.
- nomic-embed-text (300mo)
- ModĂšle spĂ©cialisĂ© dans lâembedding de texte, câest-Ă -dire la conversion de phrases en vecteurs numĂ©riques (reprĂ©sentations vectorielles). Conçu pour des tĂąches comme la recherche sĂ©mantique, la classification de texte ou la mise en cluster dâidĂ©es similaires.
*La notion de paramÚtre dans le contexte des modÚles de langage comme LLaMA fait référence aux poids appris par le modÚle pendant son entraßnement. Ces poids sont des valeurs numériques ajustées pour capturer les relations entre les mots, phrases et concepts dans les données sur lesquelles le modÚle a été entraßné. Plus il y a de paramÚtres, plus le modÚle est complexe et capable de capturer des relations subtiles dans les données.

Une fois que les modÚles ont été téléchargés, Kotaemon tente de dialoguer avec eux en envoyant un simple prompt « Hi ».

Pourquoi avons-nous besoin de deux modĂšles allez-vous me dire ?
Pour rappel, dans Kotaemon, LlamA 3.1:8B est utilisĂ© pour ses capacitĂ©s avancĂ©es de comprĂ©hension et de gĂ©nĂ©ration de texte en langage naturel. Ce modĂšle est essentiel pour analyser des contextes complexes, produire des rĂ©ponses dĂ©taillĂ©es et interagir de maniĂšre intelligente avec lâutilisateur. Il joue un rĂŽle central dans lâinterprĂ©tation des requĂȘtes et lâĂ©laboration des rĂ©ponses. En quelque sorte, câest lui le « cerveau » qui Ă©tablit les connexions entre les donnĂ©es extraites par nomic-embed-text. (ce dernier pouvant ĂȘtre comparĂ© Ă un assistant chargĂ© de consulter toutes les ressources documentaires, mais sans le recul nĂ©cessaire pour structurer et produire une rĂ©ponse logiquement cohĂ©rente).
En parallĂšle, Nomic-Embed-Text:latest est dĂ©diĂ© Ă lâindexation et Ă la recherche sĂ©mantique. Il convertit des textes issus de fichiers PDF, Markdown, etc., en reprĂ©sentations vectorielles, permettant de trouver des similaritĂ©s ou des concepts connexes rapidement et efficacement.
V. Tests
Bien, une fois que vous avez accĂšs Ă lâinterface configurĂ©e de Kotaemon, il est temps de tester si notre pipeline RAG fonctionne correctement. Pour cela, il faut ajouter des fichiers Ă la base documentaire afin quâils soient « embedded » (indexĂ© par nomic-embed-text). Pour ce faire, suivez ces Ă©tapes :
- Allez dans le menu suivant :
Files â Upload files - SĂ©lectionnez les fichiers souhaitĂ©s, puis cliquez sur Upload and index.
Le fichier que jâai choisi est un document qui dĂ©crit en dĂ©tail le fonctionnement du rĂ©seau Tor, que je vous recommande vivement de le consulter si ce sujet vous interesse.
P40 â Exploration du rĂ©seau Tor

Voilà ce qui se passe du cÎté backend :

En fonction de la puissance de votre ordinateur/serveur ainsi que de la taille du fichier Ă traiter, le document peut prendre beaucoup de temps Ă ĂȘtre indexĂ© par nomic-embed-text. Comptez plusieurs minutes avec un ordinateur standard du marchĂ©. LâidĂ©e finale est Ă©videmment dâutiliser un serveur dĂ©diĂ© disposant de bien plus de ressources physiques (CPU, GPU, RAM).

Une fois que celui-ci est indexĂ©, vous pouvez enfin essayer de requĂȘter le RAG en posant des questions relatives au document indexĂ©.
Prompt : Qui sont les auteurs du document ?

Ce premier prompt, en posant une question directement liĂ©e au document, permet de vĂ©rifier que notre pipeline RAG fonctionne correctement. Cela teste si lâIA fournit une rĂ©ponse basĂ©e sur le document ou si elle « hallucine ». Lorsque des documents pertinents sont identifiĂ©s, ils sâaffichent Ă droite dans lâinterface.

Posons maintenant une question plus technique, toujours en nous basant sur le document téléversé précédemment.
Prompt : OK. Peux-tu mâexpliquer ce que sont les serveurs dâannuaire au sein du rĂ©seau Tor ?

La réponse est en parfaite adéquation avec la notion abordée. Qui plus est, elle est techniquement correcte.
VI. Conclusion
En conclusion, les pipelines RAG reprĂ©sentent une avancĂ©e majeure pour la gestion et lâexploitation de lâinformation. En combinant la recherche sĂ©mantique et la puissance des modĂšles de langage, ils permettent un accĂšs rapide et contextuel aux donnĂ©es, transformant ainsi des volumes dâinformations brutes en rĂ©ponses pertinentes et exploitables. Câest sans nul doute un avenir certain pour la gestion des procĂ©dures au sein de systĂšmes dâinformation, car ils Ă©liminent le besoin de rechercher manuellement dans des wikis ou, pire encore, de parcourir des fichiers de procĂ©dure dispersĂ©s. GrĂące Ă cette avancĂ©e, entreprises et particuliers peuvent, entre autres, optimiser leur productivitĂ©.
++
Archidote
Lâarticle Deep dive into AI world : Mise en place dâune pipeline RAG avec Kotaemon est apparu en premier sur Le Guide Du SecOps âą LGDS.