Plateforme RAG Open-source

Plateforme RAG Open-source : transformer vos documents en base de connaissances

Tutoriel pas-à-pas COBOLIntermédiaire

Plateforme RAG Open-source : transformer vos documents en base de connaissances

Un LLM sans contexte externe hallucine systématiquement sur vos données privées. La Plateforme RAG Open-source résout ce problème en injectant des faits précis dans le prompt.

Le RAG (Retrieval-Augmented Generation) permet de lier des documents PDF, textuels ou des fichiers plats à un modèle de langage. En utilisant des outils comme ChromaDB ou FAISS, on transforme du texte non structuré en vecteurs mathématiques. L’enjeu est de maintenir une précision de récupération supérieure à 90% sur des corpus de plusieurs gigaoctets.

Après cette lecture, vous saurez mettre en place un pipeline complet. Vous saurez parser des données héritées. Vous saurez orchestrer un moteur de recherche vectoriel avec un LLM local.

Plateforme RAG Open-source

🛠️ Prérequis

Le système doit disposer d’un environnement Linux (Ubuntu 22.04 LTS recommandé) et des outils suivants :

  • Python 3.12 installé via deadsnakes PPA ou pyenv.
  • GnuCOBOL 3.1 pour le traitement des fichiers sources legacy.
  • Docker 24.0+ pour l’exécution de ChromaDB.
  • Ollama 0.1.x pour l’exécution locale des modèles Llama 3 ou Mistral.
  • Pip install langchain chromadb sentence-transformers unstructured.

📚 Comprendre Plateforme RAG Open-source

Le fonctionnement d’une Plateforme RAG Open-source repose sur trois piliers : l’Embedding, le Vector Store et le Retrieval.

L’Embedding transforme une chaîne de caractères en un vecteur de dimension N. Dans un espace vectoriel, deux phrases sémantiquement proches auront une distance euclidienne ou une similarité cosinus faible. C’est comparable à l’indexation d’un fichier VSAM, mais sur des concepts plutôt que sur des clés primaires.

Le processus suit ce flux :
Document -> Chunking (découpage) -> Embedding (vectorisation) -> Indexation (stockage).
Requête -> Embedding de la question -> Recherche de similarité -> Augmentation du prompt -> Génération LLM.

Comparaison des méthodes de recherche :
1. Recherche textuelle classique (BM25) : Basée sur la fréquence des mots. Efficace pour les noms propres.
2. Recherche vectorielle : Basée sur le sens. Efficace pour les synonymes et le contexte.

🏦 Le code — Plateforme RAG Open-source

COBOL
IDENTIFICATION DIVISION.
       PROGRAM-ID. PREP-DATA-COBOL.
       AUTHOR. COBOL-DEV.
      * Ce programme simule l'extraction de logs legacy pour la RAG.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT LEGACY-FILE ASSIGN TO

📖 Explication

Dans le code COBOL, l’utilisation de STRING est préférée à une concaténation simple pour gérer proprement les délimiteurs JSON. Le formatage en sortie est strictement compatible avec un parsing JSON standard.

Dans le code Python, le choix de RecursiveCharacterTextSplitter est dicté par la nécessité de préserver la structure logique. L’alternative CharacterTextSplitter est trop brutale et casse souvent les entités nommées. Pour les embeddings, j’ai choisi BGE-small car il offre un ratio performance/mémoire optimal sur des machines sans GPU dédié. L’utilisation de Chroma.from_documents avec persist_array assure que vos données ne disparaissent pas à la fermeture du script.

Attention, un piège classique ici : si le chunk_overlap est nul, le modèle perd le sujet de la phrase précédente, ce qui génère des réponses incohérente.

Documentation officielle COBOL

🔄 Second exemple

COBOL
import os
from langchain_community.document_loaders import JSONLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma

def setup_rag_pipeline(json_path: str):
    # Chargement des données préparées par le module COBOL
    loader = JSONLoader(
        file_path=json_path,
        jq_schema='.text',
        text_content=False
    )
    
    # Le chunking est crucial pour la Plateforme RAG Open-source
    # Un chunk trop grand dilue le signal sémantique
    splitter = RecursiveCharacterTextSplitter(
        chunk_size=500,
        chunk_overlap=50,
        separators=['\n\n', '\n', ' ', '']
    )
    
    documents = loader.load()
    docs = splitter.split_documents(documents)
    
    # Utilisation de BGE-Small pour l'efficacité CPU
    embeddings = HuggingFaceEmbeddings(model_name='BAAI/bge-small-en-v1.5')
    
    # Initialisation de la base vectorielle locale
    vectorstore = Chroma.from_documents(
        documents=docs, 
        embedding=embeddings,
        persist_array=

▶️ Exemple d’utilisation

Exécution du pipeline complet :
1. Génération des données : cobc -x PREP-DATA-COBOL.cob && ./PREP-DATA-COBOL
2. Indexation : python3 ingest_to_rag.py
3. Requête :

# Exemple de requête utilisateur
question = "Quelle est la procédure de clôture de fin de mois ?"
docs = vectorstore.similarity_search(question, k=2)
print(f"Documents trouvés : {len(docs)}")
for d in docs:
    print(f"Contenu : {d.page_content[:100]}...")

Sortie attendue :

Documents trouvés : 2
Contenu: { "id": "001", "text": "La procédure de clôture implique la vérification des balances..."...
Contenu: { "id": "042", "text": "En cas d'erreur lors de la clôture, contactez l'admin..."...

🚀 Cas d’usage avancés

1. Audit de code Legacy : Indexez vos fichiers sources COBOL dans la Plateforme RAG Open-source. Interrogez le système sur la logique métier complexe ou la gestion des fichiers VSAM. Exemple : query("Où est gérée la routine de calcul d'intérêt ?").

2. Analyse de Logs de Production : Pipeline automatisé qui transforme les logs d’erreurs en vecteurs. Permet de retrouver instantanément des patterns d’erreurs similaires survenus il y a six mois. embed_logs(path='/var/log/syslog').

3. Documentation Technique Dynamique : Intégrez la documentation technique (Markdown) de vos API dans le RAG. Le développeur interroge la base pour obtenir des exemples de payload sans chercher dans le Wiki.

🐛 Erreurs courantes

⚠️ Dimension mismatch

Le modèle d’embedding utilisé pour la requête est différent de celui utilisé pour l’indexation.

✗ Mauvais

embeddings_query = OpenAIEmbeddings()
✓ Correct

embeddings_query = HugmenteEmbeddings(model_name='BAAI/bge-small-en-v1.5')

⚠️ Context Window Overflow

Le contexte récupéré est trop volumineux pour la fenêtre de contexte du LLM.

✗ Mauvais

k=20 (trop de documents)
✓ Correct

k=3 ou k=5 (limiter le nombre de chunks)

⚠️ Encoding Error

Lecture de fichiers EBCDIC sans conversion préalable vers UTF-8.

✗ Mauvais

open('data.txt', 'r')
✓ Correct

open('data.txt', 'r', encoding='utf-8')

⚠️ Chunking sans overlap

Perte de continuité sémantique entre les segments.

✗ Mauvais

chunk_overlap=0
✓ Correct

chunk_overlap=50

✅ Bonnes pratiques

Pour une Plateforme RAG Open-source industrielle, respectez ces principes :

  • Metadata Enrichment : Ajoutez toujours la source et la date du document dans les métad’s de ChromaDB.
  • Hybrid Search : Combinez la recherche vectorielle avec une recherche BM25 pour les termes techniques précis.
  • Evaluation Loop : Utilisez un framework comme RAGAS pour mesurer la fidélité des réponses.
  • Versionnage des Embeddings : Si vous changez de modèle d’embedding, vous devez ré-indexer toute votre base.
  • Security First : Ne pas injecter de données contenant des secrets (mots de passe, clés API) dans le vector store.
  • Monitoring : Suivez le temps de latence de l’embedding, car il peut devenir un goulot d’étranglement lors de l’ingestion massive.
Points clés

  • Le RAG évite les hallucinations en fournissant des faits réels.
  • Le chunking doit être granulaire et inclure un overlap.
  • L'utilisation de modèles d'embeddings légers (BGE) est préférable pour le CPU.
  • La préparation des données (parsing) est l'étape la plus critique.
  • ChromaDB est une solution locale robuste pour le stockage vectoriel.
  • Le format JSON est le standard pour transporter les données vers le RAG.
  • La similarité cosinus est le moteur mathématique de la recherche.
  • L'orchestration nécessite Python 3.12 et des outils comme LangChain.

❓ Questions fréquentes

Peut-on utiliser du RAG sur des fichiers Excel ?

Oui, mais il faut d’abord les convertir en CSV ou JSON. Le format tabulaire est difficile à chunker sans perdre la structure des colonnes.

Est-ce que le RAG remplace l'entraînement du modèle ?

Non. Le RAG apporte de la connaissance, le fine-tuning apporte du style ou un vocabulaire spécialisé. Ils sont complémentaires.

Quel modèle utiliser pour un usage local ?

Llama 3 (8B) ou Mistral (7B) via Ollama sont les standards actuels pour un bon équilibre entre vitesse et intelligence.

Comment gérer des documents de 10 000 pages ?

Il faut implémenter un pipeline d’ingestion asynchrone et utiliser une base vectorielle distribuée comme Qdrant ou Milvus.

📚 Sur le même blog

🔗 Le même sujet sur nos autres blogs

📝 Conclusion

La Plateforme RAG Open-source est l’outil indispensable pour donner de la mémoire à vos modèles de langage. La réussite de l’implémentation dépend moins du modèle choisi que de la qualité du nettoyage et du découpage de vos données sources. Pour approfondir la gestion des fichiers plats et des structures de données complexes, consultez la documentation COBOL officielle. Un bon pipeline de données est toujours plus important qu’un gros modèle de langage.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *