Mise à jour rapide

This commit is contained in:
Ladebeze66 2025-03-27 16:48:21 +01:00
parent 30bcfd2bf3
commit 3d0079a231
30 changed files with 2453 additions and 51 deletions

2
.obsidian/app.json vendored
View File

@ -1,5 +1,5 @@
{
"spellcheck": true,
"spellcheck": false,
"attachmentFolderPath": "./PJ",
"newFileLocation": "folder",
"newFileFolderPath": "inbox",

View File

@ -60,6 +60,6 @@
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1.4019828977761164,
"scale": 0.7132754626224509,
"close": true
}

View File

@ -4,63 +4,63 @@
"type": "split",
"children": [
{
"id": "d991961c29ad106d",
"id": "fd396beb68f53aec",
"type": "tabs",
"children": [
{
"id": "8cd31f588ec21296",
"id": "09e01f25377c213c",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Serveur perso/Installation LLM +++.md",
"file": "inbox/Notes essentielles Doc RAG + RAGFLOW.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Installation LLM +++"
"title": "Notes essentielles Doc RAG + RAGFLOW"
}
},
{
"id": "41d5f8a8d932e337",
"id": "a8e304ba57b6250d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "inbox/Test Cline.md",
"file": "inbox/RAGFlow_KB_Normes_Schemas.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Test Cline"
"title": "RAGFlow_KB_Normes_Schemas"
}
},
{
"id": "dd8810de0aecde96",
"id": "26e7057dfae72dcd",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "inbox/Résumé LLM-lab.md",
"mode": "source",
"file": "command_list/Git commands.md",
"mode": "preview",
"source": false
},
"icon": "lucide-file",
"title": "Résumé LLM-lab"
"title": "Git commands"
}
},
{
"id": "97ca7aff179659c4",
"id": "6bea77b220257841",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "webdev/ROBO_MAT_Code_WLangage_Organise.md",
"file": "inbox/Prompt_Cursor_Complet_Agents_LLM_Pretraitement.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "ROBO_MAT_Code_WLangage_Organise"
"title": "Prompt_Cursor_Complet_Agents_LLM_Pretraitement"
}
}
],
@ -121,7 +121,7 @@
}
],
"direction": "horizontal",
"width": 300
"width": 477.5
},
"right": {
"id": "ad0ed0087b43302d",
@ -414,44 +414,45 @@
"templater-obsidian:Templater": false
}
},
"active": "dd8810de0aecde96",
"active": "26e7057dfae72dcd",
"lastOpenFiles": [
"inbox/Test Cline.md",
"inbox/Résumé LLM-lab.md",
"Serveur perso/Installation LLM +++.md",
"Serveur perso/Installation LLM dans Cursor.md",
"Serveur perso/Infrastructure Optimisée d'IA Locale.md",
"Serveur perso/Création de classes agents pour LLM locaux avec Cursor et Ollama.md",
"command_list/Git commands.md",
"command_list/Commandes Nvidia.md",
"command_list/Ollama commands.md",
"webdev/ROBO_MAT_Analyse_clsMistral.md",
"webdev/ROBO_MAT_Analyse_clsOllama.md",
"webdev/Non confirmé 702528.crdownload",
"webdev/ROBO_MAT_Analyse_Fonctionnelle.md",
"webdev/Rappel de certaines notions WLangage et Classes.md",
"inbox/Non confirmé 367059.crdownload",
"webdev/ROBO_MAT_Code_WLangage_Organise.md",
"webdev/PJ/wlangage_class_code.json",
"webdev/Analyse_ROBO_MAT_Complete.md",
"inbox/RAGFLOW - Traitement des Normes Techniques avec Schémas (v1.0).md",
"inbox/RAGFlow_KB_Normes_Schemas.md",
"inbox/Recherches LLama Vision 3.2 90b.md",
"inbox/Prompt_Cursor_Complet_Agents_LLM_Pretraitement (1).md",
"inbox/Prompt_Cursor_Complet_Agents_LLM_Pretraitement.md",
"inbox/prompt.md",
"inbox/Plan_Ragflow_Ollama_LLM_Vision.md",
"inbox/Plan_Architecture_Programme_Pretraitement_RAGFLOW.md",
"inbox/Odoo.md",
"inbox/Notes RAGFLOW.md",
"inbox/Notes projet LLM.md",
"inbox/Node.js.md",
"inbox/Fichier type json récupération odoo.md",
"inbox/Arborescence du programme.md",
"inbox/StreamDeck config.md",
"inbox/Notes essentielles Doc RAG + RAGFLOW.md",
"inbox/Non confirmé 226509.crdownload",
"inbox/Non confirmé 930335.crdownload",
"inbox/Prompt_Cursor_Programme_Pretraitement_RAGFLOW.md",
"inbox/Architecture_Agents_LLM_et_Configurations_RAGFLOW.md",
"inbox/Non confirmé 535765.crdownload",
"inbox/Piste pré-process traitement document.md",
"inbox/Non confirmé 63479.crdownload",
"inbox/Non confirmé 777860.crdownload",
"inbox/Documentation RAG + RAGFLOW.md",
"inbox/Résumé LLM-lab.md",
"inbox/Scripts requêtes Odoo.md",
"inbox/ROBO_MAT_Code_WLangage_Organise.json",
"inbox/Non confirmé 873082.crdownload",
"inbox/ROBO_MAT_Analyse_clsDeepl.md",
"inbox/Non confirmé 727828.crdownload",
"inbox/version épuée.md",
"inbox/Non confirmé 465885.crdownload",
"inbox/Non confirmé 948241.crdownload",
"inbox/Non confirmé 34515.crdownload",
"inbox/Non confirmé 822614.crdownload",
"inbox/Traitement documents (normes).md",
"inbox/Documentation méthode traitement Normes.md",
"inbox/Non confirmé 113752.crdownload",
"inbox/Non confirmé 68845.crdownload",
"inbox/Fichier type json récupération odoo.md",
"inbox/Mise en place LLM RAGFLOW.md",
"inbox/Non confirmé 835198.crdownload",
"captures/Capture d'écran 2025-03-26 173121.png",
"inbox/Sans titre 1.md",
"Stage/Recherches llama3.2-vision 90b.md",
"Templates/Windows_to_Linux_Transfer_Agent.md",
"Templates/WebDev_Agent.md",
"Templates/Templates_Cursor_Obsidian_Full",
"Templates/Templates_Cursor_Obsidian_Full.zip",
"captures/signature.png",
"captures/Capture d'écran 2025-03-20 150304.png",
"captures/Capture d'écran 2025-03-20 150213.png",
@ -460,7 +461,6 @@
"captures/Capture d'écran 2025-03-20 145214.png",
"captures/Capture d'écran 2025-03-20 144343.png",
"captures/Capture d'écran 2025-03-20 144317.png",
"captures/Capture d'écran 2025-03-20 143039.png",
"captures/Capture d'écran 2025-03-20 112035.png"
"captures/Capture d'écran 2025-03-20 143039.png"
]
}

View File

@ -0,0 +1,116 @@
Recherche de tous les paramètres modifiables pour le modèle multimodal `llama3.2-vision:90b` dans le cadre d'une utilisation avec Ollama. Cela inclura :
- Les paramètres exploitables via l'API (JSON, Python)
- Les paramètres personnalisables via un fichier Modelfile
- La manière dutiliser ces paramètres dans un contexte danalyse dimage et de texte (dans ton cas : image + JSON support client)
# Paramètres du modèle Llama 3.2-Vision 90B avec Ollama
## 1. Paramètres disponibles via lAPI Ollama (Python, CLI, JavaScript)
Ollama expose plusieurs **paramètres de génération** pour contrôler les réponses du modèle. Les principaux incluent : la _température_ (pour moduler la créativité, 0 = déterministe, >1 = plus aléatoire, défaut ~0.8) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=1,pattern%20is%20encountered%20the%20LLM)), le _top_p_ (filtrage nucléaire, défaut ~0.9) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=top_p%20Works%20together%20with%20top,05)), le _top_k_ (taille du vocabulaire échantillonné, défaut 40) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=top_k%20Reduces%20the%20probability%20of,9)), la _pénalité de répétition_ (_repeat_penalty_, défaut 1.1) pour éviter les redites ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=repeat_last_n%20Sets%20how%20far%20back,Setting%20this%20to%20a)), la _longueur du contexte_ (_num_ctx_, fenêtre de tokens, défaut 2048) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=num_ctx%20Sets%20the%20size%20of,1)), le _nombre max de tokens générés_ (_num_predict_, -1 = illimité par défaut) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=stop%20Sets%20the%20stop%20sequences,100)), ainsi que des options avancées comme _Mirostat_ (contrôle adaptatif de perplexité, désactivé par défaut) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=disabled%2C%201%20%3D%20Mirostat%2C%202,to%20generate%20the%20next%20token)) et _min_p_ (seuil probabiliste minimal alternatif à top_p) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=top_p%20Works%20together%20with%20top,05)). Vous pouvez aussi fixer un _seed_ aléatoire pour reproductibilité ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=temperature%20The%20temperature%20of%20the,AI)). La plupart de ces paramètres sont accessibles via lAPI en les passant dans le champ `options` de la requête JSON ou via des drapeaux en CLI (ex : `--temperature 0.7 --top-p 0.9`) ([Ollama Cheatsheet - How to Run LLMs Locally with Ollama](https://apidog.com/blog/ollama-cheatsheet#:~:text=adjustments)).
Pour les **images**, Llama 3.2-Vision attend une liste dimages dans les messages dentrée. Via lAPI ou les librairies, on fournit un tableau de chemins de fichiers image (ou leur contenu encodé en base64) associé au message utilisateur ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=model%3D%27llama3.2,)) ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,llava)). Par exemple en Python : `messages=[{'role': 'user','content': 'Question sur limage','images': ['image.png']}]` ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=model%3D%27llama3.2,)). En CLI, on peut glisser-déposer une image dans le terminal ou indiquer son chemin après le prompt ([Llama 3.2 Vision · Ollama Blog](https://ollama.com/blog/llama3.2-vision#:~:text=ollama%20run%20llama3.2)) ([Llama 3.2 Vision · Ollama Blog](https://ollama.com/blog/llama3.2-vision#:~:text=To%20add%20an%20image%20to,to%20the%20prompt%20on%20Linux)). _Formats supportés_ : les formats standards (PNG, JPG, BMP…) conviennent. Notez que la taille de limage ne doit pas excéder ~1120×1120 pixels ([Chat with Your Images Using Llama 3.2-Vision Multimodal LLMs | by Lihi Gur Arie, PhD | TDS Archive | Medium](https://medium.com/data-science/chat-with-your-images-using-multimodal-llms-60af003e8bfa#:~:text=Llama%2C%20short%20for%20%E2%80%9CLarge%20Language,complex%20visual%20and%20textual%20information)) pour être entièrement prise en compte. (Si une image dépasse, il peut être utile de la redimensionner en amont.)
Plusieurs **paramètres de format de réponse et de comportement** peuvent être passés dans la requête API :
- `format` : pour demander une sortie structurée JSON ou imposer un schéma JSON ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,than%20a%20stream%20of%20objects)). Par exemple, `format: "json"` force la réponse à être un objet JSON valide (en veillant à le préciser dans linstruction du prompt) ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=Structured%20outputs%20are%20supported%20by,the%20structured%20outputs%20example%20below)).
- `system` : pour fournir un message système (contexte/personalité) qui _surpasse_ celui du Modelfile ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,than%20a%20stream%20of%20objects)).
- `template` : pour spécifier un gabarit de prompt custom au lieu de celui par défaut du modèle ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,than%20a%20stream%20of%20objects)).
- `stream` : pour choisir entre une réponse _streaming_ (flux de tokens) ou complète en une fois (`false` renvoie la réponse entière dans un seul objet JSON) ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,than%20a%20stream%20of%20objects)).
- `raw` : pour envoyer le prompt tel quel sans formatage automatique (utile si lon a déjà formé manuellement le prompt complet, y compris les balises) ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,a%20full%20templated%20prompt%20in)).
- `keep_alive` : durée pendant laquelle garder le modèle en mémoire après la requête (ex. `"5m"` par défaut) ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,will%20stay%20loaded%20into%20memory)).
En pratique, ces paramètres sont utilisables via toutes les interfaces dOllama : par exemple avec la **librairie JavaScript** on peut passer `temperature` ou `format` dans lobjet options du chat ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,than%20a%20stream%20of%20objects)), et en **CLI** on dispose de flags correspondants (`--temperature`, `--top-p`, etc.) ([Ollama Cheatsheet - How to Run LLMs Locally with Ollama](https://apidog.com/blog/ollama-cheatsheet#:~:text=adjustments)). Par exemple, `ollama run llama3.2-vision:90b --temperature 0.1 --top-p 1.0 "Votre question"` lancera le modèle 90B localement avec une température basse (sortie plus focalisée) ([Ollama Cheatsheet - How to Run LLMs Locally with Ollama](https://apidog.com/blog/ollama-cheatsheet#:~:text=ollama%20run%20deepseek,p%200.9)). De même, lAPI REST (`POST /api/chat`) accepte un JSON contenant `model`, `messages` (avec éventuellement `images` intégrées) et un champ `options` pour les hyperparamètres ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=Advanced%20parameters%20)).
## 2. Paramètres supplémentaires via un fichier _Modelfile_ personnalisé
Ollama permet de créer un **fichier `Modelfile`** pour personnaliser la configuration dun modèle. Ce fichier agit comme une recette de modèle, où lon peut définir :
- **FROM** : le modèle de base à utiliser (ex. `FROM llama3.2-vision:90b`) et éventuellement son format (Safetensors, GGUF…) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=,SYSTEM)). Cest le point de départ (poids initiaux).
- **PARAMETER** : des paramètres par défaut pour lexécution du modèle ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=,ADAPTER)). On peut y fixer toutes les valeurs listées plus haut (température, top_p, etc.) afin quelles sappliquent à chaque requête sur ce modèle. Par exemple : `PARAMETER temperature 0.5` pour rendre le modèle plus cohérent (créativité réduite) ou `PARAMETER num_ctx 4096` pour étendre la fenêtre de contexte à 4096 tokens ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=FROM%20llama3.2%20,next%20token%20PARAMETER%20num_ctx%204096)). Ces paramètres dans le Modelfile sont équivalents à ceux passés via lAPI (ils peuvent être surchargés à la requête au besoin).
- **TEMPLATE** : un gabarit de prompt sur mesure ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=,Notes)). Cest ici quon définit comment le système formate les messages (par exemple en ajoutant des balises spéciales autour des rôles, etc.). Le template utilise des variables comme `{{ .System }}` (insère le message système), `{{ .Prompt }}` (message utilisateur) et `{{ .Response }}` (réponse du modèle) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=)). En personnalisant le template, on peut ajuster la manière dont le dialogue est présenté au modèle par exemple, certains modèles attendent un format de prompt particulier, quon peut implémenter ici.
- **SYSTEM** : un message système par défaut, qui définit le comportement ou la personnalité de lassistant ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=SYSTEM)). Par exemple, `SYSTEM Vous êtes un expert support technique…` orientera toutes les réponses du modèle dans ce rôle sans avoir à le répéter à chaque requête. (Ce message système sera injecté via le template, typiquement en en-tête de la conversation.)
- **ADAPTER** : un adaptateur LoRA ou Q-LoRA à appliquer au modèle de base ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=ADAPTER)). Cela permet de _charger un fine-tune léger_ sans modifier le modèle de base. On indique le chemin vers le fichier de ladaptateur (au format Safetensors ou GGUF) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=adapter%20was%20tuned%20from%20the,behaviour%20will%20be%20erratic)). Par exemple, on pourrait plugger un LoRA spécialisé en support client si disponible, pour ajuster les réponses, le tout via `ADAPTER chemin/vers/adapter.safetensors`.
- **LICENSE** : le texte de licence du modèle dérivé (option purement documentaire/juridique) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=LICENSE)).
- **MESSAGE** : un historique de messages exemple à précharger dans le modèle ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=MESSAGE)). Cela sert à **ajuster le comportement par quelques exemples** (technique du _few-shot_). On peut ajouter plusieurs lignes `MESSAGE role contenu` pour construire une mini-conversation type. Les rôles valides sont `system` (équivalent dun message système initial), `user` (exemple de question utilisateur) et `assistant` (exemple de réponse du modèle) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=Role%20Description%20system%20Alternate%20way,how%20the%20model%20should%20respond)). En couplant ces messages, on illustre au modèle la façon dont il doit répondre. Par exemple, on peut inclure une série de Q/R de support client résolues pour guider le modèle sur le ton et le format attendus. Ces messages dexemple seront toujours insérés avant la requête réelle de lutilisateur, orientant ainsi le modèle ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=The%20,answer%20in%20a%20similar%20way)) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=)).
En résumé, le Modelfile permet de **prérégler le modèle** sans fine-tuning lourd. Pour lutiliser, on crée le fichier puis on exécute `ollama create nom-modele -f Modelfile`, ce qui génère un modèle personnalisable quon peut ensuite `ollama run` comme nimporte quel modèle local ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=1,Start%20using%20the%20model)). Tous les paramètres définis (température par défaut, message système, etc.) sappliqueront alors aux réponses de ce modèle par défaut, sauf override via lAPI (champs `system`, `options`, etc. peuvent encore venir écraser ces valeurs si besoin) ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,than%20a%20stream%20of%20objects)).
## 3. Utilisation des paramètres pour un cas danalyse conjointe image + ticket JSON
Dans un cas de **ticket de support technique** comportant un historique (texte) et des **captures décran** associées, voici comment exploiter les paramètres :
- **Inclusion des images** : on peut fournir une ou plusieurs images en entrée du modèle en les attachant au message utilisateur. Concrètement, via lAPI ou les SDK, on crée un message avec `role: "user"`, puis on place le texte décrivant la demande dans `content` et on ajoute la liste des images dans `images` ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=The%20,following%20fields)). Par exemple, si lutilisateur fournit deux captures (“screen1.png” et “error.bmp”), on aura :
```json
{
"role": "user",
"content": "Voici le dialogue du ticket support (voir ci-dessous) et deux captures décran en pièce jointe.",
"images": ["screen1.png", "error.bmp"]
}
```
_Remarque_ : Llama 3.2-Vision est officiellement optimisé pour une image à la fois il **peut accepter plusieurs images**, mais les développeurs notent que le modèle nest pas encore fiable avec plusieurs images simultanées ([meta-llama/Llama-3.2-11B-Vision-Instruct · Does Llama-3.2 Vision model support MultiImages?](https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct/discussions/43#:~:text=Meta%20Llama%20org%20Sep%2029%2C,2024)). Il est donc prudent, si possible, de limiter à une image par requête pour une analyse précise, ou danalyser les images une par une. Dans le contexte dun ticket, on peut par exemple dabord interroger le modèle sur la première capture puis sur la seconde, et combiner les résultats. Si les images contiennent beaucoup dinformations textuelles (ex: capture décran de log), le modèle peut en extraire le texte (OCR) et le comprendre ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=collection%20of%20instruction,models%20on%20common%20industry%20benchmarks)), mais assurez-vous de décrire ou nommer chaque image dans le prompt pour quil sache à quoi elles correspondent.
- **Fournir la chronologie de discussion** : Le contenu JSON du ticket (conversations entre le client et le support) doit être intégré dune manière compréhensible par le modèle. Vous pouvez **concaténer les messages** du ticket en un seul bloc de texte structuré (par ex. en précisant les interlocuteurs et timestamps) et le placer dans le `content` du message utilisateur. Alternativement, Ollama gère les conversations multi-tour : on pourrait reconstruire la chronologie comme une suite de messages `user`/`assistant` pour mimer le dialogue dorigine dans le contexte. Par exemple, utiliser des entrées `messages=[{"role":"user","content":"[client] ..."}, {"role":"assistant","content":"[support] ..."}, ...]` reprenant léchange original. Toutefois, comme le modèle est instruction-tuned (format question/réponse), il peut être plus simple de tout fournir dans un seul message utilisateur avec une distinction claire entre les tours de parole (texte formaté, listes, etc.), puis de demander une analyse. Limportant est que le modèle reçoive **toutes les informations textuelles du ticket dans le contexte**. Si le JSON est complexe, on peut extraire les champs pertinents (par ex. seulement la timeline des messages) plutôt que coller le JSON brut.
- **Paramètres de contexte et longueur** : Les tickets de support peuvent être longs. Assurez-vous que le modèle a une fenêtre de contexte suffisante (`num_ctx`). Llama 3.2-Vision 90B supporte une _contexte étendu jusquà 128k tokens_ maximum ([Chat with Your Images Using Llama 3.2-Vision Multimodal LLMs | by Lihi Gur Arie, PhD | TDS Archive | Medium](https://medium.com/data-science/chat-with-your-images-using-multimodal-llms-60af003e8bfa#:~:text=Llama%2C%20short%20for%20%E2%80%9CLarge%20Language,complex%20visual%20and%20textual%20information)), mais cela dépend de la configuration. Par défaut, Ollama limite à 2048 tokens si non modifié ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=num_ctx%20Sets%20the%20size%20of,7)). Dans un Modelfile custom ou via `options`, on peut augmenter `num_ctx` (ex. 4096, 8192, etc.) pour englober un long historique. Gardez à lesprit que plus de contexte consomme plus de VRAM/temps. La 90B est lourde (≥64 Go VRAM requis) ([Llama 3.2 Vision · Ollama Blog](https://ollama.com/blog/llama3.2-vision#:~:text=to%20the%20image%20to%20the,prompt%20on%20Linux)), donc ajustez en fonction de votre hardware. Si le ticket dépasse la limite, envisagez de le résumer par étapes (par ex. fournir dabord la première moitié, obtenir un résumé, puis la seconde).
- **Paramètres de format de sortie** : Dans ce cas danalyse, il peut être utile de demander une réponse structurée. Par exemple, on pourrait définir `format: "json"` dans la requête pour que le modèle renvoie son analyse du ticket dans un format JSON structuré ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=,than%20a%20stream%20of%20objects)) pratique pour extraire automatiquement des champs (comme _problème_, _diagnostic_, _solution proposée_). On fournira alors dans le prompt une instruction du type _“Analyse ce ticket et fournis la réponse au format JSON suivant : {...}”_. Le paramètre `format` garantira que la réponse est effectivement bien formée en JSON selon le schéma donné ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=Structured%20outputs%20are%20supported%20by,the%20structured%20outputs%20example%20below)).
- **Message système et indications** : Pour guider le modèle, on peut inclure un message système spécial (via lAPI ou le Modelfile) qui précise le rôle : par ex.  Tu es un assistant support technique expert. On te fournit un historique de conversation client-support et des captures, analyse la situation… »_. Ce message contexte peut améliorer la pertinence de lanalyse (en orientant le modèle à adopter un ton analytique et à ne pas halluciner dinformations externes). Cest une bonne pratique pour les cas de support client.
- **Langue** : Notez que pour les tâches _image + texte_, Llama 3.2-Vision est entraîné principalement en anglais ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=Supported%20Languages%3A%20For%20text%20only,is%20the%20only%20language%20supported)). Il comprend plusieurs langues en entrée textuelle (le français fait partie des langues supportées pour le texte seul ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=Supported%20Languages%3A%20For%20text%20only,is%20the%20only%20language%20supported))), mais lorsquil sagit de raisonner sur une image, ses capacités ont été calibrées sur des instructions en anglais. Cela signifie que si lon pose la question ou décrit limage en français, le modèle pourrait être moins performant. Une approche consiste éventuellement à _poser la question en anglais_ pour la partie image (par ex. _“Que montrececi ?”_ sur limage) puis de traduire la réponse en français. Dans un contexte de ticket francophone, on peut tout de même lui fournir le contenu tel quel en français il saura le lire mais il pourrait être utile de reformuler la consigne danalyse dimage en anglais dans le prompt système ou utilisateur pour tirer le meilleur de la vision. Cest un compromis à considérer pour améliorer la compréhension conjointe.
## 4. Paramètres et approches pour améliorer lanalyse conjointe image+texte
Plusieurs réglages et **approches de prompt** peuvent renforcer la compréhension du modèle dans un scénario multimodal de support client :
- **Utilisation optimale du contexte multimodal** : Profitez du fait que Llama 3.2-Vision a été entraîné spécifiquement pour _relier vision et langage_. Il excelle en description dimages, en raisonnement visuel et en Q&R sur des contenus visuels ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=collection%20of%20instruction,models%20on%20common%20industry%20benchmarks)). Pour exploiter cela, assurez-vous que le prompt lie clairement limage et le texte. Par exemple, faites référence à limage dans votre question (_« …voir image ci-jointe »_) afin que le modèle sache quil doit lutiliser. Vous pouvez même demander explicitement  Analyse dabord la capture, puis corrèle avec la conversation… »_. Structurer la requête en deux étapes dans le même message utilisateur peut aider : dabord  Voici ce que montre limage… »_ (le modèle inférera), ensuite  Compte tenu de la conversation… »_. Le modèle intégrera ces éléments dans sa réponse globale.
- **Paramètres de génération pour analyses factuelles** : Pour une analyse de support, on veut en général une réponse fiable et focalisée sur les données fournies. Il est donc recommandé de baisser un peu la _température_ (par ex. autour de 0.20.5) afin de réduire les divagations créatives ([Ollama Cheatsheet - How to Run LLMs Locally with Ollama](https://apidog.com/blog/ollama-cheatsheet#:~:text=ollama%20run%20deepseek,p%200.9)). Une température basse combinée à un _top_p élevé_ (~1.0) donne des réponses plus déterministes et précises, ce qui est adapté à lexplication technique ([Ollama Cheatsheet - How to Run LLMs Locally with Ollama](https://apidog.com/blog/ollama-cheatsheet#:~:text=ollama%20run%20deepseek,p%200.9)). En outre, conserver un _repeat_penalty_ standard ou légèrement supérieur (≥1.1) peut éviter que le modèle ne répète textuellement de longues portions du ticket dans sa réponse. Le but est quil reformule et analyse, plutôt que de citer brute­ment.
- **Fenêtre de contexte étendue** : Si le ticket est long ou comporte de nombreux détails techniques, augmenter `num_ctx` comme évoqué plus haut permet de tout inclure sans perte. Llama 3.2-Vision 90B pouvant théoriquement monter à 128k tokens de contexte ([Chat with Your Images Using Llama 3.2-Vision Multimodal LLMs | by Lihi Gur Arie, PhD | TDS Archive | Medium](https://medium.com/data-science/chat-with-your-images-using-multimodal-llms-60af003e8bfa#:~:text=Llama%2C%20short%20for%20%E2%80%9CLarge%20Language,complex%20visual%20and%20textual%20information)), nhésitez pas à élargir la fenêtre (selon vos ressources) pour ne pas tronquer dinformations essentielles. Cela améliore la compréhension globale du cas par le modèle, évitant quil ignore des éléments de début de conversation par manque de contexte.
- **Sortie structurée et ciblée** : Lutilisation du paramètre `format` avec un schéma JSON (ou simplement `format: "json"`) est très pertinente pour des analyses de tickets. En imposant une structure de réponse (par ex. champs _Résumé du problème_, _Cause probable_, _Solution proposée_), on force le modèle à couvrir tous les points de manière organisée ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=parameter,the%20structured%20outputs%20example%20below)). Cela réduit les digressions et garantit que les éléments importants du support client sont adressés. Il faut accompagner ce paramètre dune consigne claire dans le prompt (_“Réponds uniquement au format JSON suivant…”_) pour guider le modèle ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/api.md#:~:text=Enable%20JSON%20mode%20by%20setting,the%20JSON%20mode%20example%20below)).
- **Prompt dexemple (few-shot)** : Même sans fine-tuning, on peut insérer un ou deux exemples danalyse réussie pour guider le modèle. Par exemple, en amont du vrai ticket, ajouter dans le message système ou via le Modelfile `MESSAGE` une mini-conversation _factice_ : un court échange client-support et une analyse assistant. Cela sert de démonstration. Le modèle, entraîné en mode conversationnel, imitera ce style dans sa réponse réelle. Veillez à ce que lexemple soit concis pour ne pas monopoliser le contexte. Cette technique de _prompt engineering_ peut sensiblement améliorer la qualité des réponses sur des cas clients spécifiques en montrant au modèle le format danalyse attendu ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=)).
- **Gestion des images complexes** : Si limage est particulièrement complexe (ex: une photo de matériel, un graphique, du texte manuscrit), le modèle fera de son mieux pour linterpréter. Pour laider, fournissez du contexte si possible. Par exemple _“(Limage est une capture derreur système)”_ ou _“(Photo du câblage de lappareil)”_ en annotation dans le prompt utilisateur. Cela cadre son attention. Vous pouvez aussi, pour les tableaux ou graphiques, demander au modèle de les décrire dabord. Diviser lanalyse en sous-tâches (décrire limage puis conclure) est une approche qui améliore la précision. Certes, cela se fait au niveau du prompt plutôt que via un paramètre, mais cest crucial pour la _compréhension conjointe_.
En somme, combinez des **paramètres bien ajustés** (température, top_p, contexte, format…) avec un **prompt structuré** et éventuellement un message système adapté. Cela exploitera au mieux la synergie texte + image du modèle pour vos cas de support. Llama 3.2-Vision est conçu pour ce genre de raisonnement multimodal et, correctement guidé, il peut extraire le contexte dune image et le mettre en regard de la discussion technique pour fournir une analyse pertinente.
## 5. Recommandations daffinage des paramètres (sans fine-tuning)
Pour améliorer la qualité de lanalyse sans entraîner à nouveau le modèle, on peut jouer sur les hyperparamètres et la manière de présenter les requêtes :
- **Température et filtrage** : Comme mentionné, abaisser la température vers 0 permet dobtenir des réponses plus _directes et factuelles_. Pour un ticket technique, une valeur autour de 0.20.3 est souvent efficace. Par exemple, _Ollama_ recommande pour les explications techniques _temperature=0.1 et top_p=1.0_ afin davoir un style “codex” (très déterministe) ([Ollama Cheatsheet - How to Run LLMs Locally with Ollama](https://apidog.com/blog/ollama-cheatsheet#:~:text=ollama%20run%20deepseek,p%200.9)). À linverse, évitez une température trop haute (>0.8) qui rendrait lanalyse plus hasardeuse ou imaginative ce nest pas souhaitable dans un contexte support. Le paramètre _top_p_ peut rester à 0.91.0 pour conserver lexhaustivité des infos pertinentes, et _top_k_ peut éventuellement être réduit (p. ex. 20 au lieu de 40) si vous observez des dérapages, afin de restreindre le choix aux tokens les plus probables.
- **Pénalités de répétition** : Si dans vos tests le modèle a tendance à répéter le contenu du ticket mot pour mot, envisagez daugmenter légèrement `repeat_penalty` (ex. 1.2 au lieu de 1.1) ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=repeat_last_n%20Sets%20how%20far%20back,Setting%20this%20to%20a)). Cela encouragera des reformulations. Ne montez pas trop haut (>1.5) au risque de dégrader la cohérence. Vous pouvez aussi ajuster `repeat_last_n` (par défaut 64 tokens) pour étendre ou réduire la fenêtre de texte soumise à pénalisation de répétition ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=num_ctx%20Sets%20the%20size%20of,7)). Par exemple, mettre `repeat_last_n -1` (équivaut à toute la fenêtre contexte) signifie que le modèle évitera de répéter nimporte quel segment présent dans lhistorique complet, ce qui peut aider à éviter la paraphrase inutile du ticket. Ces ajustements se font soit dans un Modelfile, soit via `options` dans la requête.
- **Messages systèmes et exemples** : Exploitez à fond le _message système_ pour cadrer lassistant. Rappelez-lui d_utiliser uniquement les informations fournies_ et de _ne rien inventer_. Par exemple : _“Ninvente pas de faits non présents dans le ticket. Si une information manque, dis-le.”_. Cela agit comme une _garde-fou_ contre les hallucinations. De même, utilisez la directive `MESSAGE` (few-shot) dans un Modelfile pour incorporer un exemple danalyse idéale ([ollama/docs/modelfile.md at main · ollama/ollama · GitHub](https://github.com/ollama/ollama/blob/main/docs/modelfile.md#:~:text=)). Sans entraîner le modèle, on le **biaise positivement** vers le comportement souhaité en exploitation. Cest souvent suffisant pour améliorer significativement les résultats sur des cas clients similaires.
- **Formatage de la réponse** : Nous lavons souligné, demander une sortie structurée (par ex. via `format: "json"`) est une forme daffinage “soft”. En imposant une structure, on réduit la variance des réponses et on facilite la comparaison entre résultats. Vous pouvez itérativement peaufiner le schéma ou le style de sortie en fonction de ce qui est le plus utile (par ex., ajouter un champ _Niveau de certitude_ où lAI indique sa confiance). Ces éléments dans le format de réponse peuvent être intégrés sans aucune reconfiguration du modèle, juste en modifiant le prompt et le paramètre de format.
- **Pas de fine-tuning nécessaire a priori** : Llama 3.2-Vision 90B est déjà très performant en compréhension dimages et de langage ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=models%20are%20optimized%20for%20visual,models%20on%20common%20industry%20benchmarks)). Avant denvisager un fine-tuning coûteux sur vos données de support, exploitez au maximum les leviers ci-dessus. Souvent, **le prompt engineering et le réglage des paramètres suffisent** pour obtenir une analyse satisfaisante. Si toutefois vous avez des cas très spécifiques où le modèle peine, vous pourriez créer un _Modelfile adapter_ avec quelques LoRA dexemple (si vous avez des tickets résolus, fine-tuner sur ces cas). Mais même sans aller jusque-là, en jouant sur le contexte (par ex. en fournissant un résumé des docs techniques pertinentes du produit dans le message système), vous pouvez combler certaines lacunes.
En résumé, commencez par **affiner les hyperparamètres et le prompt** : faible température, pénalités ajustées, format de sortie, contexte supplémentaire via system message. Ces réglages, combinés à la puissance multimodale du modèle 90B, amélioreront notablement la qualité de lanalyse des tickets de support et ce **sans aucune modification lourde du modèle** lui-même. Chaque cas dusage peut nécessiter quelques itérations pour trouver le bon équilibre de paramètres, mais Ollama offre la flexibilité pour le faire facilement (via lAPI ou un Modelfile custom), tirant le meilleur de Llama 3.2-Vision dans vos scénarios dentreprise. ([Ollama Cheatsheet - How to Run LLMs Locally with Ollama](https://apidog.com/blog/ollama-cheatsheet#:~:text=ollama%20run%20deepseek,p%200.9)) ([llama3.2-vision:90b](https://ollama.com/library/llama3.2-vision:90b#:~:text=collection%20of%20instruction,models%20on%20common%20industry%20benchmarks))

View File

@ -0,0 +1,22 @@
## Automatiser les rôles dans ChatGPT selon les sujets
### Objectif :
Utiliser le contexte des messages pour **activer automatiquement un "rôle"** dagent ou un style de réponse.
### Ce qui est possible (ChatGPT Plus) :
- Tu peux définir un **Custom GPT** avec des **instructions système** personnalisées
- Lagent peut être configuré pour détecter des **mots-clés ou thèmes** et adapter :
- Le ton
- Le format de réponse (code, tableau, markdown)
- Le rôle adopté
---
### Exemple dinstruction système personnalisée :
```text
Si lutilisateur parle de Python, agis comme un mentor Python.
Si le sujet est la génération de prompts, agis comme un optimiseur de prompts.
Si on parle dIA locale ou RAG, adopte un rôle darchitecte IA.
```
> À configurer via : [https://chat.openai.com/gpts](https://chat.openai.com/gpts)

View File

@ -0,0 +1,16 @@
## Cursor Template : Utilisation Multi-Agents
**Objectif :** Utiliser plusieurs agents spécialisés dans Cursor selon la tâche.
### Méthodologie :
1. Crée plusieurs agents Cursor (ex : "Python Expert", "Prompt Optimizer", "LLM Architect")
2. Pour chaque type de fichier ou tâche, utilise lagent le plus adapté
3. Tu peux appeler un agent différent dans chaque onglet ou contextuellement dans la palette (`Cmd/Ctrl + K`)
### Exemple de structure :
| Fichier | Agent recommandé | Rôle |
|--------------------|--------------------|--------------------------------------------|
| `main.py` | Python Expert | Optimisation du code, debug |
| `rag_config.yaml` | LLM Architect | Structure et paramétrage du pipeline RAG |
| `prompt_bank.md` | Prompt Optimizer | Reformulation et validation de prompts |

View File

@ -0,0 +1,18 @@
## Cursor Agent Template : JavaScript Debugger
**Instructions pour l'agent Cursor :**
Tu es un expert en développement JavaScript moderne. Tu aides à :
- Corriger les bugs JS (navigateur ou Node.js)
- Revoir les pratiques async/await
- Réécrire du code avec des normes ES6+
- Sécuriser les fonctions contre les failles XSS/CSRF
**Prompt suggéré :**
```text
Analyse le code suivant :
1. Identifie les failles de performance ou de sécurité
2. Propose des améliorations
3. Réécris-le selon les bonnes pratiques modernes
```

View File

@ -0,0 +1,18 @@
## Cursor Agent Template : LLM Architect
**Instructions pour l'agent Cursor :**
Tu es un architecte IA spécialisé dans les modèles LLM. Tu aides à :
- Définir la stack technique (Ollama, RAG, LoRA)
- Organiser le pipeline (prétraitement, embeddings, RAG)
- Choisir les bons modèles (Mistral, GPT-4, Claude)
- Optimiser linfrastructure (GPU, RAM, stockage)
**Prompt type :**
```text
Je souhaite créer un système de traitement de support client avec plusieurs LLM spécialisés.
1. Propose une architecture logique
2. Justifie chaque choix technique
3. Donne un plan de déploiement local sur plusieurs machines
```

View File

@ -0,0 +1,18 @@
## Cursor Agent Template : Migration Linux → Windows
**Instructions pour l'agent Cursor :**
Tu es un assistant spécialisé en migration de projets entre OS. Ta mission :
- Adapter des scripts shell/Bash vers PowerShell ou Batch
- Gérer les chemins relatifs/absolus, dépendances, permissions
- Identifier les équivalents logiciels (ex : systemd → services.msc)
- Préserver la portabilité du code
**Prompt type :**
```text
Je dois migrer un projet Linux vers Windows.
1. Quels scripts ou services dois-je adapter ?
2. Comment rendre les chemins et commandes compatibles ?
3. Propose des scripts PowerShell de remplacement
```

View File

@ -0,0 +1,19 @@
## Cursor Agent Template : Multi-Tâches LLM Pipeline
**Instructions pour l'agent Cursor :**
Tu es un assistant IA qui gère toute la chaîne NLP :
- Extraction, prétraitement et nettoyage des données
- Vectorisation avec embeddings (ex : BGE, Instructor)
- Intégration dans un moteur RAG
- Suivi de la mémoire et stockage local (FAISS, Weaviate, etc.)
- Fine-tuning léger avec LoRA ou QLoRA
**Prompt type :**
```text
Je veux construire un système complet pour classer automatiquement les demandes clients.
1. Propose une chaîne NLP complète
2. Détaille les modèles et outils à chaque étape
3. Explique comment tout relier dans une infra locale
```

18
Templates/NodeJS_Agent.md Normal file
View File

@ -0,0 +1,18 @@
## Cursor Agent Template : Node.js Backend Developer
**Instructions pour l'agent Cursor :**
Tu es un développeur backend spécialisé Node.js. Ton objectif est de :
- Identifier les erreurs courantes liées aux callbacks, Promises, async/await
- Optimiser les performances des APIs REST/GraphQL
- Sécuriser le code contre les injections, les fuites mémoire
- Proposer une architecture modulaire et scalable
**Prompt type :**
```text
Voici un service Node.js. Analyse-le et :
1. Explique sa logique
2. Optimise lutilisation de async/await
3. Corrige les problèmes de sécurité ou darchitecture
```

View File

@ -0,0 +1,36 @@
## Obsidian : Template de Suivi Projet Web (React + Next + Strapi)
### Informations Générales
- **Nom du projet** : {{project_name}}
- **Date de création** : {{date}}
- **Stack technique** : React, Next.js, Strapi, Tailwind CSS
---
### Frontend
- Framework : Next.js
- Composants clés :
- [ ] Layout global
- [ ] Page d'accueil
- [ ] Authentification
---
### Backend
- CMS : Strapi
- Collections créées :
- [ ] Articles
- [ ] Utilisateurs
- [ ] Tags
---
### Déploiement
- [ ] Prévu sur Vercel ?
- [ ] Export statique ou SSR ?
- [ ] Configuration `.env` validée ?
---
### Notes techniques
> {{cursor}}

19
Templates/Python_Agent.md Normal file
View File

@ -0,0 +1,19 @@
## Cursor Agent Template : Python Expert
**Instructions pour l'agent Cursor :**
Tu es un expert Python senior. Ton objectif est d'aider à :
- Écrire du code idiomatique et optimisé
- Corriger des erreurs avec explication pédagogique
- Documenter clairement les fonctions
- Proposer des refactorings efficaces
**Structure de prompt à utiliser :**
```text
Voici un script Python. Analyse-le et :
1. Explique sa logique
2. Identifie les erreurs potentielles
3. Propose un refactoring
4. Suggère des tests unitaires
```

View File

@ -0,0 +1,23 @@
## Cursor Agent Template : Création site web React + Next.js + Strapi
**Instructions pour l'agent Cursor :**
Tu es un développeur fullstack expert dans les stacks modernes :
- Frontend en React/Next.js
- Backend headless avec Strapi
- Responsive design avec Tailwind CSS
- Déploiement possible sur Vercel, Render, ou serveur local
**Prompt type :**
```text
Je veux créer un site web complet avec :
- Frontend en React (Next.js)
- Backend headless CMS avec Strapi
- Design responsive et SEO-friendly
1. Propose une structure de projet
2. Génére les commandes dinstallation
3. Donne un exemple de layout responsive
4. Décris l'intégration frontend/backend
```

View File

@ -0,0 +1,18 @@
## Cursor Agent Template : Bash / Shell Expert
**Instructions pour l'agent Cursor :**
Tu es un expert Bash/Shell. Tu aides à :
- Écrire des scripts dautomatisation robustes
- Gérer les erreurs proprement
- Utiliser sed, awk, grep efficacement
- Optimiser les boucles et les conditions
**Prompt type :**
```text
Voici un script shell. Optimise-le pour :
1. Une meilleure lisibilité
2. Une meilleure gestion des erreurs
3. Des performances accrues
```

18
Templates/WebDev_Agent.md Normal file
View File

@ -0,0 +1,18 @@
## Cursor Agent Template : WebDev Debugger
**Instructions pour l'agent Cursor :**
Tu es un expert WebDev, spécialisé en WLangage. Tu aides à :
- Analyser les scripts WLangage pour en extraire la logique
- Traduire en équivalent Python/JS si besoin
- Identifier les erreurs de logique dans les pages, composants ou classes internes
- Recommander une structuration MVC propre
**Prompt type :**
```text
Voici un script WLangage de projet WebDev.
1. Analyse la structure de la page et des composants internes
2. Explique leur interaction
3. Suggère une traduction en Python/Pydantic ou JS si applicable
```

View File

@ -0,0 +1,18 @@
## Cursor Agent Template : Migration Windows → Linux
**Instructions pour l'agent Cursor :**
Tu aides à migrer un projet Windows vers Linux :
- Conversion PowerShell → Bash
- Détection des appels système ou dépendances spécifiques Windows
- Suggestions de remplacement open-source sous Linux
- Gestion des autorisations, cron, systemd, chemins relatifs
**Prompt type :**
```text
Je veux porter ce script et projet depuis Windows vers Linux.
1. Quelles sont les modifications nécessaires ?
2. Traduis les scripts vers Bash
3. Liste les dépendances à adapter
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -0,0 +1,199 @@
# ⚙️ Architecture enrichie Prétraitement PDF + Agents LLM personnalisables pour Ragflow
## 🎯 Objectif
Structurer un programme complet de prétraitement de documents PDF techniques (type normes), intégrant :
- Affichage interactif du PDF
- Sélection visuelle de zones à analyser
- Choix dynamique des LLMs à chaque étape
- Personnalisation des paramètres de génération
- Export structuré en Markdown pour Ragflow
---
## 🧠 LLMs disponibles via Ollama (http://217.182.105.173:11434)
| Rôle | Nom du modèle | Taille | Notes |
|------------------|---------------------------------------------|----------|------------------------------------------------|
| Texte rapide | `mistral:latest` | 4.1 GB | Idéal pour traduction courte ou génération FR |
| Traduction fine | `cline_deepseek`, `qwen2.5`, `mistral` | 6477 GB | Meilleur raisonnement logique |
| Résumé avancé | `deepseek-r1:70b-llama-distill-q8_0` | 74 GB | Long documents, résumés normés |
| Vision complète | `llama3.2-vision:90b-instruct-q8_0` | 95 GB | Le plus puissant pour schémas annotés |
| Vision rapide | `llava:34b-v1.6-fp16` | 69 GB | Prototypage ou analyse légère |
| Embedding | `nomic-embed-text:137m-v1.5-fp16` | 274 MB | Pour vectorisation RAG |
| Reranker | `bge-reranker-v2-m3` | 1.2 GB | Classement de pertinence |
---
## 🧩 Profils de configuration LLM
### 🔁 Modes prédéfinis
| Mode | Vision | Traduction | Résumé |
|----------------|----------------------|------------------|------------------|
| Test rapide | `llava` | `mistral` | `mistral` |
| Standard | `llava` | `qwen2.5` | `deepseek` |
| Avancé | `llama3.2-vision` | `deepseek` | `deepseek` |
---
## 🧠 Architecture des agents LLM
### 📦 Base : `LLMBaseAgent`
```python
class LLMBaseAgent:
def __init__(self, model_name, endpoint, **generation_config):
self.model_name = model_name
self.endpoint = endpoint
self.config = generation_config
def generate(self, prompt, images=None):
# Requête HTTP vers Ollama API
pass
```
### 🧱 Spécialisations :
- `VisionAgent` : Interprétation de schémas
- `TranslationAgent` : Traduction FR ↔ EN
- `SummaryAgent` : Résumé / Réécriture
---
## ⚙️ Paramètres de génération à exposer
| Paramètre | Description | Exemple par défaut |
|------------------|--------------------------------------------------|---------------------|
| `temperature` | Contrôle de la créativité | 0.2 (factuel) |
| `top_p` | Nucleus sampling (proportion cumulée) | 0.9 |
| `top_k` | Nombre de tokens candidats | 40 |
| `num_predict` | Nombre max de tokens générés | 512 ou 1024 |
| `repeat_penalty` | Réduction des répétitions | 1.1 |
| `stop` | Liste de tokens d'arrêt | `["\n\n"]` |
---
## 🧩 UI Interface utilisateur LLM
Dans linterface graphique :
- 🔘 Menus déroulants pour **choisir le modèle par tâche**
- 🧪 Champs sliders ou numériques pour :
- temperature
- top_k
- top_p
- max_tokens
- 💾 Bouton « Sauvegarder profil personnalisé »
- 📂 Fichier `llm_config.json` utilisé à lexécution
---
## ✅ Exemple de bloc `.md` généré
```md
## Figure 4 Répartition granulométrique
**Contexte** : Ce schéma illustre la classification...
**Analyse par modèle Vision** (llama3.2-vision):
- The diagram shows a distribution curve...
- Key terms: grain size, density...
**Paramètres utilisés** : temperature=0.3, top_p=0.95, modèle=llama3.2-vision
```
---
## 📦 Fichiers suggérés
- `config/llm_profiles.json` : profils prédéfinis
- `config/llm_custom.json` : dernier profil personnalisé utilisé
- `agents/vision.py`, `agents/translation.py`, etc. : agents spécifiques
- `utils/api_ollama.py` : centralise les appels aux modèles
---
## 🧠 Conclusion
> Cette structuration permet une flexibilité complète :
- pour le développement rapide
- pour les expérimentations
- pour la production normée de chunks optimisés pour Ragflow
---
## 🧑‍💻 Rôles dagents spécialisés avec langues et prompts adaptés
### 🎭 Objectif
Chaque agent doit :
- Avoir un rôle explicite (vision, résumé, reformulation, etc.)
- Être lié à un modèle spécifique (optimisé pour la tâche)
- Suggérer ou imposer une **langue de prompt adaptée**
- Fournir des **préréglages de génération** par défaut
---
### 🔁 Exemples dagents spécialisés
| Rôle | Classe agent | Modèle recommandé | Langue du prompt | Température | Notes |
|-----------------------|----------------------|-------------------------------|------------------|-------------|-------|
| 🔍 Interprétation | `VisionAgent` | `llama3.2-vision` | 🇬🇧 Anglais | 0.2 | Précision, analyse dimage |
| ✍️ Résumé normatif | `SummaryAgent` | `deepseek-r1` | 🇫🇷 Français | 0.3 | Résumé technique long |
| 🔄 Traduction | `TranslationAgent` | `mistral`, `qwen2.5` | 🇫🇷↔🇬🇧 Auto | 0.1 | Traduction fidèle |
| 🧱 Reformulation | `RewriterAgent` | `mistral` ou `deepseek` | 🇫🇷 Français | 0.3 | Clarification technique |
| 🧩 Markdown Formatter | `MarkdownAgent` | `cline_qwen_fp16`, `mistral` | 🇫🇷 | 0.25 | Structuration finale |
---
### ⚙️ Intégration dans le système de profils
Chaque profil (`test`, `standard`, `avancé`) peut :
- Charger automatiquement les **agents recommandés**
- Définir pour chaque rôle :
- `modèle`
- `langue`
- `params` : temperature, top_p, top_k, etc.
- prompt_template (optionnel)
---
### 🗂️ Exemple de configuration dans `llm_profiles.json`
```json
{
"standard": {
"translation": {
"model": "mistral",
"language": "fr",
"temperature": 0.1
},
"vision": {
"model": "llava",
"language": "en",
"temperature": 0.2,
"top_p": 0.95
},
"summary": {
"model": "deepseek-r1",
"language": "fr",
"temperature": 0.3
}
}
}
```
---
### 💬 Exemple dutilisation (interface ou ligne de commande)
- Sélectionner un **rôle** : "interpréter un schéma"
- Loutil :
- Affiche le modèle recommandé (`llama3.2-vision`)
- Définit la langue du prompt : 🇬🇧
- Pré-remplit température / top_p
- Permet lédition ou loverride
---
Cette stratégie permet dadapter finement les prompts, la langue et les paramètres à chaque rôle métier dans ton flux RAG/Ragflow.

View File

@ -0,0 +1,305 @@
1. Le fonctionnement du RAG (Retrieval-Augmented Generation) dans le cadre d'une utilisation avec des LLM locaux, incluant de la documentation, des exemples concrets en Python avec LangChain et LlamaIndex, ainsi que des cas dusage industriels.
2. Les fonctionnalités complètes, cas dusage, retours dexpérience et exemples de pipeline autour de la plateforme Ragflow.io.
3. Lorganisation optimale de ton usage professionnel de Ragflow, avec recommandations sur lorganisation des KB (normes, essais, formules, etc.), lutilisation de LLM vision, le chunking par type de document, lintégration avec des agents, et une proposition darchitecture personnalisée.
# Systèmes RAG (Retrieval-Augmented Generation) avec LLM Locaux
Les systèmes de **Retrieval-Augmented Generation (RAG)** combinent la recherche dinformation dans une base de connaissances avec la génération en langage naturel par un modèle de langage. Lobjectif est de pallier les limites dun LLM (Large Language Model) « pur » en lui fournissant du contexte **à jour et spécifique au domaine** lors de la génération des réponses ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=1,order%20to%20provide%20an%20answer)) ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=A%20different%20approach%20is%20to,as%20text%20and%2For%20image%20data)). Cela est particulièrement utile avec des **LLM locaux** (exécutés en interne sans appel à une API cloud), car ceux-ci peuvent être limités en connaissances entraînées ou nécessiter des données métier confidentielles non incluses dans leurs corpus dentraînement.
## Fonctionnement du Pipeline RAG
Un pipeline RAG typique comporte deux grandes phases : **(1) Indexation** des connaissances et **(2) Récupération + Génération** lors des requêtes. Chaque phase comporte plusieurs étapes clés  ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=A%20different%20approach%20is%20to,as%20text%20and%2For%20image%20data)) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=In%20conclusion%2C%20RAGFlow%20stands%20as,content%2C%20including%20charts%2C%20diagrams%2C%20and)) :
- **Chargement des documents sources** : On commence par collecter les données métier (textes, documents PDF, rapports, etc.). Des _loaders_ spécialisés sont utilisés pour extraire le texte de différents formats (fichiers locaux, pages web, bases de données…). Par exemple, LangChain propose des `DocumentLoader` pour lire des PDFs ou du texte brut, tandis que LlamaIndex (ex-GPT Index) offre `SimpleDirectoryReader` ou des loaders pour DataFrames Pandas, etc ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=Loaders%20are%20essential%20for%20loading,loaders%20for%20common%20document%20types)) ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=Code%20Example%3A%20Loading%20a%20Text,Document%20in%20LlamaIndex)).
- **Chunking (découpage en morceaux)** : Les documents sont ensuite découpés en segments de texte de taille gérable (appelés _chunks_), en veillant à ne pas briser le contexte pertinent. Cela permet de **respecter les limites de tokens** du LLM tout en conservant la cohérence sémantique ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=Splitters%20help%20break%20large%20documents,models%20like%20GPT%20or%20BERT)). Les frameworks proposent des _text splitters_ configurables. Par exemple, LangChain utilise des `TextSplitter` (taille fixe, découpage par phrases, par paragraphe, etc.), et LlamaIndex permet aussi de choisir la taille en tokens de chaque chunk ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=In%20LlamaIndex%2C%20you%20can%20specify,grained%20control%20over%20chunk%20size)). Une bonne stratégie de chunking est cruciale : des chunks trop grands risquent de dépasser la fenêtre du modèle, tandis que des chunks trop petits peuvent perdre le contexte ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=This%20can%20be%20manuals%2C%20online,as%20text%20and%2For%20image%20data)).
- **Encodage et Indexation** : Chaque chunk est converti en **vecteur dembedding** (représentation numérique) grâce à un modèle dembedding sémantique. Ces vecteurs sont stockés dans une **base vectorielle** qui permettra la recherche par similarité de cosinus. Par exemple, avec LangChain on peut créer un index FAISS ou Milvus en appelant `FAISS.from_documents(chunks, embedding_model)` ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=from%20langchain,openai%20import%20OpenAIEmbeddings)). LlamaIndex fournit des structures comme `GPTVectorIndex` ou `GPTTreeIndex` pour indexer les documents ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=LlamaIndex%20simplifies%20indexing%20through%20its,like%20structure%20for%20efficient%20retrieval)). Lindexation rend la recherche future très rapide, même sur des milliers de documents, en retrouvant les chunks les plus pertinents via leurs vecteurs ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=Indexing%20is%20the%20heart%20of,based%20on%20a%20user%20query)) ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=,OpenAIEmbeddings)).
- **Recherche de documents pertinents (Retrieval)** : Lorsquune question utilisateur est posée, le système convertit la requête elle-même en vecteur (via le même modèle dembedding) puis effectue une **recherche de similarité** dans la base vectorielle. On obtient ainsi les _k_ meilleurs chunks correspondants (par ex. les 35 passages jugés les plus similaires à la question) ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=This%20can%20be%20manuals%2C%20online,as%20text%20and%2For%20image%20data)). Certains systèmes combinent plusieurs modes de recherche (_hybrid search_) : recherche vectorielle sémantique, recherche lexicale type BM25, etc., afin daméliorer la pertinence cest ce quon appelle parfois **“multiple recall”** (rappel multiple) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=1,leads%20to%20the%20integration%20of)) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=The%20two%20issues%20highlighted%20above,a%20broader%20audience%20of%20both)). Lobjectif est de trouver les _“nouvelles connaissances”_ à fournir au modèle de langue.
- **Génération de la réponse (Generation)** : Enfin, ces chunks de connaissances sont concaténés (généralement avec une invite/prompt gabarit) et fournis en **contexte additionnel** au LLM pour générer la réponse finale ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=This%20can%20be%20manuals%2C%20online,as%20text%20and%2For%20image%20data)). Le modèle intègre ces informations externes dans son raisonnement, ce qui permet dobtenir des réponses précises et **actualisées**, tout en réduisant les hallucinations (puisque le LLM sappuie sur du contenu factuel) ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=Instead%20an%20embedding%20is%20computed,LLM%20to%20formulate%20the%20answer)). On utilise souvent une _chaîne_ ou _pipeline_ qui combine le récupérateur et le LLM. Par exemple, LangChain propose la chaîne `RetrievalQA` qui prend un retriever (interface de lindex vectoriel) et un LLM pour retourner directement la réponse ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=from%20langchain,llms%20import%20OpenAI)). Avec LlamaIndex, on peut créer un objet `query_engine` à partir de lindex et simplement appeler `query_engine.query("...")` pour obtenir la réponse avec citations ([LangChain vs. LlamaIndex, A Comprehensive Comparison for Retrieval-Augmented Generation (RAG) | by Tamanna | Medium](https://medium.com/@tam.tamanna18/langchain-vs-llamaindex-a-comprehensive-comparison-for-retrieval-augmented-generation-rag-0adc119363fe#:~:text=LlamaIndex%20provides%20a%20similar%20approach,retrieval%20and%20language%20model%20generation)).
([RAG (Retrieval Augmented Generation) with LlamaIndex, Elasticsearch and Mistral - Elasticsearch Labs](https://www.elastic.co/search-labs/blog/rag-with-llamaIndex-and-elasticsearch)) _Figure: Schéma simplifié dun pipeline RAG. Durant la phase dindexation (haut), les documents sont chargés, découpés en chunks, puis encodés et stockés dans une base vectorielle (ici Elasticsearch via LlamaIndex). Lors dune requête (bas), le système retrouve les _Top K_ chunks les plus similaires, les envoie avec la question au LLM local (ex: Mistral 7B), qui produit alors une réponse en langage naturel ([RAG (Retrieval Augmented Generation) with LlamaIndex, Elasticsearch and Mistral - Elasticsearch Labs](https://www.elastic.co/search-labs/blog/rag-with-llamaIndex-and-elasticsearch#:~:text=In%20this%20blog%20we%20will,a%20locally%20running%20Mistral%20LLM)) ([RAG (Retrieval Augmented Generation) with LlamaIndex, Elasticsearch and Mistral - Elasticsearch Labs](https://www.elastic.co/search-labs/blog/rag-with-llamaIndex-and-elasticsearch#:~:text=Mistral%20provides%20both%20open,right%20API%20keys%20and%20packages))._
Chaque composant du pipeline RAG peut être ajusté en fonction des besoins industriels : choix du modèle dembedding (généraliste vs spécialisé domaine), méthode de chunking (taille fixe ou basée sur la structure du document), type de vecteur store (FAISS en mémoire, ElasticSearch, ChromaDB, etc.), et bien sûr choix du LLM (en local, calibré selon le niveau de performance souhaité).
**Pourquoi RAG + LLM local ?** Un LLM local, hébergé sur site (on-premise), présente lavantage de la **confidentialité** (les données sensibles ne quittent pas lentreprise) et du contrôle des coûts une fois le modèle déployé. Cependant, il peut ne pas connaître les données spécifiques de lentreprise si on ne la pas finement entraîné dessus. Le RAG vient combler ce manque de connaissance : on évite de réentraîner le modèle pour chaque mise à jour de documents, on injecte simplement les données à la volée dans le prompt ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=One%20approach%20to%20reduce%20these,approach%20is%20not%20commercially%20viable)). Cela **évite un fine-tuning coûteux** (en données, expertise et calcul) tout en maintenant les réponses à jour (puisque la base documentaire peut être enrichie en continu). En pratique, on observe que pour de nombreuses applications industrielles, un pipeline RAG bien conçu est plus **rapide à mettre en œuvre et à généraliser** quun entraînement sur-mesure dun modèle de langage ([RAG vs. Fine-Tuning: Which is Better? - Stack AI](https://www.stack-ai.com/blog/fine-tuning-vs-rag#:~:text=RAG%20vs.%20Fine,tuning%20is%20better)) ([A New Study Compares RAG & Fine-Tuning For Knowledge Base ...](https://cobusgreyling.medium.com/a-new-study-compares-rag-fine-tuning-for-knowledge-base-use-cases-fa2383357fba#:~:text=A%20New%20Study%20Compares%20RAG,Tuned)). Par exemple, une étude récente sur la sécurité dans la construction a montré quun système RAG spécialisé améliorait la précision des réponses de **21,5%** par rapport à un LLM générique GPT-4, rivalisant ainsi avec un LLM finetuné sur le domaine (qui améliorait de 26%) ([Performance comparison of retrieval-augmented generation and ...](https://www.sciencedirect.com/science/article/abs/pii/S092658052400582X#:~:text=,The%20findings%20highlight)).
### Exemple de Pipeline RAG avec LangChain (Python)
Le code ci-dessous illustre sommairement comment mettre en place un pipeline RAG en Python à laide de **LangChain** et dun modèle local (pour lexemple on considère un modèle type Llama-2 déployé localement via HuggingFace Transformers) :
```python
# 1. Charger les documents (texte brut par ex.)
from langchain.document_loaders import TextLoader
loader = TextLoader("data/manuel_beton.txt", encoding='utf-8')
documents = loader.load() # liste de Document
# 2. Chunking des documents en morceaux de 500 tokens max
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs_chunks = text_splitter.split_documents(documents)
# 3. Création des embeddings et de lindex vectoriel (FAISS ici)
from langchain.embeddings import HuggingFaceEmbeddings
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
from langchain.vectorstores import FAISS
vector_index = FAISS.from_documents(docs_chunks, embedding_model)
# 4. Initialisation du modèle de langage local (ex: Llama-2 13B en local)
from langchain.llms import HuggingFacePipeline
local_llm = HuggingFacePipeline.from_model_id(model_id="TheBloke/Llama-2-13B-chat-hf", task="text-generation")
# 5. Construction de la chaîne QA avec récupération
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA(combine_documents_chain=None, retriever=vector_index.as_retriever(), llm=local_llm)
# 6. Pose dune question
query = "Quelle est la résistance caractéristique du béton C30/37 ?"
result = qa_chain.run(query)
print(result)
```
Dans cet exemple, LangChain facilite chaque étape : chargement du fichier `manuel_beton.txt`, découpage en chunks de ~500 tokens avec chevauchement, création dun index vectoriel FAISS à laide dun modèle dembedding (MiniLM dans lexemple), puis configuration dune chaîne de type Questions/Réponses (`RetrievalQA`) combinant cet index et un LLM local. La requête utilisateur (« Quelle est la résistance caractéristique du béton C30/37 ? ») est transformée en vecteur, les passages pertinents sont récupérés, et le LLM génère une réponse en français sur la base de ces passages.
> **Remarque :** On peut tout à fait utiliser des bases vectorielles industrielles plus robustes à la place de FAISS, par exemple Milvus, RedisVector, Elasticsearch, etc., via les connecteurs fournis dans LangChain. De même, pour le LLM local, on pourrait utiliser une interface `LLMChain` avec un pipeline custom HuggingFace (comme montré) ou une API locale comme **Ollama** ou **FastAPI**. Limportant est que le LLM accepte en entrée le contexte (chunks concaténés + question) et produise la réponse augmentée.
### Exemple de Pipeline RAG avec LlamaIndex (Python)
LlamaIndex (anciennement GPT Index) offre une approche intégrée pour construire des applications RAG. Il gère la lecture, lindexation et les requêtes de façon plus « haut niveau ». Voici un exemple dutilisation de **LlamaIndex** (alias `llama_index` en Python) :
```python
# 1. Charger des documents dun dossier
from llama_index import SimpleDirectoryReader, GPTVectorStoreIndex, LLMPredictor, PromptHelper
docs = SimpleDirectoryReader('./data/rapports_essais').load_data()
# 2. Initialiser lindex vectoriel avec un LLM local pour la synthèse
from llama_index import ServiceContext
from transformers import pipeline
local_model = pipeline('text-generation', model='NousResearch/LLaMA2-7b-hf') # modèle local
llm_predictor = LLMPredictor(llm=local_model)
# Configurer éventuellement un prompt helper (longueur max, etc.)
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, chunk_size_limit=512)
index = GPTVectorStoreIndex.from_documents(docs, service_context=service_context)
# 3. Construire un moteur de requête à partir de lindex
query_engine = index.as_query_engine(response_mode="compact")
# 4. Poser une question via le moteur de requête
response = query_engine.query("Donnez un résumé des résultats pour l'éprouvette 7J du test 2023-04.")
print(response.response)
print(response.get_sources()) # éventuellement afficher les sources utilisées
```
Ici, LlamaIndex prend en charge lindexation vectorielle via `GPTVectorStoreIndex.from_documents`. On lui fournit la liste des documents bruts, ainsi quun `ServiceContext` qui peut inclure le LLM (ou un wrapper) à utiliser pour certaines opérations internes. Dans cet exemple, on configure un pipeline HuggingFace pour un modèle local LLaMA-2 7B afin que LlamaIndex lutilise pour générer les réponses (**Note:** LlamaIndex peut en réalité utiliser un LLM différemment de LangChain il peut même sappuyer sur OpenAI ou autres en interne, mais on privilégie un usage local). Lappel `query_engine.query()` va automatiquement effectuer la recherche des passages pertinents et retourner la réponse formulée, que lon peut obtenir via `response.response`. Si configuré, `response.get_sources()` fournit les références des documents utilisés, permettant dafficher des citations ou des liens (ce qui est essentiel dans un contexte industriel pour **vérifier les sources** de la réponse générée).
### Cas dusages concrets en milieu industriel
Les pipelines RAG avec LLM présentent un intérêt fort pour **diffuser la connaissance technique** dans lentreprise de façon naturelle (chatbot, assistant virtuel) tout en garantissant que les réponses sont appuyées sur la documentation interne. Quelques exemples dans le secteur **BTP / matériaux (comme le béton)** :
- **Assistance aux ingénieurs et techniciens** : un assistant pourrait répondre aux questions sur les _normes_ de construction (Eurocodes, DTU…) ou sur des _procédures internes_. Par exemple, « Quelle est la durée de cure recommandée pour un béton haute performance selon la norme X ? » le système ira chercher dans la norme PDF correspondante le passage adéquat et le LLM local formulera la réponse en citant la norme. De même, sur chantier, un contremaître pourrait demander « Quels sont les EPI requis pour le coulage dune dalle selon notre protocole ? » et obtenir immédiatement une réponse fondée sur le manuel HSE de lentreprise, à jour.
- **Recherche dans les rapports dessais et données techniques** : Les entreprises de matériaux accumulent de nombreux rapports de laboratoire (essais de compression, de flexion, analyses chimiques, etc.). Un système RAG peut permettre de _questionner ces données historiques_. Par exemple : « Quel a été le taux de compression moyen à 28 jours pour la formule de béton XYZ utilisée sur le projet ABC ? ». Le RAG va retrouver le rapport dessai correspondant dans la base documentaire et fournir la valeur avec la référence du rapport. Cela évite de parcourir manuellement des dizaines de rapports PDF. On peut aussi imaginer des résumés générés sur mesure, par ex. « Résume-moi les différences de performances entre la formule A et B ».
- **Support client et commercial** : Dans le cas dun fournisseur de béton, un assistant client interne pourrait répondre aux questions techniques des clients ou de léquipe commerciale. Par exemple « Quel béton recommandez-vous pour une résistance au gel/dégel extrême ? » Lassistant pourrait rechercher dans des fiches techniques produit et fournir la recommandation (e.g. un béton spécifique additivé, en citant la fiche technique). Il pourrait aussi retrouver des cas dapplication similaires dans la base de données projets de lentreprise. Cela améliore la réactivité du support tout en garantissant la précision (réponses étayées par les documents).
- **Gestion des connaissances de chantier** : Sur les gros projets, on produit des _retours dexpérience_ (REX), des comptes-rendus, des plans avec annotations, etc. Un assistant RAG pourrait permettre aux nouveaux ingénieurs de consulter ces connaissances facilement en langage naturel. Ex: « Quelles ont été les principales difficultés rencontrées lors du coulage du pont XYZ et comment ont-elles été résolues ? ». Lassistant pourrait extraire la réponse depuis le rapport de fin de chantier correspondant.
Ces exemples illustrent comment RAG répond au besoin de **recherche précise dans un corpus documentaire volumineux et hétérogène**, tout en fournissant une réponse directe en langage naturel. On gagne en **productivité** (accès instantané à linfo) et en **fiabilité** (la source étant citée, lutilisateur peut vérifier le document original).
Notons quen environnement industriel, la qualité des documents sources est variable (scans PDF, tableaux, formules…). Un bon système RAG devra donc sappuyer sur des méthodes robustes de **compréhension de documents** (extraction de texte fiable, y compris OCR sur images, traitement des tableaux, etc.) et éventuellement de **nettoyage** avant lindexation. En effet, _Garbage In, Garbage Out_ si la donnée est mal indexée (par ex. texte désorganisé), le LLM produira des réponses erronées ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=along%20with%20a%20fancy%20UI%2C,%E2%80%9D)) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=The%20two%20issues%20highlighted%20above,a%20broader%20audience%20of%20both)). Cest pourquoi des solutions apparaissent pour améliorer cette étape dingestion, comme nous allons le voir avec **RAGFlow**.
## Synthèse à jour sur RAGFlow.io (Mars 2025)
**RAGFlow** (site officiel : ragflow.io) est un moteur open-source de RAG lancé en 2024, qui propose une solution _clé en main_ pour créer des assistants type question-réponse basés sur des documents. Il se distingue par un accent mis sur la **compréhension profonde des documents** (Deep Document Understanding) et sur la facilité dutilisation via une interface graphique (dashboard) complète. RAGFlow a été open-sourcé le 1ᵉʳ avril 2024 et a déjà été adopté par plusieurs entreprises, avec des mises à jour fréquentes jusquen 2025 ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=the%20original%20texts%20that%20the,depicted%20in%20the%20picture%20below)).
### Fonctionnalités principales de RAGFlow
- **Interface Web (Dashboard) intuitive** : RAGFlow offre un tableau de bord web pour gérer lintégralité du workflow RAG. On peut créer des **Knowledge Bases** (bases de connaissances) distinctes, importer des fichiers, configurer les modèles de LLM et dembedding, et tester des requêtes le tout via lUI. La section _Knowledge Base_ permet de suivre létat du parsing des documents et dinspecter les chunks extraits, la section _Chat_ permet de configurer et lancer des sessions de chat IA, et on trouve aussi des pages de configuration et de monitoring.
- **Support de multiples formats de documents (hétérogénéité)** : RAGFlow peut ingérer des documents **bureautiques** (Word, PDF, PowerPoint, Excel, texte brut), des **images y compris scans** (documents scannés, schémas), des pages web, et même des données structurées (par ex CSV) ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=,data%2C%20web%20pages%2C%20and%20more)). Il intègre une chaîne danalyse de documents (_DeepDoc_) basée sur la vision qui détecte la structure des fichiers PDF complexes, identifie les titres, paragraphes, tableaux, images, etc ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=1,details%20within%20these%20comprehensive%20numbers)). Pour les **tableaux**, RAGFlow reconnait la structure cellulaire et conserve les associations colonnes-lignes (ex : il peut relier la valeur dune cellule à lintitulé de colonne approprié), ce qui permet de poser des questions pointues sur des données tabulaires ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=processing%20system%3A%20When%20users%20upload,document%20processing%20system%20with%20diverse)) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=elements%20like%20images%20and%20tables,For)). Cette compréhension fine évite dinsérer en base des textes désorganisés (ex: cellules de tableau concaténées nimporte comment), problème courant avec des parsers basiques ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=vector%20databases%20and%20RAG%20orchestration,%E2%80%9D)).
- **Chunking intelligent et template-based** : Contrairement à un découpage uniforme, RAGFlow propose des **profils de chunking adaptés au type de document ou au cas dusage** ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=2,For%20instance)) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=In%20this%20way%2C%20it%20is,processing%20tasks%20more%20readily%20accessible)). Par exemple, il existe des modes “Paper” (pour articles académiques), “Law” (pour des documents juridiques structurés), “Table” (pour forcer un traitement optimisé des tableaux), “Book”, “Manual”, “Q&A”, “Resume”, etc. Chacun ajuste la façon dont le document est découpé et quelles métadonnées sont extraites. Ce template-based chunking permet dobtenir des chunks **pertinents et explicables**, et lutilisateur peut choisir loption la plus adaptée à ses données métier. Ce niveau de personnalisation est un point fort de RAGFlow pour répondre à des besoins sectoriels variés ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=In%20this%20way%2C%20it%20is,processing%20tasks%20more%20readily%20accessible)).
- **Intervention manuelle et transparence** : RAGFlow met laccent sur l**explicabilité** du traitement des documents. Via lUI, après lingestion dun fichier, on peut **visualiser chaque chunk extrait** (texte du chunk, éventuellement aperçu du rendu original) ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=RAGFlow%20features%20visibility%20and%20explainability%2C,To%20do%20so)) ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=2,quick%20view%20of%20each%20chunk)). Lutilisateur peut surligner un chunk pour voir où il se situe dans le document source, comparer le texte extrait à loriginal, et même **éditer** le contenu du chunk ou ajouter des _mots-clés_ manuellement ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=2,quick%20view%20of%20each%20chunk)) ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=containing%20those%20keywords,its%20position%20in%20search%20list)). Par exemple, si un terme important na pas été correctement inclus (ou au contraire si un chunk contient du bruit), lexpert métier peut intervenir avant la phase de question-réponse. On peut aussi assigner des mots-clés à un chunk pour booster sa pertinence lors des recherches (en augmentant son poids dans le ranking) ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=NOTE)). Cette transparence et ce contrôle sont essentiels en contexte entreprise, où lon veut garder la maîtrise sur ce que le LLM utilise comme base ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=3,We%20not%20only%20present%20the)) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=deletions%2C%20and%20look%20up%20information%2C,shown%20in%20the%20pictures%20below)).
- **Réduction des hallucinations et citations** : Chaque réponse fournie par le chat de RAGFlow est accompagnée de **citations** des documents sources (avec des liens vers le texte original) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=In%20conclusion%2C%20RAGFlow%20stands%20as,content%2C%20including%20charts%2C%20diagrams%2C%20and)). Linterface permet de cliquer sur la référence pour ouvrir le document à lendroit exact du chunk ayant servi à la réponse. Cette approche _“closed-loop”_ aide à **valider lexactitude** des réponses et à instaurer la confiance : lutilisateur peut à tout moment vérifier doù vient linformation. RAGFlow implémente également des techniques pour limiter les hallucinations, par exemple en donnant une réponse vide ou générique si rien de pertinent na été trouvé dans la base (plutôt que de forcer le LLM à inventer) ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=,as%20is%20for%20the%20beginning)). On peut configurer un message par défaut (« Désolé, je nai pas dinformation à ce sujet ») pour ces cas-là afin de garder le LLM _grounded_ dans la connaissance disponible.
- **Orchestration RAG complète et modulaire** : RAGFlow intègre tous les composants nécessaires dans une architecture prête à lemploi. En backend, il sappuie sur Elasticsearch (moteur de recherche capable de faire à la fois du vectoriel et du textuel) couplé à un module maison appelé **Infinity** pour le stockage vectoriel optimisé ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=introduced%20Infinity%2C%20a%20dedicated%20database,behind%20the%20launch%20of%20RAGFlow)). Il utilise également MinIO (stockage objet type S3) pour conserver les documents et outputs, et une base SQL (MySQL) pour les métadonnées. Larchitecture comprend aussi un **moteur dagents** capable dexécuter des actions (par ex, effectuer plusieurs requêtes ou combiner des sous-réponses) et un scheduler de tâches asynchrones pour les traitements lourds (OCR, etc.), le tout orchestré via une API FastAPI + workers Python (Celery/Redis) pour traiter en arrière-plan sans bloquer lUI ([Posts by Category | Chaorans Data Story](https://www.ichaoran.com/categories/#:~:text=In%20this%20post%2C%20I%20explore,periodically%20updated%20on%20the%20frontend)). Malgré cette complexité interne, lutilisateur final na pas à se soucier de cela : le déploiement se fait via Docker et lutilisation via lUI ou des appels HTTP/REST.
- **Configuration flexible des modèles** : On peut utiliser RAGFlow avec un LLM en ligne (OpenAI API) ou **intégrer des modèles locaux**. Par défaut (v0.17 début 2025), linterface permet de renseigner une clé API (OpenAI, Azure, etc.) ([Configure model API key - RAGFlow](https://ragflow.io/docs/dev/llm_api_key_setup#:~:text=Configure%20model%20API%20key%20,model%20API%20key%20in%20RAGFlow)) ([FAQs - RAGFlow](https://ragflow.io/docs/dev/faq#:~:text=FAQs,apart%20from%20other%20RAG%20products%3F%E2%80%8B)). Mais RAGFlow supporte aussi nativement lintégration de serveurs de modèles locaux comme **Ollama**, **Xinference**, ou encore Jina et Intel IPEX-LLM ([Deploy LLM locally | RAGFlow](https://ragflow.io/docs/dev/deploy_local_llm#:~:text=RAGFlow%20supports%20deploying%20models%20locally,interacting%20with%20your%20local%20models)). Ces solutions permettent dhéberger des modèles open-source (Llama 2, Mistral, Falcon, etc.) sur ses propres machines, éventuellement en tirant parti du GPU. RAGFlow peut sy connecter en configurant lURL du serveur local. En pratique, cela signifie que lon peut faire tourner lensemble du système **100% en local**, sans dépendance à un service cloud, ce qui est crucial pour des entreprises aux données sensibles. (Un guide détaillé existe pour brancher un LLM custom sur RAGFlow ([Private LLM Integration with RAGFlow: A Step-by-Step Guide | Chaorans Data Story](https://www.ichaoran.com/posts/2024-11-08-ragflow-with-own-llm/#:~:text=As%20of%20now%20,with%20your%20custom%20LLM%20setup)) ([Private LLM Integration with RAGFlow: A Step-by-Step Guide | Chaorans Data Story](https://www.ichaoran.com/posts/2024-11-08-ragflow-with-own-llm/#:~:text=and%20,with%20your%20custom%20LLM%20setup)) ; en novembre 2024 il fallait encore ajuster le code manuellement, mais les mises à jour de décembre 2024 ont apporté un support intégré pour Ollama et co).
- **Recherche multi-stratégie (Multiple Recall)** : RAGFlow ne se contente pas dune simple similarité cosinus. Il utilise un **double rappel** (vectoriel + lexical) avec re-ranking fusionné pour améliorer la pertinence des documents retrouvés ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=,for%20seamless%20integration%20with%20business)) ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=Automated%20and%20effortless%20RAG%20workflow)). Concrètement, pour chaque requête, il peut effectuer une recherche par vecteur **et** par mots-clés (via Elasticsearch par ex.), puis fusionner les résultats (pondérés par des scores) afin dattraper aussi bien des correspondances sémantiques que des exact match de termes. LUI de “Retrieval testing” montre dailleurs les contributions _Hybrid Similarity_, _Term Similarity_ et _Vector Similarity_ pour chaque résultat. Cette approche hybride permet de mieux gérer les questions pointues où un mot technique rare doit être retrouvé tel quel, ou à linverse des reformulations.
- **Évolutivité et Monitoring** : Pensé pour une utilisation en entreprise, RAGFlow supporte la gestion **multi-utilisateurs/équipes** (avec contrôle daccès aux différentes bases de connaissances), et fournit des outils de supervision. Par exemple, on peut monitorer les performances via Kibana (puisque Elasticsearch est dans la boucle) et la consommation de ressources. Un module _Monitoring_ permet de voir les requêtes passées, les temps de réponse, etc. De plus, étant open-source, toute larchitecture peut être déployée sur les serveurs de lentreprise (Docker compose fourni) et adaptée si besoin.
En résumé, RAGFlow se positionne comme une **solution de bout en bout** pour le RAG, avec un souci de **qualité des données en entrée** (“Quality in, quality out” est leur slogan ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=))) et de **fiabilité des réponses en sortie** (citations, réduction dhallucinations). Il vise à démocratiser le RAG en entreprise, même pour des documents complexes, sans exiger de lutilisateur de construire lui-même lorchestration avec LangChain ou autre.
### Exemples de pipelines configurables avec RAGFlow
Dans RAGFlow, on ne code pas le pipeline, on le **configure**. Voici comment se déroule typiquement la configuration dun pipeline complet via linterface :
1. **Création dune base de connaissance** : Lutilisateur crée une nouvelle _Knowledge Base_ via lUI, par exemple “Normes_Béton”.
2. **Upload des documents** : Il importe ses fichiers (par glisser-déposer ou via le sélecteur). Mettons quil importe 5 PDF de normes (Eurocode 2, normes NF pour béton…). Chaque document apparaît dans la liste avec un statut _“Uploaded”_. On peut grouper les documents en _Dataset_ au sein de la base.
3. **Parsing et chunking** : Lutilisateur clique sur _“Parse”_ pour lancer le traitement. RAGFlow va analyser chaque fichier (OCR si image scannée, extraction de texte, découpage). On peut choisir un **template de chunking** avant de lancer le parse : par ex. le mode “Law” pourrait convenir pour des normes (découpe par articles/aléas), ou “Manual”. Une fois le parsing terminé, le statut passe à _SUCCESS_, et on peut cliquer sur le document pour voir les chunks ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=RAGFlow%20features%20visibility%20and%20explainability%2C,To%20do%20so)). Supposons quune norme PDF de 50 pages a été découpée en 120 chunks de ~200 mots chacun.
4. **Vérification/édition (optionnel)** : En examinant les chunks, lutilisateur voit que certains titres nont pas été correctement rattachés. Il peut éditer ces chunks pour ajouter le titre manquant, ou fusionner/séparer des chunks si nécessaire. Il peut aussi ajouter des mots-clés métiers (p. ex. “fibre”, “sulfate”) sur certains chunks pour améliorer la recherche ultérieure ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=NOTE)). Par exemple, tagguer un chunk parlant de “durabilité sulfate” avec mot-clé “XS exposé” si cest un terme de requête fréquent.
5. **Configuration des modèles** : Dans _Configuration_, on sassure que le **LLM** choisi est bien paramétré. Pour une utilisation purement locale, on aurait paramétré un LLM hébergé via Ollama ou autre, disons un modèle “LLM Maison 20B” qui a été branché. De même, on vérifie le **modèle dembedding** utilisé pour indexer (par défaut, RAGFlow inclut un modèle dembedding peut-être basé sur SBERT mais on pourrait en changer).
6. **Test de récupération** : RAGFlow propose un onglet _Retrieval testing_ où on peut taper une question de test et voir quels chunks seraient retrouvés. Par exemple : “Quelle est la résistance minimale en compression à 28j pour un béton XC4 ?”. Le système va afficher les top résultats de chunk avec les scores hybride/terme/vecteur. On peut ainsi ajuster le **seuil de similarité** ou le paramètre de pondération sémantique vs lexical (deux curseurs sont présents) pour affiner le comportement. Si les résultats ne sont pas satisfaisants, on peut revenir en arrière ajouter un mot-clé ou ajuster le chunking.
7. **Création de lassistant (pipeline de chat)** : Une fois la base prête, on crée un **Assistant** dans longlet _Chat_. On donne un nom (par ex. “Assistant Normes Béton”), on sélectionne la ou les bases de connaissance sur lesquelles il devra sappuyer (on pourrait cocher plusieurs bases si on veut quil puise dans plusieurs à la fois) ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=Conversations%20in%20RAGFlow%20are%20based,and%20start%20an%20AI%20conversation)) ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=2)). On choisit le modèle de chat (si on en a plusieurs configurés) et on peut personnaliser le _prompt système_ (RAGFlow permet déditer le prompt damorce, appelé _Prompt Engine_). On peut par exemple insister “Tu es lassistant des normes béton, tu fournis des réponses précises en citant les références normatives.”.
8. **Lancement du chat et configuration fine** : On démarre une session de chat avec cet assistant. A chaque question posée, RAGFlow va : interroger lindex vectoriel de la base, récupérer les passages pertinents, formuler la réponse avec citations. Si la base ne contient rien de pertinent et quon a renseigné un message dabsence (« _Désolé..._ »), il lutilisera. Sinon, on obtient une réponse avec par ex. “Selon NF EN 206, la résistance caractéristique en compression à 28 jours pour un béton de classe C30/37 est de 37 MPa 【source: Norme NF EN206 p.15】”. On peut alors interagir en langage naturel avec lassistant.
Le “pipeline” RAGFlow est donc **configurable via lUI** plutôt que codé à la main. Chaque assistant créé est en quelque sorte un pipeline instancié (liaison dune ou plusieurs bases de connaissances avec un LLM + paramètres de récupération). RAGFlow stocke ces configurations, et il serait possible via lAPI Python ou HTTP de les appeler ensuite dans une application externe.
### Cas dusage réels de RAGFlow et retours dutilisateurs
- **Support juridique et conformité** : RAGFlow a été utilisé par des entreprises pour créer des assistants capables de parcourir des documents juridiques complexes (contrats, réglementations). Grâce au mode _Law_ et à la vérifiabilité des réponses, ces assistants servent doutils daide pour les équipes légales, en retrouvant rapidement des clauses ou des références précises. Un utilisateur rapporte sur Reddit que _« lUI est conviviale et la capacité à gérer des PDF complexes est excellente, ce qui nous a permis de déployer un chatbot interne pour la compliance »_. Le fait de pouvoir tout héberger en interne (docker + modèles privés) a levé les barrières de confidentialité dans ce contexte.
- **Documentation technique et SAV** : Une PME du secteur électronique mentionne avoir adopté RAGFlow pour centraliser des manuels techniques, fiches produits et tickets support. Leur assistant répond aux techniciens SAV sur des procédures de réparation et aux clients sur des caractéristiques produits. Ils soulignent la **fusion recherche sémantique + mots-clés** de RAGFlow qui permet de trouver la réponse même lorsque la question utilise dautres termes que le document (synonymes) tout en gardant la précision sur des références de modèle.
- **Industrie manufacturière** : Daprès un article de Renumics, RAGFlow (ou un système similaire) sintègre bien pour aider les opérateurs machines ou ingénieurs à naviguer dans les manuels de maintenance et historiques de pannes ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=AI,specific%20assistants)) ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=really%20hard,and%20enable%20matchmaking%20with%20experts)). Un cas cité est un assistant pour une ligne de production qui guide lopérateur dans le diagnostic en croisant le manuel et les logs de maintenance passés. RAGFlow, via son extraction intelligente, pourrait extraire dun PDF de manuel machine les différentes étapes de calibration, les mettre en chunks, et lagent conversationnel peut ensuite y faire référence pour guider pas à pas.
- **Environnements multilingues** : RAGFlow supportant la traduction lors de la phase de chunking (via le LLM lui-même si besoin), des entreprises lemploient pour unifier la recherche sur des documents en plusieurs langues. Par exemple un assistant RH pour une multinationale peut répondre en français en sappuyant sur des documents internes anglais ou chinois, car le système a indexé en langue source mais le LLM peut traduire la question ou la réponse à la volée. Cela exploite les capacités de **traduction** et de **résumé** du LLM couplées à RAG ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=%2A%20LLM,issues)).
En termes de **retours utilisateurs**, RAGFlow est souvent salué pour sa **complétude** : pas besoin de combiner X outils, tout est dans la suite. Linterface de chunk preview est un vrai plus pour la confiance dans le système. La contrepartie est que cest une solution relativement **lourde** à déployer : certains ont noté que la stack Docker inclut Elastic, a des besoins en RAM/CPU non négligeables, etc. (prérequis : ~16GB RAM, 4 CPU minimum ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=Prerequisites))). Une personne sur un forum a exprimé que _« larchitecture veut tout faire, jai peur quelle peine à scaler en conditions réelles enterprise »_, soulignant que la multiplication des composants (Elastic, MySQL, MinIO, Kibana…) peut complexifier la maintenance. Néanmoins, pour une entreprise qui a les ressources nécessaires, cette architecture modulaire est un avantage car **chacun des composants est remplaçable ou ajustable** (par ex, on pourrait brancher un autre vecteur store à la place dElastic/Infinity si on le souhaite, en adaptant le code).
Côté performance, il nexiste pas encore de **benchmark public** comparant RAGFlow à dautres solutions de RAG. Cependant, on peut comparer par concept : par rapport à un pipeline LangChain “maison”, RAGFlow apporte des optimisations comme le multi-recall et la compréhension de document qui pourraient donner de **meilleures réponses sur des PDF complexes**. En revanche, il ajoute un léger overhead (la requête passe par lAPI RAGFlow, qui interroge Elastic, etc., donc latence un peu plus élevée que des appels directs en mémoire). Pour des bases de connaissance de taille modérée (< quelques milliers de documents), cette latence reste faible (quelques centaines de ms pour la recherche). RAGFlow utilise aussi des **agents** pour éventuellement décomposer des questions ou effectuer des requêtes additionnelles si nécessaire (daprès la roadmap, ils ont ajouté la génération de questions liées pour améliorer le rappel ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=%2A%202024,to%20SQL%20statements%20through%20RAG))). Cela pourrait être utile pour des requêtes complexes nécessitant plusieurs étapes.
En termes de **documentation et ressources** : on trouve la doc officielle sur ragflow.io (bien détaillée avec des guides de configuration ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=This%20quick%20start%20guide%20describes,a%20general%20process%20from)), déploiement local ([Deploy LLM locally | RAGFlow](https://ragflow.io/docs/dev/deploy_local_llm#:~:text=Run%20models%20locally%20using%20Ollama%2C,Xinference%2C%20or%20other%20frameworks)), etc.), le code source sur GitHub (infiniflow/ragflow) ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=What%20is%20RAGFlow%3F)), une communauté Discord active, et quelques articles de blog comme celui publié sur Medium par léquipe InfiniFlow ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=In%20conclusion%2C%20RAGFlow%20stands%20as,content%2C%20including%20charts%2C%20diagrams%2C%20and)) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=the%20original%20texts%20that%20the,depicted%20in%20the%20picture%20below)). Pour se faire la main, un **demo en ligne** est proposé ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=Demo)) (demo.ragflow.io) permettant de tester avec des documents factices.
## Utilisation optimisée de RAGFlow en contexte professionnel (secteur béton)
Enfin, penchons-nous sur un scénario concret : une entreprise spécialisée dans le **béton** (par exemple un fabricant de matériaux ou un bureau détudes béton), possédant des **données critiques** (rapports dessais, formules de mélange, normes internes) et servant des **clients sensibles** (chantier denvergure, infrastructure). Comment mettre en place et optimiser RAGFlow pour ce contexte ?
### Organisation des bases de connaissances par type de document
Il est judicieux de **segmenter la connaissance en plusieurs bases** en fonction des types de documents et dusage, plutôt que de tout mélanger. Par exemple, on pourrait créer les Knowledge Bases suivantes :
- **Base “Normes & Réglementation”** : contiendra les documents normatifs (Eurocodes, normes NF EN, guides CSTB, DTU…). Ces documents ont souvent une structure très formalisée (titres, sections, articles). On pourra appliquer le template de chunking _“Law”_ ou _“Manual”_ de RAGFlow, afin de sassurer que chaque chunk correspond à une clause ou section cohérente dune norme. Cela permettra à lassistant de citer précisément “Article X.Y de la norme Z” dans ses réponses. On veillera à inclure dans les métadonnées de chunk le **titre de la norme** et éventuellement les numéros de section, pour faciliter le traçage dans les citations.
- **Base “Rapports dessais”** : regroupera les rapports de laboratoire (essais de compression, de traction, etc. sur éprouvettes de béton) et peut-être des _feuilles de mesure_ ou bases de données de résultats. Ces documents contiennent souvent des tableaux, graphiques et du texte descriptif. On pourra utiliser le template _“Table”_ de RAGFlow pour optimiser lextraction des données tabulaires : RAGFlow va reconnaître les tableaux, en extraire chaque ligne comme chunk ou intégrer les valeurs avec leurs en-têtes ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=processing%20system%3A%20When%20users%20upload,details%20within%20these%20comprehensive%20numbers)). Il est important ici davoir des embeddings qui capturent bien les **données numériques** et unités, afin quune requête du type “résistance à 7 jours de léchantillon 12B” retrouve effectivement la bonne valeur. On pourrait envisager denrichir les chunks de tableau avec des libellés supplémentaires (ex: ajouter “fcm7=xxx MPa” comme mot-clé si la table a une colonne résistance à 7j). Par ailleurs, on pourrait stocker ces résultats aussi dans une base de données structurée annexe et faire du RAG “text-to-SQL” (RAGFlow a introduit une fonction text-to-SQL ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=%2A%202024,to%20SQL%20statements%20through%20RAG))) mais cela complexifie rester sur pure QA doc peut suffire.
- **Base “Formules et méthodes”** : ici on mettrait des documents liés aux formules de mélange (par ex. fiches de composition de béton, notes de calcul) et aux méthodes de calcul (par ex. formules empiriques utilisées en interne, ou guides techniques). Ces docs peuvent contenir des **formules mathématiques** (ex: formules de dosage, calcul de module délasticité, etc.) et des **schémas** explicatifs (par ex. diagramme de Granulométrie, schéma de poutre chargée). Pour le chunking, le template “Paper” ou “Manual” pourrait convenir, mais il faudra sassurer que les formules ne sont pas _perdues_ lors de lOCR. RAGFlow va essayer de détecter les formules soit comme images, soit comme texte (si PDF texte). Si ce sont des images (ex: formule écrite en LaTeX rendue en PDF), on pourrait avoir RAGFlow les traiter comme des images il reconnait quil y a un objet, mais pas sûr quil en déduise le contenu mathématique. **Idée** : pour chaque formule importante, on pourrait ajouter manuellement dans le chunk une version textuelle (en LaTeX ou en description). Par exemple, après ingestion, éditer le chunk contenant _“voir équation (5)”_ et y insérer la formule en clair si on la connaît. Cela permettra au LLM de disposer de la formule pour raisonner. On peut aussi attacher en _metadata_ que tel chunk contient une formule nommée “(5)” pour sy référer. Cette base “Formules” sera très utile pour des questions du genre « Quelle formule interne utilise-t-on pour estimer la résistance à lavancement ? ».
En séparant ainsi les bases, on obtient une **gestion différenciée** et plus maintenable. Chaque base peut avoir ses propres réglages : par ex, pour “Normes” on pourrait mettre un **poids plus fort sur la recherche lexicale** (car les termes exacts sont importants, e.g. XC4, XA, etc.), tandis que pour “Rapports” on peut favoriser la **similarité sémantique** (car la question pourrait être formulée différemment de la manière dont le rapport est rédigé). RAGFlow permettant de choisir plusieurs bases dans une requête, on pourra toujours créer un assistant global qui interroge toutes les bases si besoin, mais cest bien davoir la modularité.
### Adaptation du chunking et des embeddings par type de document
Comme évoqué, chaque type de document bénéficie dun traitement sur mesure :
- **Documents textuels structurés (normes, manuels)** : Utiliser chunking par section/titre. RAGFlow excelle ici avec la reconnaissance de structure (titre, paragraphes) ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=1,details%20within%20these%20comprehensive%20numbers)). On limitera la taille des chunks à, disons, 200-300 mots pour les normes, afin quune clause = un chunk. Pour lembedding, un modèle type **LegalBERT** ou un modèle finetuné sur des textes techniques pourrait améliorer la représentation, mais si non disponible, un embedding général comme SBERT fera laffaire. On veillera à inclure dans lembedding tout texte pertinent (ne pas laisser de côté déventuels annexes si elles peuvent contenir des réponses).
- **Tableaux de résultats** : RAGFlow va extraire intelligemment, mais on peut décider de la granularité : est-ce quon chunk par ligne de tableau, par cellule, ou un tableau entier comme chunk ? Sil sagit de petits tableaux avec peu de lignes, chunker le tableau entier peut être utile pour que le contexte de toutes les valeurs soit présent. Pour de grands tableaux, mieux vaut chunk par ligne ou groupe de lignes. On sassurera que les **en-têtes de colonnes** sont bien répétées dans chaque chunk (RAGFlow le fait en combinant header + cellule ([RAGFlow: Customizable, Credible, Explainable RAG engine based on document structure recognition models | by InfiniFlow | Medium](https://medium.com/@infiniflowai/ragflow-customizable-credible-explainable-rag-engine-based-on-document-structure-recognition-6a2a2369bd2a#:~:text=elements%20like%20images%20and%20tables,details%20within%20these%20comprehensive%20numbers))). Par exemple, un chunk pourrait devenir “Échantillon 12B Résistance 7j : 25 MPa; 28j : 40 MPa; Module E: 34 GPa”. Ainsi une requête “résistance 28j échantillon 12B” matchera ce chunk. Un modèle dembedding éventuellement spécialisé pour données tabulaires nest pas courant, mais on peut utiliser des embeddings standard qui traitent le texte des chiffres (en le considérant comme tokens, ce qui marche si la requête contient aussi des chiffres). On peut aussi indexer des versions unitaires (par ex. convertit toutes les unités en une seule convention) pour homogénéiser les match mais cest du détail.
- **Formules mathématiques et schémas** : Cest le plus délicat. Pour les formules, idéalement on aimerait un **embedding capable de comprendre du LaTeX ou des expressions math**. Il existe des travaux de recherche sur des embeddings de formules (par ex. TangentCFT pour la recherche de similarité de formules), mais ce nest pas intégré nativement. Une approche pragmatique : convertir les formules en une description textuelle lorsque cest possible. Ex: $f_cm = \alpha \cdot f_{c28}$ pourrait être stocké comme “fcm = alpha * fc28 (relation linéaire entre fcm et fc28)”. Ce texte sera indexé et peut-être retrouvé si la question parle de “relation fcm et fc28”. Pour les schémas, sils contiennent du texte (légendes), RAGFlow devrait en extraire les légendes via OCR. On peut alors avoir un chunk avec “Figure 2: Schéma du cycle gel-dégel” etc. Si la question porte sur “voir schéma cycle gel-dégel”, lassistant pourrait répondre en se basant sur la description disponible. Mais pour **exploiter réellement le contenu visuel** (ex: interpréter un diagramme), il faudrait un **LLM vision**.
### Intégration de LLM _vision_ pour schémas et formules
Les _LLM vision_ sont des modèles capables de traiter des images en entrée (ex : GPT-4 Vision, ou des modèles open-source comme LLaVA, BLIP-2, etc.). Dans notre contexte, ils pourraient être utiles pour deux tâches principales :
1. **OCR et description dimages** : Bien que RAGFlow effectue de lOCR de base, un LLM vision avancé pourrait **décrire un schéma complexe** ou **traduire une formule manuscrite** mieux quun OCR classique. Par exemple, un schéma de principe sans beaucoup de texte un LLM vision pourrait produire une légende du type “Schéma: courbe contrainte-déformation montrant une zone élastique suivie dune rupture brutale”. Cette description textuelle pourrait enrichir la base de connaissances. On pourrait imaginer un _workflow_ où, pour chaque image détectée dans un PDF, on fait appel à un modèle vision pour générer une description textuelle stockée en note annexe ou metadata du chunk. Ainsi, même si la question porte sur “le schéma de la courbe contrainte-déformation”, le système a du texte à se mettre sous la dent pour trouver la réponse.
2. **Interprétation dynamique lors des questions** : Plus complexe, on pourrait intégrer un LLM vision **au moment de la requête** si celle-ci demande directement une analyse dimage. Par ex, si lutilisateur dit “Voici la photo de la fissure, que montre-t-elle ?” (upload dimage en live), un LLM vision pourrait analyser limage de fissure. Cependant, cest un cas à part du RAG textuel. Dans la plupart des cas, lassistant naura à manipuler que du texte, car on aura pre-indexé toute linfo nécessaire via du texte.
Une stratégie réaliste pour notre entreprise béton : **enrichir autant que possible les documents avant indexation** en extrayant le maximum dinformations textuelles des schémas et formules. Par exemple, utiliser un outil comme **Mathpix** (OCR spécialisé math) sur les documents scientifiques pour convertir les formules en LaTeX textuel, que lon insère en petit en dessous de limage dans un PDF avant ingestion par RAGFlow. Ou utiliser un modèle vision style BLIP pour générer des descriptions dimages et attacher ces descriptions dans un fichier annexe à ingérer. Ainsi, on reste dans le flux standard de RAGFlow (basé sur texte) tout en tirant parti de lIA vision pour améliorer le texte disponible.
Si lon souhaite aller plus loin, on pourrait imaginer intégrer un _agent_ qui, quand une question mentionne “voir image X” ou “selon le schéma Y”, va chercher limage correspondante (via les métadonnées du chunk, on sait quelle page du PDF par ex), la passer à un modèle vision externe, puis intégrer la sortie comme contexte supplémentaire avant la réponse du LLM texte. Ce genre d**agent multi-modal** nest pas natif dans RAGFlow, mais on peut le concevoir en parallèle (voir section architecture ci-dessous).
### Faut-il une classe RAG dédiée avec gestion différenciée des KB ?
Dans une implémentation custom, on pourrait coder une classe Python qui gère plusieurs vecteurs stores et route les requêtes en fonction du type. Cependant, avec RAGFlow ce nest pas forcément nécessaire car le produit gère déjà le **multi-KB** de manière native. On peut configurer un assistant RAGFlow pour quil utilise _plusieurs_ bases en même temps (il va alors récupérer dans toutes). Mais on ne peut pas (actuellement) définir des règles conditionnelles par type de question.
Dans notre cas, la segmentation des bases vise surtout la maintenance et la précision. Lutilisateur final pourrait très bien poser des questions couvrant plusieurs domaines dans ce cas, on peut associer toutes les bases à lassistant, et RAGFlow rapatriera des chunks pertinents de chacune. Si on veut vraiment spécialiser les réponses (par exemple garantir que si la question est normative on ne répond que via la base Normes), on pourrait créer **plusieurs assistants spécialisés** : un “Assistant Normes”, un “Assistant Essais”, etc., que lutilisateur choisirait.
Une autre approche est dimplémenter un **agent superviseur** qui route la question : par exemple, un petit modèle de classification de question (ou un LLM qui dans un prompt réfléchi décide “Est-ce une question de norme, de test ou de formule ?”). Sur cette base, il pourrait interroger uniquement la KB concernée via lAPI de RAGFlow. Ce serait le rôle dune application externe venant se greffer. On pourrait effectivement coder une classe `EnterpriseRAGManager` qui contient plusieurs clients RAGFlow (un par KB) et une méthode `answer(question)` qui :
1. classifie la question ou teste des mots-clés,
2. choisit lKB/assistant approprié,
3. fait la requête via lAPI Python de RAGFlow ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=NOTE)),
4. retourne la réponse.
Cest une solution maison pour vraiment cloisonner. Toutefois, ce niveau nest peut-être pas nécessaire si les chunks sont bien taggés et si le LLM est prompté pour prioriser la source adéquate. En outre, RAGFlow en lui-même est un moteur RAG, pas un orchestrateur de multiples RAG — donc créer un “RAG de RAGFlow” est une couche additionnelle un peu complexe.
En pratique, je suggérerais de **commencer sans classe custom** et de voir. Si lors des tests on constate des confusions (ex: lassistant prend un chunk dun rapport dessai alors que la question portait sur une norme parce que des termes se chevauchent), on pourra affiner. Peut-être en réglant la pondération lexical vs sémantique par base. Ou en incluant dans le prompt système du LLM des instructions du type “Si la question semble réglementaire, ne cite que des normes”, etc. Un LLM pourrait éventuellement faire ce tri sil est bien guidé.
### Proposition darchitecture personnalisée intégrant RAGFlow, LLM locaux, agents et vector stores
Pour notre entreprise béton, voici une architecture cible qui maximise **sécurité, performance et extensibilité** :
**1. Ingestion & Indexing Layer (RAGFlow)**:
Toutes les données documentaires (normes, rapports, etc.) sont ingérées via RAGFlow, qui joue le rôle de **backend RAG**. On déploie RAGFlow on-premise (Docker sur un serveur dédié). On configure ElasticSearch (ou Infinity) pour stocker les embeddings, relié à RAGFlow. MinIO stocke les fichiers importés. On choisit un modèle dembedding performant polyvalent (par ex. all-MiniLM ou mpnet) qui sera utilisé par RAGFlow. Cette couche ingestion est utilisée par les experts documentaire pour mettre à jour la base (via lUI ou via lAPI Python de RAGFlow lorsquun nouveau doc est ajouté, on peut automatiser lappel pour parser). On bénéficie des capacités de **DeepDoc** de RAGFlow pour lOCR et la structuration.
**2. Base de Connaissances structurée**:
Les Knowledge Bases sont configurées comme discuté (Normes, Rapports, Formules…). Chacune dans RAGFlow correspond à un index vectoriel séparé dans Elastic. On garde la possibilité den interroger plusieurs à la fois. On sassure que tout le contenu important (y compris images décrites) est bien intégré. Cette base peut être versionnée / sauvegardée (via des snapshots Elastic et backup des fichiers).
**3. Modèles LLM Locaux**:
On déploie un ou plusieurs LLM en local. Par exemple, un LLM principal type **Llama-2 70B** quantizé 4-bit pour réponses complexes en français, hébergé sur une machine GPU via **Ollama** (ou texte-generation-webui). On peut aussi avoir un modèle plus petit pour certaines tâches si besoin (ex: un 13B si on a beaucoup de requêtes simultanées et quon veut gérer plus de charge). RAGFlow permet de brancher Ollama, donc on utilise ce connecteur ([Deploy LLM locally | RAGFlow](https://ragflow.io/docs/dev/deploy_local_llm#:~:text=RAGFlow%20supports%20deploying%20models%20locally,interacting%20with%20your%20local%20models)). Ainsi, RAGFlow enverra les prompts au LLM local au lieu dappeler une API distante. Pour la partie vision, on pourrait héberger séparément un modèle comme **BLIP-2** ou **LLaVA** sur un serveur accessible. Ce modèle ne sera pas appelé par RAGFlow directement, mais via un agent externe si besoin (point suivant).
**4. Agent de coordination (optionnel)**:
On peut développer un petit service Python (hors RAGFlow) qui agit comme **orchestrateur intelligent**. Ce service reçoit la question utilisateur (par exemple via une interface chat custom ou via lAPI de RAGFlow). Il peut alors :
- Si la question contient une image ou formule non-textuelle, appeler le modèle vision pour lanalyser. Par ex, si lutilisateur a uploadé un schéma de fissure, le passer à un modèle vision qui sort “une fissure de 0.3 mm de largeur sur 10 cm de long sur léchantillon en traction”. Cette info peut être ajoutée comme contexte textuel.
- Poser la question augmentée (contenant éventuellement le résultat vision ou autres métadonnées) à RAGFlow via l**API Python** fournie ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=NOTE)). En effet, RAGFlow offre des endpoints API pour lancer des requêtes sur un assistant donné. On utilise lassistant correspondant (spécifique ou global).
- Récupérer la réponse de RAGFlow (qui inclut le texte + sources).
- Eventuellement, post-traiter la réponse si besoin (formatage, etc.), puis la renvoyer à lutilisateur.
Cet agent peut aussi implémenter la logique de routage évoquée plus haut (décider quelle KB interroger). Mais il peut aussi déléguer ça à RAGFlow en posant la question sur toutes les bases, puis éventuellement filtrer les sources dans la réponse finale (par ex, ne garder que les sources normatives si on voulait épurer).
**5. Application front-end**:
Les utilisateurs (ingénieurs, techniciens) accéderont à lassistant via soit lUI de RAGFlow (onglet Chat) en sélectionnant lassistant voulu, soit via une interface dédiée (ex: un chatbot intégré à lintranet de lentreprise). Pour une intégration plus poussée, lAPI de RAGFlow peut être utilisée dans un chatbot custom (par ex., une UI web style chat moderne, qui derrière envoie les requêtes au service orchestrateur ou directement à RAGFlow).
**6. Sécurité & Données sensibles**:
Puisque tout est local, les données critiques restent sur nos serveurs. On peut cloisonner laccès aux bases : RAGFlow gère des espaces de travail, on pourrait imaginer que seules certaines personnes peuvent accéder à “Rapports dessais” car cest très confidentiel, etc. Si besoin, on peut anonymiser ou masquer certaines données sensibles dans les chunks lors de lingestion (par exemple, RAGFlow pourrait permettre un pré-traitement pour flouter des noms de projet sinon on pourrait le faire avant ingestion dans les documents).
**7. Maintenance & Evolution**:
Larchitecture est modulaire. Si demain on veut remplacer le vecteur store Elastic par un autre (par ex. Pinecone géré en interne), on pourrait modifier la couche RAGFlow (RAGFlow est open-source, léquipe a son _roadmap_ où ils prévoient dintégrer dautres backends, etc.). Si on veut intégrer un nouveau type de document (par ex. images de microstructure béton sans texte), on pourrait entraîner un modèle vision spécifique et adapter lagent orchestrateur pour ces cas. RAGFlow lui-même est en évolution constante (ils ajoutent par ex. du **Knowledge graph** extraction ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=%2A%202025,improve%20the%20accuracy%20of%20retrieval)), ce qui pourrait un jour aider à lier les infos entre documents, pratique pour faire du raisonnement plus poussé).
En schéma, larchitecture ressemblerait à ceci :
```
[Utilisateurs] -- (Interface Web/Chatbot) --> [Agent Orchestrateur] --> [RAGFlow API] --> [Vector DB Elastic/Infinity + Knowledge Bases]
| |
|--------> [LLM local via Ollama] <-------|
\--------> [Modèle Vision] (si besoin) ----/
```
- Le **Vector DB** stocke les embeddings de chaque KB; RAGFlow sen sert pour la recherche.
- Le **LLM local** (ou plusieurs) génère les réponses; intégré via Ollama/Xinference, appelé par RAGFlow.
- Le **Modèle Vision** est appelé en parallèle par lagent quand requis (pas par RAGFlow directement).
- L**Agent Orchestrateur** est optionnel mais utile pour loger la logique métier supplémentaire (multi-modal, choix de KB…); il utilise lAPI de RAGFlow pour toutes les opérations RAG classiques.
- Les utilisateurs, eux, ne voient que le résultat final sous forme de chat avec citations.
Cette architecture garantit que lentreprise **maîtrise ses données et ses modèles** (rien ne sort, tout est dockerisé sur site), tout en offrant aux utilisateurs finaux une **expérience interactive fluide** (un chatbot qui répond précisément et cite les documents internes). La modularité permet de brancher différentes briques IA selon les besoins (on pourrait imaginer plus tard intégrer un module d**analyse de requête** qui détecte lintention: calcul, définition, comparatif, et ajuste le prompt du LLM en conséquence, etc.).
En conclusion, pour une entreprise du béton, lalliance de RAGFlow et de LLM locaux offre une solution puissante pour valoriser le capital documentaire technique. En répartissant les connaissances par type, en paramétrant finement le chunking/embedding, et en intégrant au besoin des capacités visuelles, on obtient un assistant virtuel capable de fournir rapidement des réponses fiables aux équipes, tout en respectant les contraintes de confidentialité et de précision propres à ce domaine industriel. Ce genre darchitecture sera un atout pour la **transformation numérique** de lentreprise, en rendant la connaissance accessible de façon naturelle et immédiate, du bureau détudes jusquau chantier. ([How to build RAG-based assistants for industrial applications | Renumics GmbH](https://renumics.com/blog/industrial-ai-canvas-rag#:~:text=This%20can%20be%20manuals%2C%20online,as%20text%20and%2For%20image%20data)) ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=,citations%20to%20support%20grounded%20answers))

View File

@ -0,0 +1,373 @@
---
- Extraire et préparer les schémas depuis les PDF
- Traduire les légendes et contextualiser les images pour LLM vision
- Utiliser les bons LLM aux bonnes étapes (Vision, Traduction, Résumé, Rerank, etc.)
- Intégrer efficacement les chunks enrichis dans Ragflow (structure, métadonnées, lien logique avec les autres chunks)
- Fournir un tutoriel détaillé étape par étape, avec du code Python lorsque pertinent
# Traitement Multimodal de PDFs Réglementaires avec Ragflow
## Contexte et Enjeux
Les documents PDF complexes, mêlant texte réglementaire en français et schémas annotés, posent un défi pour les pipelines RAG (Retrieval-Augmented Generation). Il sagit dextraire fidèlement le contenu textuel **et** visuel afin dalimenter un moteur de recherche sémantique et de permettre à un LLM de répondre aux questions de lutilisateur de manière précise et sourcée. Nous allons explorer toutes les méthodes pour **extraire et contextualiser les schémas** dans de tels PDF, puis détailler le choix des modèles dIA (vision, résumé, traduction, rerank, etc.) à chaque étape, en précisant la langue de travail appropriée (anglais vs français). Nous fournirons ensuite un **tutoriel pas-à-pas** illustré de code Python pour mettre en œuvre ces étapes dans un pipeline RAGFlow. Enfin, nous proposerons des **conseils de structuration** de la base de connaissances Ragflow et de lorchestration des assistants afin de maximiser la qualité des réponses.
## Extraction et Contextualisation des Schémas dans un PDF
Traiter les schémas (diagrammes, figures, graphiques) dun PDF nécessite de combiner plusieurs techniques. Lobjectif est de **capturer linformation visuelle** contenue dans ces schémas et de la lier au texte environnant (ex. légendes, références dans le corps du texte). Voici les stratégies principales :
- **Extraction directe dimages intégrées** : Si le PDF comporte des images matricielles intégrées (formats JPEG/PNG), on peut les extraire via une bibliothèque PDF. Par exemple, avec PyMuPDF on peut parcourir chaque page et extraire les blocs de type _image_ via `page.get_text("dict")` (qui renvoie un dict contenant texte et images) ([Images - PyMuPDF 1.25.4 documentation](https://pymupdf.readthedocs.io/en/latest/recipes-images.html#:~:text=2,images%20shown%20on%20a%20page)). Chaque bloc image fournit le _binary_ de limage (quon peut sauvegarder) et sa position (_bbox_) dans la page ([Images - PyMuPDF 1.25.4 documentation](https://pymupdf.readthedocs.io/en/latest/recipes-images.html#:~:text=,0.0%2C%20228.2460174560547%2C%20100.0)). Cette approche est rapide et conserve la résolution originale de limage.
- **Capture raster des zones graphiques** : Si le schéma nest pas une image distincte (par ex., un dessin vectoriel dans le PDF), on peut **rasteriser la page ou la zone** correspondante. PyMuPDF permet de rendre une page ou un _rectangle_ de page en image via `page.get_pixmap(matrix=..., clip=...)`. On peut dabord identifier la zone du schéma (par ex. via la position de la légende ou par une analyse de la mise en page), puis générer une image de cette zone. Des outils comme pdf2image (basé sur Poppler) peuvent aussi convertir chaque page en image haute résolution à analyser.
- **Détection automatique de la mise en page** : Pour localiser les figures et leurs légendes de manière fiable, on peut utiliser des modèles de _Document Layout Analysis_. Par exemple, Ragflow intègre un module de reconnaissance de layout qui classifie les éléments dune page en catégories (texte courant, titre, **figure**, **légende de figure**, table, etc.) ([ragflow/deepdoc/README.md at main · infiniflow/ragflow · GitHub](https://github.com/infiniflow/ragflow/blob/main/deepdoc/README.md#:~:text=,components%20which%20covers%20most%20cases)) ([ragflow/deepdoc/README.md at main · infiniflow/ragflow · GitHub](https://github.com/infiniflow/ragflow/blob/main/deepdoc/README.md#:~:text=,Equation)). Ce type de modèle (semblable à LayoutParser ou PubLayNet) peut détecter quune zone est une _figure_ et la zone en dessous comme _Figure caption_. En combinant ces informations, on peut automatiquement **découper** chaque schéma et lassocier à sa légende. Ragflow DeepDoc fournit par exemple 10 composants de base dont _Figure_ et _Figure caption_, ce qui permet de savoir qu“une image X est décrite par telle légende Y” ([ragflow/deepdoc/README.md at main · infiniflow/ragflow · GitHub](https://github.com/infiniflow/ragflow/blob/main/deepdoc/README.md#:~:text=Recognition,components%20which%20covers%20most%20cases)).
- **OCR des textes dans limage** : Les schémas « annotés » contiennent souvent du texte (labels, commentaires dans le diagramme). Un OCR est nécessaire pour extraire ces textes **imbriqués dans limage**. On peut utiliser Tesseract (via `pytesseract`) en spécifiant la langue française (`lang='fra'`) pour reconnaître les mots en français sur le schéma. Par exemple : ```python texte_image = pytesseract.image_to_string(Image.open("schema.png"), lang="fra")```
- **Contextualisation manuelle ou semi-automatique** : Dans certains cas complexes, un **découpage manuel** peut être nécessaire. Par exemple, si le PDF est très hétérogène, lintervenant peut ouvrir le PDF, repérer les pages contenant des schémas dimportance, et définir manuellement des zones de capture. Cela peut être fait via un outil ou en coordonnant des *bounding boxes* à passer à la fonction de rasterisation (PyMuPDF ou autre). Cette méthode garantit de capturer exactement ce qui est pertinent, mais elle demande un effort humain. Idéalement, on la combine avec les méthodes automatiques (layout/OCR) pour gagner du temps par exemple, vérifier et ajuster les zones détectées automatiquement.
**Association au texte réglementaire** : Une fois limage du schéma extraite et son texte OCRisé, il faut la **lier au contexte textuel**. Cela se fait en récupérant la légende (souvent présente juste en-dessous ou au-dessus du schéma dans le PDF) et/ou en repérant les renvois dans le texte principal (ex. “voir Figure 5”). En pratique :
- La **légende** (caption) est généralement extraite par le parser PDF comme un bloc de texte à part. Il convient de lisoler. Par exemple, Ragflow indique extraire pour chaque figure *“la figure elle-même avec sa légende et le texte inclus dans la figure”* ([ragflow/deepdoc/README.md at main · infiniflow/ragflow · GitHub](https://github.com/infiniflow/ragflow/blob/main/deepdoc/README.md#:~:text=,and%20text%20in%20the%20figures)). Si loutil ne la pas fait, on peut rechercher dans le texte brut des motifs du type “Figure X : …” ou bien utiliser la détection de layout mentionnée plus haut.
- Le **texte environnant** qui fait référence à la figure peut être utile. Par exemple, un paragraphe qui introduit le schéma (“Le schéma ci-dessous illustre…”). On peut décider dinclure ce paragraphe dans le même *chunk* que la description du schéma, ou au moins de sy référer via des métadonnées (ex : “related_to=Figure 5”).
En résumé, lextraction efficace des schémas combine **outils PDF** (pour isoler images et textes), **OCR** (pour lire le contenu interne des images) et éventuellement **analyse de layout** (pour automatiser lidentification des figures et légendes). Lobjectif final est de produire pour chaque schéma une **description textuelle riche** (contenant la légende originale, les textes OCR, et une explication globale) qui pourra être indexée et utilisée par le LLM.
## Choix des Modèles LLM à Chaque Étape
Un pipeline RAG multimodal sappuie sur divers modèles spécialisés. Voici les types de modèles intervenant et lesquels choisir pour ce cas dusage, en précisant la langue dentrée/sortie optimale pour chacun :
- **Modèle de Vision (LLM Vision)** : Cest le cœur de linterprétation des schémas. Un LLM vision combine un encodeur dimage et un grand modèle de langue pour **décrire limage** ou répondre à des questions sur celle-ci. Exemples appropriés : *LLaVA* (Large Language and Vision Assistant) ou *LLaMA-3 Vision*. LLaVA est un modèle open-source entraîné en instruction-following visuel (Vicuna + encodeur CLIP) apte à fournir des descriptions détaillées dimages ([Analyzing Images with LLaVA - Medium](https://medium.com/@natsunoyuki/analyzing-images-with-llava-f3ac169cbecf#:~:text=Analyzing%20Images%20with%20LLaVA%20,source%20chatbot%20to%20create)) ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=Vision%20models%20%C2%B7%20Ollama%20Blog,support%20higher%20resolution%20images%2C)). Les LLMs vision actuels ont été majoritairement entraînés en anglais, et **ont tendance à répondre en anglais** par défaut. En effet, des études ont montré quavec une image en entrée, même si la question est en français, un modèle LLaVA a de fortes chances de répondre en anglais ([](https://aclanthology.org/2024.findings-emnlp.783.pdf#:~:text=We%20uncover%20a%20surprising%20multilingual,a%20mechanistic%20analysis%20of%20the)) ([](https://aclanthology.org/2024.findings-emnlp.783.pdf#:~:text=to%20the%20query%20to%20a,First%20we)). Pour exploiter au mieux ces modèles, il est donc conseillé de **travailler en anglais pendant létape vision** (décrire limage en anglais) puis de traduire en français le résultat. Nous aborderons ce point de langue plus loin. En termes de choix, *LLaVA 1.5/1.6* en 7B ou 13B de paramètres (disponible via Ollama par ex.) fait partie des meilleurs candidats open-source. La version 1.6 a amélioré la **lecture de texte dans les images** et la compréhension de diagrammes ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=The%20LLaVA%20%28Large%20Language,supporting)), ce qui est précieux pour nos schémas annotés. Dautres alternatives comme *MiniGPT-4*, *BLIP-2* (pour du captioning plus simple) ou *Pix2Struct/Pixtral* (modèles récents de Mistral AI avec 12B+ paramètres) pourraient être considérées, mais LLaVA offre un bon compromis maturité/poids. **Langue dutilisation** : fournir les consignes en anglais (par ex. “Describe this diagram…”) et sattendre à une réponse en anglais (que lon traduira ensuite).
- **Modèle de Résumé (LLM de résumé)** : Un modèle de résumé nest pas toujours indispensable, mais il peut intervenir pour **condenser des textes longs** ou structurer linformation. Dans notre pipeline, on pourrait lutiliser pour : (1) résumer un long passage réglementaire en un chunk plus synthétique (si on craint de dépasser les limites de tokens ou de diluer la pertinence), ou (2) reformuler la description brute générée par lOCR + LLM vision en un texte plus concis. Un LLM de résumé en français serait ici indiqué si lon souhaite une sortie en français directement. Par exemple, on pourrait utiliser *GPT-3.5* ou *GPT-4* via API pour une grande qualité de résumé multilingue, ou opter pour un modèle open-source instruct finetuned, tel que *Mistral 7B* (ou sa déclinaison fine-tunée sur des données FR, ex. *Claire-Mistral-7B* ([OpenLLM-France/Claire-Mistral-7B-0.1 - Hugging Face](https://huggingface.co/OpenLLM-France/Claire-Mistral-7B-0.1#:~:text=Claire,7B%20on%20French%20conversational%20data))). Mistral 7B, bien que plus petit, a été salué pour ses capacités multilingues (notamment en français) et peut être utilisé localement. On pourrait lui demander :  Résume le texte suivant en gardant les points clés… »*. **Langue** : si on résume du texte réglementaire français, rester en français pour ne pas perdre les nuances juridiques dans une traduction inutile. En revanche, si on résume une description dimage générée en anglais par LLaVA, on pourrait en profiter pour directement la traduire/résumer en français via un prompt (de type  Traduits et résume ... »*).
- **Traducteur (LLM ou API de traduction)** : La traduction est un composant crucial pour concilier langlais et le français dans le pipeline. Deux besoins : **FR → EN** (pour fournir au LLM vision un contexte compréhensible le cas échéant) et **EN → FR** (pour réinjecter les résultats dans la base en français). La solution de haute qualité est dutiliser lAPI DeepL, reconnue pour ses traductions précises y compris dans le domaine technique/réglementaire. Par exemple, lendpoint `/translate` de DeepL permet de traduire un texte fourni en spécifiant la langue source et cible ([Translate text | DeepL API Documentation](https://developers.deepl.com/docs/api-reference/translate#:~:text=Example%20request%3A%20text%20translation%20,glossary)) ([Translate text | DeepL API Documentation](https://developers.deepl.com/docs/api-reference/translate#:~:text=,)). Un appel POST avec `text="Schéma de l'architecture logicielle"` et `target_lang="EN"` renverra *“Diagram of the software architecture”*. Inversement, on peut traduire la description anglaise dune figure vers le français (*target_lang="FR"*). DeepL assure une **haute fidélité sémantique**, ce qui est essentiel dans un contexte réglementaire. En alternative open-source, on pourrait utiliser un modèle comme *NLLB (No Language Left Behind)* ou *M2M100* de Facebook pour la traduction automatique, ou même solliciter un LLM généraliste (par ex. *GPT-4*, ou *Mistral 7B* avec un prompt de traduction). Cependant, la consistance terminologique offerte par DeepL Pro est souvent un atout dans ce type de documents. **Langue** : on traduit bien sûr vers la langue requise par létape suivante (vers langlais pour létape vision, vers le français pour enrichir la KB).
- **Reranker (Modèle de re-classement)** : Un reranker sert à **affiner lordre des résultats de recherche** en évaluant la pertinence contextualisée. Dans Ragflow, la recherche initiale se fait via les **vecteurs dembedding** (similarité cosinus), mais on peut activer un modèle de rerank pour re-trier les top résultats selon un critère plus précis ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=match%20at%20L1565%20%2A%20%60,Default%20to%201024)) ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=%2A%20%60,Default%20to%201024)). Typiquement, un reranker est un modèle de type *cross-encoder* qui prend la requête et un chunk en entrée et produit un score de pertinence. Par exemple, on pourrait utiliser un modèle **multilingue** comme `camembert/msmarco` (spécialisé QA FR) ou un modèle anglais multilingue comme `sentence-transformers/paraphrase-multilingual-mpnet-base-v2` en cross-encodage. Si on conserve tout en français, un modèle *french cross-encoder* serait idéal, sinon on pourrait traduire la requête et les chunks en anglais et utiliser un reranker anglais (mais cest lourd). Ragflow propose un champ *rerank_model* dans la config de lassistant ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=%2A%20%60,Default%20to%201024)), on pourrait y brancher un modèle comme **OpenAI re-rank** ou un modèle local. En pratique, on choisira un reranker si lon constate que de nombreux chunks bruités remontent et que le LLM final peine à choisir. Ce modèle na pas besoin dêtre gros; même un MiniLM ou E5-large en cross-encoder peut suffire. **Langue** : à adapter selon le modèle choisi idéalement français natif pour éviter de devoir tout traduire pendant la phase de retrieval.
- **Modèle QA final (Assistant Ragflow)** : Bien que non listé explicitement, il faut rappeler que dans le chat Ragflow, lassistant lui-même est un LLM qui exploite les documents retrouvés. Ce modèle doit **bien maîtriser le français** et le style de réponse attendu (p. ex., rédiger de manière professionnelle et justifier par les sources). On peut configurer lassistant Ragflow pour utiliser un modèle open-source hébergé localement (*via* Ollama ou autre). Par exemple, on pourrait utiliser *Llama-2 13B Chat* (qui a une bonne compréhension du français), ou une variante fine-tunée sur du français juridique. Mistral 7B peut également être utilisé sil a été affiné sur des instructions (des initiatives comme Mistral/INRIA ont probablement amélioré la sortie française ([OpenLLM-France/Claire-Mistral-7B-0.1 - Hugging Face](https://huggingface.co/OpenLLM-France/Claire-Mistral-7B-0.1#:~:text=Claire,7B%20on%20French%20conversational%20data))). Limportant est que ce modèle final saura **intégrer les extraits** (texte réglementaire et descriptions de schémas) pour formuler une réponse pertinente. On veillera à ce que la **sortie soit en français** (on peut le garantir via le prompt système de lassistant). Ragflow permet de configurer ces paramètres dans linterface Chat (description du rôle, ouverture de conversation, etc.) ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=The%20figure%20above%20shows%20the,configure%20the%20assistant%E2%80%99s%20settings%2C%20including)) ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=5,base%20that%20I%20created%20earlier)). Notamment, en activant *“Show Quote”* lassistant pourra inclure les citations des documents dans sa réponse ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=5,base%20that%20I%20created%20earlier)), ce qui est souhaitable ici pour appuyer les réponses par des extraits du PDF (page, figure, etc.). **Langue** : français impératif en sortie, avec potentiellement langlais compris en entrée aussi (si lutilisateur posait une question en anglais ou sur du contenu anglais, ce qui est peu probable ici).
En synthèse, chaque tâche du pipeline utilise le meilleur de lIA spécialisé : Vision en anglais avec LLaVA (exploité via Ollama localement), résumé/traduction éventuellement via des services ou LLM dédiés, et un LLM final aligné sur le français. Cette combinaison garantit performance et cohérence linguistique.
## Langue de Traitement : Anglais vs Français
Il est crucial de **distinguer les contenus à traiter en anglais ou en français** afin dutiliser chaque modèle de façon optimale tout en maintenant une base de connaissance homogène. Résumons comment gérer la langue à chaque étape du flux :
- **Extraction du texte brut du PDF** : Ici, pas de question de langue, on extrait tel quel. Le texte réglementaire est en français et le reste en létat.
- **Traitement des schémas par le LLM Vision** : Comme expliqué, ces modèles sont plus fiables en anglais. Il est donc recommandé de **convertir en amont tout ce qui peut les aider en anglais**. Cela inclut : la légende du schéma (si elle est en français, la traduire en anglais), ainsi que les éventuels textes OCRisés de limage en français. En pratique, on peut construire une *prompt* pour le LLM vision du style : *“Here is an image. Legend: <légende traduite>. Please describe the image in detail.”*. Le LLM vision (LLaVA par ex.) va comprendre la légende car elle est en anglais, et produire une description cohérente en anglais. Cette astuce évite quil “bute” sur des mots français non vus pendant son entraînement (même si LLaVA 1.6 a fait des progrès en lecture de texte multilingue ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=model%20to%20grasp%20more%20details,the%20LLaMA%202%20Community%20License))).
- **Indexation et stockage dans la base Ragflow** : **Français privilégié**. Toutes les données textuelles que lon va indexer pour la recherche sémantique devraient idéalement être en français, puisque les questions utilisateurs le seront. Cela concerne le texte réglementaire lui-même (déjà en français), **enrichi éventuellement des descriptions de schémas que lon ajoutera en français**. Autrement dit, après avoir obtenu la description dun schéma en anglais (via lLLM vision), on la **traduit en français** pour lintégrer au chunk correspondant. De même, si on ajoute des métadonnées ou titres, on peut les laisser en français pour cohérence. Lobjectif est que lespace sémantique de la base soit uniforme : un vecteur de requête en français devra être comparé à des vecteurs de documents en français. (📌 *Remarque*: si pour une raison quelconque on indexait des morceaux en anglais, il faudrait alors soit traduire la requête de lutilisateur en anglais avant recherche, soit utiliser un embedder cross-langue solutions moins simples que de tout garder en français).
- **Enrichissement et métadonnées** : Les opérations denrichissement (ajout de résumés, de mots-clés, de catégories) doivent aussi suivre la logique de langue. Par exemple, si on tagge un chunk avec des mots-clés thématiques, autant les mettre en français pour pouvoir filtrer ou booster avec des termes que lutilisateur pourrait employer. Si on utilise un LLM pour générer un résumé de section, autant quil le fasse en français directement (on peut configurer un LLM open-source en français pour cela, ou GPT-3.5 avec `“Please summarize this French text in French:”`). En revanche, pour la partie *vision*, lenrichissement se fait en anglais puis est converti.
- **Phase de questions/réponses utilisateur** : Lutilisateur pose ses questions en français (étant donné le contexte). Le système de retrieval de Ragflow cherchera donc les chunks pertinents en français. Les réponses générées par lassistant final seront en français. Si par extraordinaire un utilisateur posait une question en anglais, on pourrait détecter la langue et la traduire vers le français pour la recherche (puis traduire la réponse finale en anglais si on voulait répondre dans la langue de la question). Mais dans notre usage, on peut supposer le français uniquement.
En somme, la règle est : **anglais uniquement là où les modèles lexigent** (principalement pour la vision et éventuellement pour le rerank si on utilisait un modèle non francophone), **français partout ailleurs**. Cette séparation garantit dune part des performances optimales (chaque modèle opère dans la langue où il est le plus compétent), et dautre part une cohérence de la connaissance (tous les contenus indexés et fournis à lutilisateur final sont en français).
Notons que cette stratégie est confirmée par lexpérience : par exemple, *Pamela Fox* (Microsoft) a souligné ce biais des modèles multimodaux à répondre en anglais et limportance de le gérer en amont dans un pipeline RA ([](https://aclanthology.org/2024.findings-emnlp.783.pdf#:~:text=We%20uncover%20a%20surprising%20multilingual,a%20mechanistic%20analysis%20of%20the)) ([](https://aclanthology.org/2024.findings-emnlp.783.pdf#:~:text=to%20the%20query%20to%20a,First%20we))】. Il est plus simple de **post-traduire** une bonne description anglaise que de forcer un modèle vision à tout sortir directement en français (ce qui souvent aboutirait à un texte de moindre qualité ou à un mélange de langues).
## Tutoriel Étape par Étape du Pipeline Ragflow
Passons à la pratique : comment mettre en place ce pipeline de traitement de PDF avec schémas, depuis la préparation du document jusquà lingestion dans Ragflow. Nous détaillerons chaque étape avec des exemples de code Python et des outils concrets.
### 1. Préparation du PDF et extraction initiale
**But** : Obtenir le texte et les images brutes du PDF. Pour cela, on utilise des bibliothèques Python de parsing PDF.
- **Installation des outils requis** : Assurez-vous davoir installé `PyMuPDF` (alias `fitz`), `pdfplumber`, `pytesseract` (et le binaire Tesseract + le data fr), ainsi que éventuellement `pdf2image` si vous comptez convertir les pages en images. Par exemple :
```bash
pip install pymupdf pdfplumber pytesseract pdf2image Pillow
sudo apt-get install tesseract-ocr-fra # installation du pack langue française
````
- **Extraction du texte avec PyMuPDF ou pdfplumber** : Vous pouvez opter pour lune ou lautre. PyMuPDF a lavantage doffrir à la fois texte et images. Pdfplumber excelle pour le texte (et tables) mais nextrait pas les images incorporées facilemen ([How to extract image · jsvine pdfplumber · Discussion #496 - GitHub](https://github.com/jsvine/pdfplumber/discussions/496#:~:text=GitHub%20github,with%20the%20pdfminer%20object))】. Nous utiliserons ici PyMuPDF.
Exemple de code pour parcourir les pages et extraire contenu textuel et images :
```python
import fitz # PyMuPDF
doc = fitz.open("mon_document.pdf")
for page in doc:
# Extraire texte
texte = page.get_text("text")
# Extraire images
blocks = page.get_text("dict")["blocks"]
images = [b for b in blocks if b["type"] == 1] # type 1 => imag ([Images - PyMuPDF 1.25.4 documentation](https://pymupdf.readthedocs.io/en/latest/recipes-images.html#:~:text=%3E%3E%3E%20d%20%3D%20page.get_text%28,3%2C%20%27ext%27%3A%20%27jpeg%27%2C%20%27height%27%3A%20501))】
for img in images:
xref = img.get("xref") # identifiant d'objet de l'image
pix = fitz.Pixmap(doc, xref) # extraire l'image
pix.save(f"page{page.number+1}_img{xref}.png")
# stocker aussi la position si besoin:
bbox = img["bbox"]
# ... éventuellement enregistrer texte OCR plus tard
```
Ici, `page.get_text("dict")` fournit un dictionnaire où chaque _block_ a un champ `"type"` (0 pour texte, 1 pour image ([Images - PyMuPDF 1.25.4 documentation](https://pymupdf.readthedocs.io/en/latest/recipes-images.html#:~:text=%3E%3E%3E%20d%20%3D%20page.get_text%28,8%2C%20%27colorspace%27%3A%203%2C%20%27ext%27%3A%20%27jpeg))】. On filtre les images et on les sauvegarde sur le disque avec `Pixmap`. On conserve aussi `bbox` (x,y de coin haut gauche et bas droite) au cas où on souhaite associer limage à une portion de texte par la position. Le texte de la page est récupéré simplement en format brut.
- **Extraction des légendes et repérage des figures** : Dans le texte extrait, on peut chercher des motifs de légende. Souvent, les PDF scientifiques/réglementaires ont des légendes qui commencent par “Figure” ou “Fig.” suivi dun numéro. Par exemple:
```python
import re
legendes = re.findall(r'Figure\s*\d+[^.:]*?:\s*([^\.]+)\.', texte)
```
Cela peut capturer des phrases descriptives. Une autre approche consiste à repérer que la légende est souvent un block de texte court situé juste en dessous dune image. Si on a les `bbox`, on peut imaginer que la légende est le block texte dont y est juste plus grand que ly max de limage. Toutefois, cela devient complexe à coder entièrement. On peut se contenter de lapproche regex manuelle et vérifier les résultats.
- **OCR sur les images** : Pour chaque image extraite, on applique Tesseract afin de lire déventuels textes. On peut utiliser pytesseract ainsi:
```python
from PIL import Image
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract' # chemin vers binaire si nécessaire
for img_path in extracted_images_paths:
text_in_img = pytesseract.image_to_string(Image.open(img_path), lang="fra")
print(f"Texte détecté dans {img_path}: {text_in_img}")
```
Veillez à bien préciser `lang="fra"` (ou `"fra+eng"` si le schéma contient un mélange de français et danglais). LOCR permettra par exemple de récupérer des mots clés du schéma (titres de boîtes, etc.). Ces termes pourront être ajoutés à la description du schéma pour améliorer la recherche (ils agiront comme des _keywords_ très pertinents).
À ce stade, on dispose potentiellement pour chaque page du PDF :
- du **texte principal** en français (`texte`),
- dune ou plusieurs **images de schémas** (fichiers PNG extraits),
- du **texte OCR** de chaque image (`text_in_img`),
- des **légendes** identifiées (`legendes`).
Il faut maintenant associer ces éléments entre eux. Par exemple, si page 5 contient une image et quon a trouvé “Figure 3: Schéma du processus X.” dans le texte, on peut lier limage extraite de la page 5 à cette légende. On peut créer une structure Python pour représenter un _schéma_ avec : son image, son texte OCR, sa légende.
### 2. Traduction des légendes et textes utiles en anglais
Avant dappeler le modèle visuel, on prépare son _input_. Comme discuté, on veut fournir une **description de contexte en anglais**.
Pour chaque schéma identifié, construisons un _prompt_ qui inclura (si disponibles) : la légende traduite et le texte OCR traduit. Par exemple :
```python
import deepl
translator = deepl.Translator("YOUR_DEEPL_API_KEY") # utiliser votre clé API DeepL
for schema in schemas: # supposons une liste d'objets schéma avec properties
legende_fr = schema.legende # ex: "Schéma du processus X..."
ocr_fr = schema.ocr_text # texte détecté dans limage
content_to_translate = legende_fr
if ocr_fr:
content_to_translate += " " + ocr_fr
result = translator.translate_text(content_to_translate, target_lang="EN-US")
schema.context_en = result.text
print(f"Légende FR: {legende_fr}\nLégende+OCR EN: {schema.context_en}")
```
Ici on utilise lAPI DeepL via son SDK Pytho ([Translate text | DeepL API Documentation](https://developers.deepl.com/docs/api-reference/translate#:~:text=curl%20,DE))】. On envoie la légende (et éventuellement le texte OCR concaténé) et on récupère `schema.context_en`, une phrase ou deux en anglais. _Note_: On peut aussi traduire séparément la légende et le texte OCR, et les garder distincts dans le prompt (par ex: _Legend: ..._ / _Labels: ..._).
Si on na pas accès à DeepL, on pourrait utiliser un modèle local de traduction. Par exemple, avec HuggingFace Transformers :
```python
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("Helsinki-NLP/opus-mt-fr-en")
model = AutoModelForSeq2SeqLM.from_pretrained("Helsinki-NLP/opus-mt-fr-en")
inputs = tokenizer(legende_fr, return_tensors="pt")
outputs = model.generate(**inputs)
english = tokenizer.decode(outputs[0], skip_special_tokens=True)
```
Ce modèle _opus-mt_ est basique mais peut faire laffaire pour de courtes légendes.
Quoiquil en soit, on obtient en sortie une chaîne anglaise du style : _“Diagram of the X process illustrating step A, B, C…”_. Cela servira de complément contextuel pour le LLM vision.
### 3. Appel dun LLM Vision pour générer une description du schéma
On peut maintenant interroger un modèle vision et lui fournir : limage du schéma + le contexte en anglais produit à létape 2.
**Choix du déploiement** : Supposons que nous utilisions _Ollama_ pour déployer localement LLaVA 1.5/1.6. Ollama permet de charger des modèles multimodaux (par ex. `ollama pull llava:13b`) et expose une API locale. On a deux moyens dappeler le modèle : via lAPI HTTP ou via le SDK Python dOllama.
- **Via lAPI HTTP** : Faire un POST sur `http://localhost:11434/api/generate` avec un JSON contenant `"model": "llava"` et `"prompt": "Describe this image: <chemin>"`. Daprès la doc, on peut passer le chemin dune image dans le prompt CL ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=To%20use%20a%20vision%20model,files%20using%20file%20paths))】, mais en JSON on envoie plutôt limage encodée en base64 dans un champ `"images" ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=console)) ([ollama/docs/api.md at main · ollama/ollama · GitHub](https://github.com/jmorganca/ollama/blob/main/docs/api.md#:~:text=))】.
- **Via le SDK Python** (plus simple ici) : On utilise la librairie `ollama` pour Python. Par exemple :
```python
import ollama
image_path = "./page5_img17.png"
prompt = f"Here is an image.\n{schema.context_en}\nDescribe this image in detail."
response = ollama.chat(model="llava", messages=[
{"role": "user", "content": prompt, "images": [image_path]}
])
description_en = response['message']['content']
print("Description générée (EN):", description_en)
```
Ce snippet utilise `ollama.chat` en spécifiant le modèle LLaVA et en fournissant la requête utilisateur contenant du texte et limag ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=import%20ollama)) ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=))】. Concrètement, la librairie va lire le fichier image, lencoder en base64 et lenvoyer à lAPI Ollama en arrière-pla ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=console))】. Le modèle retourne une réponse textuelle que lon récupère.
Veillez à ce que _schema.context_en_ (la légende traduite) soit bien incluse pour guider le modèle. On pourrait formater le prompt différemment selon les préférences du modèle (certains modèles attendent un token `<image>` dans le texte, mais daprès la doc Ollama ce nest pas nécessaire car on passe limage dans un param séparé).
**Exemple de résultat** : Le modèle LLaVA pourrait répondre (en anglais) quelque chose comme : _“The diagram shows a three-step process. Step 1 (Initialization) leads to Step 2 (Processing), followed by Step 3 (Verification). Each step is represented by a box with a label... The arrows indicate the flow from one step to the next.”_. Ce texte correspond à la description détaillée du schéma. Lavantage est quil formule linformation visuelle de manière fluide et exhaustive (incluant probablement le contenu OCRisé quil aura détecté aussi de son côté, confirmant nos données).
Si on constate que la réponse est partielle ou confuse, on peut affiner le prompt (par ex. poser une question spécifique: _“What does the diagram illustrate? Describe all labeled components.”_). Avec un bon modèle vision, généralement un prompt générique _“Describe the image”_ suffit.
Répétez cette étape pour chaque schéma identifié. On associera chaque _description_en_ à lobjet _schema_ correspondant.
### 4. Réinjection de la description dans le chunk original (en français)
Nous avons maintenant pour chaque schéma une description en anglais. Il faut la convertir en français et lintégrer au contenu indexé.
- **Traduire la description en français** : On peut réutiliser lAPI DeepL pour cela, ou un LLM. Cest lopération inverse de létape 2. Par exemple :
```python
description_fr = translator.translate_text(description_en, target_lang="FR").text
schema.description_fr = description_fr
```
Après traduction, on obtient par ex. : _“Le schéma montre un processus en trois étapes. Létape 1 (Initialisation) conduit à létape 2 (Traitement), suivie de létape 3 (Vérification)...”_. On vérifie rapidement que les termes techniques sont bien traduits (DeepL est généralement fiable sur ce point).
- **Construire le chunk fusionné** : Lidée est dintégrer cette _description_fr_ au côté du texte original du PDF de manière cohérente. Deux approches possibles :
1. **Insérer la description dans le texte à lemplacement du schéma** Par exemple, remplacer la légende dorigine par une version augmentée : _“Figure 3 : Schéma du processus X (Description générée : Ce schéma montre que… )”_. Cette méthode garde tout dans un même bloc, pratique pour que le LLM final ait tout dun coup.
2. **Créer un chunk séparé dédié à la figure** Par exemple, un chunk qui contient uniquement _“[Figure 3] Schéma du processus X Ce schéma illustre…”_, distinct du chunk de texte principal. On relie ce chunk via métadonnées (même page, même figure number) à la partie texte. Cette méthode permet de cibler spécifiquement la figure lors de la recherche.
La seconde est souvent plus propre, car elle isole bien la description dimage. Ragflow, lors du parsing, segmente souvent par type de contenu (il a des _chunk templates_ spécifiques _“picture”_ pour images, _“table”_ pour tableaux, etc. ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=match%20at%20L308%20,object%20contains%20the%20following%20attributes))】). **Nous pouvons imiter ce fonctionnement** : créer manuellement un chunk de type “picture” pour chaque schéma.
Concrètement, on peut construire un petit JSON ou Markdown pour chaque chunk. Par exemple, supposons quon décide de faire un format JSON avec champs: _id_, _page_, _type_, _content_, _metadata_. Un chunk image pourrait ressembler à :
```json
{
"id": "fig3",
"page": 5,
"type": "figure",
"content": "Figure 3 : Schéma du processus X.\nCe schéma illustre un processus en trois étapes : ... (notre description_fr)...",
"metadata": {
"source": "MonDocument.pdf",
"figure_id": 3,
"titre": "Processus X"
}
}
```
Le _content_ ici comprend la légende originale suivie de la description détaillée en français. On peut la formater avec un saut de ligne ou une phrase distincte introduite par _“Description : …”_ pour bien la démarquer.
Le chunk texte environnant, lui, reste inchangé sauf quon pourrait éventuellement supprimer la légende pour éviter la redondance. Ou le laisser, ce nest pas bien grave davoir la légende en double. Limportant est davoir la description dans au moins un chunk.
- **Ajout des métadonnées adéquates** : Utilisez les métadonnées pour conserver la provenance et faciliter la requête. Les métadonnées utiles pourraient être :
- _page_ (numéro de page du PDF) Ragflow le fait déjà pour les chunks extraits, donc indiquez la page du schéma.
- _figure_id_ ou un identifiant interne utile si on veut plus tard filtrer ou manipuler spécifiquement les figures.
- _source_ (le nom du document, ou son ID) permet à lassistant de formuler la citation.
- éventuellement _type=figure_ dans Ragflow il ny a pas forcément un champ type explicite dans lindex, mais on peut lajouter en mot-clé dans le contenu ou en tag si lAPI le permet. Au minimum, inclure le mot “Figure” dans le content garantit quune requête cherchant “figure” le remontera.
À ce stade, nous avons enrichi le contenu. Par exemple, là où initialement on navait que le texte réglementaire brut, on a maintenant en plus, pour chaque figure, un paragraphe explicatif en français qui sera **indexé**.
### 5. Intégration des chunks dans Ragflow (interface ou API)
La dernière étape consiste à **charger ces données enrichies dans Ragflow** pour quelles soient utilisées lors des questions/réponses. Il y a deux façons principales : via linterface web (Knowledge Base) de Ragflow, ou via les APIs (HTTP/Python).
**Option A Interface graphique** :
1. Démarrez le serveur Ragflow (Docker ou local) et accédez à lUI. Créez une **Knowledge Base** dédiée (par exemple nommée “Docs Réglementaires”). Configurez-la avec un _chunking method_ approprié, par exemple _“Laws”_ si disponible (template optimisé pour documents juridiques ([Configure knowledge base | RAGFlow](https://ragflow.io/docs/dev/configure_knowledge_base#:~:text=Paper%20PDF%20Book%20DOCX%2C%20PDF%2C,XLSX%2C%20CSV%2FTXT))】 ou _“Manual”_ si on veut contrôler nous-même. Pour éviter que Ragflow ne segmente tout automatiquement, vous pouvez choisir _Manual_ pour le PDF en questio ([Configure knowledge base | RAGFlow](https://ragflow.io/docs/dev/configure_knowledge_base#:~:text=Resume%20Enterprise%20edition%20only,JPEG%2C%20JPG%2C%20PNG%2C%20TIF%2C%20GIF))】 cela signifie quil ne coupera pas le fichier en chunks tout seul.
2. **Upload du PDF** via _Add file_. Une fois uploadé, cliquez sur _Parse_ (le bouton _Play_). Comme on est en Manual, il va peut-être créer un chunk par page ou tout mettre en un seul chunk (daprès la doc _Manual PDF_ est un template qui semble garder la structure page par page ([Configure knowledge base | RAGFlow](https://ragflow.io/docs/dev/configure_knowledge_base#:~:text=Resume%20Enterprise%20edition%20only,JPEG%2C%20JPG%2C%20PNG%2C%20TIF%2C%20GIF))】.
3. Allez dans la vue _Chunks_ du document (en cliquant sur le fichier puis _View chunks_ ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=match%20at%20L347%201,to%20view%20the%20chunking%20results))】. Là vous verrez la liste des chunks extraits. Cest ici quon peut **intervenir** (d_Intervene with file parsing_) pour éditer le conten ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=1,to%20view%20the%20chunking%20results))】. Vous pouvez soit modifier un chunk existant, soit en ajouter un nouveau. Par exemple, créez un nouveau chunk pour la figure 3, copiez-collez le contenu _content_ que vous avez préparé (légende + description française). Assurez-vous de remplir les champs de métadonnées (il y a souvent un champ “title” ou similaire où on peut mettre “Figure 3”). Si Ragflow noffre pas de champ spécifique, vous pouvez simplement inclure en début de chunk “Figure 3 : ...” comme on a fait.
4. Enregistrez les modifications. Vous verrez alors vos chunks mis à jour. Si on avait supprimé la légende du chunk principal, on peut coller notre description au bon endroit, etc. **En résumé, via lUI, on utilise la fonction dédition pour injecter nos descriptions de schémas.**
**Option B API/Automatisation** :
Si vous avez de nombreux documents à traiter, il est préférable dautomatiser lingestion. Ragflow propose une API REST (et SDK Python). Quelques points clés :
- Vous pouvez créer une Knowledge Base via lAPI ou trouver son `dataset_id` depuis lUI.
- Ensuite, utilisez lendpoint **Upload documents** (`POST /api/v1/datasets/{dataset_id}/documents`) pour envoyer le fichier PD ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=match%20at%20L610%20The%20ID,A%20document%20to%20upload))】. Cela créera une entrée de document.
- Lancez le parsing via `POST /api/v1/documents/{doc_id}/parse` (vérifiez la doc exacte, il y a possiblement un appel ou un flag).
- Une fois parsé, vous pouvez récupérer la liste des chunks avec `GET /api/v1/documents/{doc_id}/chunks` ou similaire.
- Pour **mettre à jour un chunk**, lAPI propose peut-être un endpoint (les erreurs 1001/1002 font référence à *Invalid Chunk ID / Chunk Update Failed ([Python API | RAGFlow](https://ragflow.io/docs/dev/python_api_reference#:~:text=Code%20Message%20Description%20400%20Bad,Update%20Failed%20Chunk%20update%20failed))】, ce qui suggère quon peut appeler une méthode PUT/PATCH sur un chunk spécifique). Vérifiez la documentation _Python SDK_ : par exemple, `ragflow_sdk.Document.update_chunk(chunk_id, content="new content", metadata={...})`. Si lAPI directe nest pas évidente, une alternative est de **supprimer tous les chunks** de ce document (il y a un appel DELETE dataset maybe) puis de **réinsérer nos propres chunks**. On peut en effet créer un document de type JSON et luploader comme si cétait un texte. Une astuce serait de **convertir notre PDF en un fichier Markdown** contenant toutes les parties enrichies, puis de le faire ingérer par Ragflow comme un document texte normal.
Pour illustrer, imaginons quon veuille tout faire par code avec le SDK Python (après `pip install ragflow-sdk`). On pourrait avoir :
```python
from ragflow_sdk import Client
client = Client(api_key="YOUR_API_KEY")
kb = client.create_knowledge_base("DocsRegl", embedding_model="sentence-transformers/all-MiniLM-L6-v2")
ds = kb.create_dataset("Doc1", chunk_method="manual") # create dataset with manual chunking
doc = ds.upload_file("mon_document.pdf")
doc.parse() # trigger parsing
chunks = doc.get_chunks()
# Find the chunk corresponding to figure 3's original legend, or decide where to insert
doc.add_chunk(content=new_content, metadata={"page":5, "figure":3})
doc.delete_chunk(chunk_id=...) # if needed to remove duplicates
```
(Les noms de méthodes sont imaginés, lidée est quon pilote la KB via le SDK.)
Pour les besoins de documentation, on ne détaillera pas toute lAPI, mais sachez que Ragflow est pensé pour ce genre dintervention programmatique.
**Validation** : Après ingestion, que ce soit via UI ou API, testez dans la section _Retrieval testing_. Tapez quelques mots clés liés au schéma pour voir si la description ressort. Par exemple, si le schéma concerne “processus X”, cherchez _“processus X étapes”_. Vous devriez voir dans les résultats le chunk de la figure avec la descriptio ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=You%20can%20test%20retrieval%20by,to%20the%20%E2%80%9CRetrieval%20testing%E2%80%9D%20section))】. Si ce nest pas le cas, vérifiez que lembedding a bien été mis à jour (peut-être faut-il re-parsing après modifs manuelles, ou cliquer _Save_ dans lUI).
### 6. Exemples Concrets dUtilisation
Maintenant que tout est en place, interrogez lassistant Ragflow en conditions réelles. Par exemple : _“Quelles sont les différentes étapes du processus X illustré dans le document ?”_. Le système devrait :
- retrouver le chunk texte où sont listées les étapes (dans le réglementaire, ou possiblement dans notre description de figure),
- retrouver le chunk figure qui décrit ces étapes visuellement (car notre description FR contient ces mots clés),
- passer le tout au modèle de chat (par ex. Llama-2 ou autre) configuré en assistant.
Lassistant combinera ces sources. Grâce à loption _Show Quote_, il pourra inclure dans sa réponse des extraits du chunk figure ou du texte origina ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=5,base%20that%20I%20created%20earlier))】. On pourrait obtenir une réponse du genre : _“Le document décrit un processus en trois étapes (voir Figure 3). **Étape 1** : Initialisation… **Étape 2** : Traitement… **Étape 3** : Vérification ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=,Michel%20Basquiat))】. Ce schéma illustre le flux allant de létape 1 à 3 par des flèches.”_. On remarque que la réponse inclut potentiellement la référence _Figure 3_ et reprend le contenu de notre chunk enrichi (ici mention des flèches par ex provenant de la description de limage).
Pour sassurer de la qualité :
- **Tester plusieurs questions** sur les schémas, mais aussi des questions purement textuelles, pour vérifier que lajout des schémas na pas perturbé lindexation. Normalement non, chaque chunk a son vecteur.
- Si certaines réponses sont hors-sujet, ajuster le _Similarity Threshold_ ou _Top N_ dans la config de lassistan ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=Similarity%20Threshold%20)) ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=Top%20N%20))】, ou entraîner le reranker. Un bon réglage est un _similarity_threshold_ assez bas (0.2 par défaut) pour ne pas louper de chunk pertinent, et un _top_n_ modéré (5-6) pour ne pas surcharger le context ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=,)) ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=match%20at%20L1715%20or%20reranking,number%20of%20top%20chunks%20with))】.
## Conseils de Structuration de la Base de Connaissances et de lArchitecture
Pour clôturer, voici quelques recommandations globales afin de tirer le maximum de ce pipeline RAGFlow multimodal :
- **Utilisez des chunk templates adaptés** : Ragflow offre plusieurs modèles de chunking (général, Q&A, laws, presentation, picture, etc. ([Configure knowledge base | RAGFlow](https://ragflow.io/docs/dev/configure_knowledge_base#:~:text=Template%20Description%20File%20format%20General,DOCX%2C%20PDF%2C%20TXT%20Manual%20PDF))】. Dans le cas de documents réglementaires, le template _Laws_ peut améliorer la segmentation (il est conçu pour repérer articles, sections, etc. afin déviter de couper en plein milieu dun article de loi). Vous pouvez aussi utiliser _Manual_ pour tout contrôler, mais cela nécessite alors de fournir soi-même la logique dextraction (ce que nous avons fait manuellement). Une approche hybride : laissez Ragflow parser en _Laws_, puis **intervenez** pour insérer les descriptions de figures là où il faut.
- **Granularité des chunks** : Trouvez le bon équilibre de taille. En général, vise ~100-200 tokens par chun ([HTTP API | RAGFlow](https://ragflow.io/docs/dev/http_api_reference#:~:text=match%20at%20L295%20%2A%20%60,false))】. Pour le texte réglementaire, on peut chunker par paragraphes ou sections numérotées. Pour les figures, comme on la fait, un chunk par figure. Évitez de coller un énorme bloc de plusieurs pages moins précis au retrieva ([Breaking up is hard to do: Chunking in RAG applications - Stack Overflow](https://stackoverflow.blog/2024/12/27/breaking-up-is-hard-to-do-chunking-in-rag-applications/#:~:text=The%20size%20of%20the%20chunked,the%20context%20of%20the%20data)) ([Breaking up is hard to do: Chunking in RAG applications - Stack Overflow](https://stackoverflow.blog/2024/12/27/breaking-up-is-hard-to-do-chunking-in-rag-applications/#:~:text=%E2%80%9CThe%20reason%20to%20start%20thinking,%E2%80%9D))】. A contrario, ne coupez pas trop fin (une phrase isolée peut perdre le contexte). Notre approche de lier légende + description image dans un chunk est idéale : cest concis et autonome sémantiquement.
- **Mise en place des métadonnées** : Profitez des métadonnées pour améliorer la recherche et le filtrage. Par exemple, dans Ragflow vous pourriez tagger tous les chunks de figures avec un mot-clé “figure”. Ainsi, si lassistant détecte que lutilisateur pose une question de type “Montrez-moi un schéma…”, vous pourriez (via un mécanisme plus avancé) filtrer pour ne récupérer que les chunks taggés figure. Ragflow ne supporte pas encore les requêtes booléennes complexes en interface, mais on peut imaginer le faire au niveau de lorchestration (ex : un _tool_ qui dabord identifie si la question concerne une image). Pour linstant, un bon usage des métadonnées sert surtout à **la traçabilité** (source, page) afin que lassistant inclue une référence précise dans sa réponse.
- **Assistants multiples ou spécialisés** : Si votre cas dutilisation le justifie, vous pourriez configurer plusieurs assistants dans Ragflow reliés à la même base. Par exemple, un assistant “Explicateur de schémas” et un assistant “Analyste réglementaire”. Le premier pourrait avoir un prompt système orienté pédagogie visuelle (_“Tu es un expert qui explique des schémas techniques simplement”_), le second un prompt plus juridique. Tous deux utiliseraient la même KB, mais formuleraient les réponses différemment. Ragflow facilite la création de multiples assistants avec des personnalités distinctes, tout en pointant vers la ou les mêmes bases de connaissance ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=Creating%20Assistants)) ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=The%20%E2%80%9CPrompt%20Engine%E2%80%9D%20tab%20of,prompts%20and%20configure%20other%20parameters))】.
- **Workflow de traitement automatisé** : Intégrer lextraction de schémas dans votre pipeline dingestion de documents. Si vous avez un grand nombre de PDF, scriptez tout ce quon a décrit (comme dans le tutoriel) pour que chaque nouveau document ajouté passe par : extraction PyMuPDF -> OCR -> LLM vision -> enrichissement -> upload Ragflow. Cela peut être orchestré avec des tâches offline. Ragflow est pensé pour la **mise à jour continue** des connaissances, donc on peut imaginer ré-exécuter le parsing si un document a été enrichi, etc. Utilisez lAPI REST de Ragflow dans vos scripts dingestion pour éviter le travail manuel.
- **Qualité des réponses** : Pour maximiser la qualité, veillez à la **pertinence des données fournies au LLM final**. Nos descriptions de schémas enrichissent la base, mais il faut que lassistant sache les utiliser. Vous pouvez le guider via le prompt système. Par exemple : _“Lorsque des schémas ou figures sont pertinents, intègre leur description dans la réponse.”_. De même, incitez-le à citer la source (_“Cite systématiquement le document et la figure lorsque tu tappuies sur eux.”_). Ainsi, lassistant combinera texte et image de façon transparente dans ses explications.
- **Tests et ajustements** : Enfin, testez le pipeline avec des questions variées, notamment :
- Des questions purement textuelles (pour vérifier que le texte réglementaire seul est bien géré, et que lajout des images na pas introduit de bruit).
- Des questions directement sur un schéma (_“Que montre la figure X ?”_ ou _“Expliquez le schéma du processus X”_).
- Des questions croisées (_“Selon le document, quelle étape suit létape 2 du processus X et quindique le schéma à ce propos ?”_). Ce type de question oblige à utiliser les deux sources (texte et schéma). Idéalement, le LLM va puiser lordre des étapes dans le texte réglementaire, et les détails visuels dans la description du schéma.
En évaluant ces réponses, vous pourrez itérer : par ex., si vous constatez que le LLM ignore la description du schéma, peut-être faut-il ajouter un peu plus de poids (ex. répéter certains termes dans la description pour quelle ressorte plus dans la similarité, ou abaisser _similarity_threshold_). Si au contraire il cite trop limage même quand ce nest pas demandé, assurez-vous que _Show Quote_ noblige pas à tout citer, etc.
En suivant ces étapes et conseils, vous disposerez dune **base de connaissances Ragflow multimodale** bien structurée, où les schémas annotés de vos PDF sont traités efficacement. Cela permettra à lassistant IA de fournir des réponses précises, complètes et appuyées à la fois par le texte réglementaire et par linterprétation des éléments graphiques, offrant ainsi à lutilisateur le meilleur des deux mondes dans ses réponses.
**Sources :** Extraction PDF (PyMuPDF ([Images - PyMuPDF 1.25.4 documentation](https://pymupdf.readthedocs.io/en/latest/recipes-images.html#:~:text=2,images%20shown%20on%20a%20page)) ([Images - PyMuPDF 1.25.4 documentation](https://pymupdf.readthedocs.io/en/latest/recipes-images.html#:~:text=,0.0%2C%20228.2460174560547%2C%20100.0))】, Ragflow DeepDoc (mise en page, figures ([ragflow/deepdoc/README.md at main · infiniflow/ragflow · GitHub](https://github.com/infiniflow/ragflow/blob/main/deepdoc/README.md#:~:text=Recognition,components%20which%20covers%20most%20cases)) ([ragflow/deepdoc/README.md at main · infiniflow/ragflow · GitHub](https://github.com/infiniflow/ragflow/blob/main/deepdoc/README.md#:~:text=,and%20text%20in%20the%20figures))】, Ollama (LLM vision LLaVA ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=To%20use%20a%20vision%20model,files%20using%20file%20paths)) ([Vision models · Ollama Blog](https://ollama.com/blog/vision-models#:~:text=import%20ollama))】, Biais langue LLM visio ([](https://aclanthology.org/2024.findings-emnlp.783.pdf#:~:text=We%20uncover%20a%20surprising%20multilingual,a%20mechanistic%20analysis%20of%20the))】, Config Ragflow & assistant ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=5,base%20that%20I%20created%20earlier)) ([RAGFlow an Open-Source Retrieval-Augmented Generation (RAG) Engine | by Omar Santos | Medium](https://becomingahacker.org/ragflow-an-open-source-retrieval-augmented-generation-rag-engine-6b903005a032#:~:text=The%20%E2%80%9CPrompt%20Engine%E2%80%9D%20tab%20of,prompts%20and%20configure%20other%20parameters))】, API Deep ([Translate text | DeepL API Documentation](https://developers.deepl.com/docs/api-reference/translate#:~:text=curl%20,DE))】.

View File

@ -0,0 +1,217 @@
---
# Recommandations :
#### 1. Documents textuels structurés (normes, manuels) :
- Limitation à 200-300 mots pour les normes
- Sur des textes techniques un modèle LegalBERT au pire embedding général SBERT
#### 2. Tableaux de résultats : Est-ce qu'on chunk par ligne de tableau, par cellule, ou un tabelau entier peut êtr utile pour que le contexte de toutes les valeurs soit présent.
- S'il s'agit de peits tableaux avec peu de lignes, chunker le tableau entier peut être utile
- Pour de grands tableaux mieux vaut chunk par ligne ou groupe de lignes.
- Attention de s'assurer que les en-têtes de colonnes sont bien répétés dans chaque chunk
- Un modèle d'embedding éventuellement spécialisé pour données tabulaires n'est pars courrant
- On peut utiliser des embeddings standard qui traitent le texte des chiffres
- On peut aussi indexer des versions unitaires (convertir toutes les unités en une seule convention) pour homogénéiser les match
#### 3. Formules mathématiques et schémas:
- C'est le plus délicat. pour les formules, idéalement on aimerait un embedding capable de comprendre du LaTeX ou des expressions math.
- Il existe des travaux de recherche sur des embeddings de formules (par ex. TangentCFT pour la recherche de similarité de formules), mais ce n'est pas intégré nativement
- Une approche pragmatique : convertir les formules en une description textuelle lorsque c'est possible (relation linéaire)
- Pour les schémas s'ils contiennent du texte (légendes), RAGFLOW devrait en extraire les légendes via OCR.
- L'assistant pourrait répondre en se basant sur la description disponible. Mais pour exploiter réellement le contenu visuel, il faudrait un LLM vision
## Intégration de LLM vision pour des chémas et formules
Les LLM vision sont des modèles capables de traiter des images en entrée. Dans notre contexte ils pourraient être utiles pour deux tâches principales :
- OCR et description d'images:
- Bien de RAGFLOW effectue de l'OCR de base, un LLM vision avancé pourrait décrire un schéma complexe ou traduire une formule manuscrite mieux qu'un OCR classique. Par exemple, un schéma de principe sans beaucoup de texte - un LLM vision pourrait produire une légende du type "Shéma: courbe contrainte-défromation montrant une zone élastique suivie d'une rupture brutale". Cette description textuelle pourrait enrichir la base de connaissances. On pourrait imaginer un workflow où, pour chaque image détectée dans un PDF, on fait appel à un modèle vision pour générer une description textuelle stockée en note annexe ou metadata du chunk. Ainsi, m^me si la question porte sur le schémas le système a du texte à se mettre sous la dent.
- Interprétation dynamique lors des questions: Plus complexe, on pourrait intégrer un LLM vision au moment de la requête si celle-ci demande directement une analyse d'image.
Une statégie réaliste pour notre entreprise: enrichir autant que possible les documents avant indexation en extrayant le maximum d'informations textuelles des schémas et formules.
- Par exemple utiliser un outil comme Mathpix (OCR spécialisé math) sur les documents scientifiques pour convertir les formules en LaTeX textuel, que l'on insère en petit en dessous de l'image dans un PDF avant ingestion par RAGFLOW.
- Ou utiliser un modèle vision style BLIP pour générer des descriptions d'images et attacher ces descriptions dans un fichier annexe à ingérer. Ainsi, on reste dans le flux standard du RAGFLOW (texte)
Si l'on souhaite aller plus loin, on pourrait intégrer un agent qui, quand une question mentionne "voir image X" ou "selon le schéma Y", va chercher l'image correspondante via métadonnées du chunk) la passe à un modèle vision externe, puis intégrer la sortie comme contexte supplémentaire avant la réponse du LLM texte. Ce genre d'agent multi-modal n'est pas natif dans RAGFLOW, mais on peut le concevoir ne parralèle.
dans notre cas, la segmentation des bases vise surtout la maintenance et la précision. L'utilisateur final pourrait très bien poser des questions couvrant plusieurs domaines-dans ce cas, on peut associer toutes les bases de l'assistant, et RAGFLOW rapatriera des chunks pertinents de chacune.
Si on veut vraiment spécialiser les réponses (par exemple garantir que si la question est normative on ne répond que via la base Normes), on pourrait créer plusieurs assistants spécialisés: un "Assistant Normes", un "Assistant Essais", etc..., que l'utilisateur choisirait.
Une autre approche est d'implémenter un agent superviseur qui route la question :
1. classifie la question ou teste des mots-clés,
2. choisit l'KB/assistant approprié,
3. fait la requête via l'API Python de RAGflow
4. Retourne la réponse
C'est une solution maison pour vraiment cloisonner. Toutefois, ce niveau n'est peut-être pas nécessaire si les chunks sont bien taggés et si le LLM est prompté pour prioriser la source adéquate. En outre RAGFLOW en lui-même est un moteur RAG, pas un orchestrteur de multiples RAG -- donc créer un "RAG de RAGFlow" est une couche additionnelle un peu complexe.
En pratique, je suggérerais de commencer snas classe custom et de voir. Si lors des tests on constate des confusions, on pourra affiner.
- Peut-être en réglant la pondération lexical vs sémantique par base.
- Ou en incluant dans le prompt système du LLM des instructions du type "Si la question semble réglementaire, ne cite que des normes", etc. Un LLM pourrait éventuellment faire ce tri s'il est bien guidé.
## Proposition d'architecure intégrant RAGFLOW, LLM locaux, Agents et Vector Stores
#### 1. Ingestion & indexing Layer (RAGFLOW) :
Toutes les données documentaires (normes, rapports, etc.) sont ingérées via RAGFlow, qui joue le rôle de **backend RAG**. On déploie RAGFlow on-premise (Docker sur un serveur dédié). On configure ElasticSearch (ou Infinity) pour stocker les embeddings, relié à RAGFlow. MinIO stocke les fichiers importés. On choisit un modèle dembedding performant polyvalent (par ex. all-MiniLM ou mpnet) qui sera utilisé par RAGFlow. Cette couche ingestion est utilisée par les experts documentaire pour mettre à jour la base (via lUI ou via lAPI Python de RAGFlow lorsquun nouveau doc est ajouté, on peut automatiser lappel pour parser). On bénéficie des capacités de **DeepDoc** de RAGFlow pour lOCR et la structuration.
#### 2. Base de Connaissances structurée :
Les Knowledge Bases sont configurées comme discuté (Normes, Rapports, Formules…). Chacune dans RAGFlow correspond à un index vectoriel séparé dans Elastic. On garde la possibilité den interroger plusieurs à la fois. On sassure que tout le contenu important (y compris images décrites) est bien intégré. Cette base peut être versionnée / sauvegardée (via des snapshots Elastic et backup des fichiers).
#### 3. Modèles LLM Locaux:
On déploie un ou plusieurs LLM en local. Par exemple, un LLM principal type **Llama-2 70B** quantizé 4-bit pour réponses complexes en français, hébergé sur une machine GPU via **Ollama** (ou texte-generation-webui). On peut aussi avoir un modèle plus petit pour certaines tâches si besoin (ex: un 13B si on a beaucoup de requêtes simultanées et quon veut gérer plus de charge). RAGFlow permet de brancher Ollama, donc on utilise ce connecteur ([Deploy LLM locally | RAGFlow](https://ragflow.io/docs/dev/deploy_local_llm#:~:text=RAGFlow%20supports%20deploying%20models%20locally,interacting%20with%20your%20local%20models)). Ainsi, RAGFlow enverra les prompts au LLM local au lieu dappeler une API distante. Pour la partie vision, on pourrait héberger séparément un modèle comme **BLIP-2** ou **LLaVA** sur un serveur accessible. Ce modèle ne sera pas appelé par RAGFlow directement, mais via un agent externe si besoin (point suivant).
#### 4. Agent de coordination (optionnel) :
On peut développer un petit service Python (hors RAGFlow) qui agit comme **orchestrateur intelligent**. Ce service reçoit la question utilisateur (par exemple via une interface chat custom ou via lAPI de RAGFlow). Il peut alors :
- Si la question contient une image ou formule non-textuelle, appeler le modèle vision pour lanalyser. Par ex, si lutilisateur a uploadé un schéma de fissure, le passer à un modèle vision qui sort “une fissure de 0.3 mm de largeur sur 10 cm de long sur léchantillon en traction”. Cette info peut être ajoutée comme contexte textuel.
- Poser la question augmentée (contenant éventuellement le résultat vision ou autres métadonnées) à RAGFlow via l**API Python** fournie ([Get started | RAGFlow](https://ragflow.io/docs/dev/#:~:text=NOTE)). En effet, RAGFlow offre des endpoints API pour lancer des requêtes sur un assistant donné. On utilise lassistant correspondant (spécifique ou global).
- Récupérer la réponse de RAGFlow (qui inclut le texte + sources).
- Eventuellement, post-traiter la réponse si besoin (formatage, etc.), puis la renvoyer à lutilisateur.
Cet agent peut aussi implémenter la logique de routage évoquée plus haut (décider quelle KB interroger). Mais il peut aussi déléguer ça à RAGFlow en posant la question sur toutes les bases, puis éventuellement filtrer les sources dans la réponse finale (par ex, ne garder que les sources normatives si on voulait épurer).
#### 5. Application front-end :
Les utilisateurs (ingénieurs, techniciens) accéderont à lassistant via soit lUI de RAGFlow (onglet Chat) en sélectionnant lassistant voulu, soit via une interface dédiée (ex: un chatbot intégré à lintranet de lentreprise). Pour une intégration plus poussée, lAPI de RAGFlow peut être utilisée dans un chatbot custom (par ex., une UI web style chat moderne, qui derrière envoie les requêtes au service orchestrateur ou directement à RAGFlow).
#### 6. Sécurité & Données sensibles :
Puisque tout est local, les données critiques restent sur nos serveurs. On peut cloisonner laccès aux bases : RAGFlow gère des espaces de travail, on pourrait imaginer que seules certaines personnes peuvent accéder à “Rapports dessais” car cest très confidentiel, etc. Si besoin, on peut anonymiser ou masquer certaines données sensibles dans les chunks lors de lingestion (par exemple, RAGFlow pourrait permettre un pré-traitement pour flouter des noms de projet sinon on pourrait le faire avant ingestion dans les documents).
#### 7. Maintenance & Evolution:
Larchitecture est modulaire. Si demain on veut remplacer le vecteur store Elastic par un autre (par ex. Pinecone géré en interne), on pourrait modifier la couche RAGFlow (RAGFlow est open-source, léquipe a son _roadmap_ où ils prévoient dintégrer dautres backends, etc.). Si on veut intégrer un nouveau type de document (par ex. images de microstructure béton sans texte), on pourrait entraîner un modèle vision spécifique et adapter lagent orchestrateur pour ces cas. RAGFlow lui-même est en évolution constante (ils ajoutent par ex. du **Knowledge graph** extraction ([GitHub - infiniflow/ragflow: RAGFlow is an open-source RAG (Retrieval-Augmented Generation) engine based on deep document understanding.](https://github.com/infiniflow/ragflow#:~:text=%2A%202025,improve%20the%20accuracy%20of%20retrieval)), ce qui pourrait un jour aider à lier les infos entre documents, pratique pour faire du raisonnement plus poussé).
En schéma, larchitecture ressemblerait à ceci :
```
[Utilisateurs] -- (Interface Web/Chatbot) --> [Agent Orchestrateur] --> [RAGFlow API] --> [Vector DB Elastic/Infinity + Knowledge Bases]
| |
|--------> [LLM local via Ollama] <-------|
\--------> [Modèle Vision] (si besoin) ----/
```
- Le **Vector DB** stocke les embeddings de chaque KB; RAGFlow sen sert pour la recherche.
- Le **LLM local** (ou plusieurs) génère les réponses; intégré via Ollama/Xinference, appelé par RAGFlow.
- Le **Modèle Vision** est appelé en parallèle par lagent quand requis (pas par RAGFlow directement).
- L**Agent Orchestrateur** est optionnel mais utile pour loger la logique métier supplémentaire (multi-modal, choix de KB…); il utilise lAPI de RAGFlow pour toutes les opérations RAG classiques.
- Les utilisateurs, eux, ne voient que le résultat final sous forme de chat avec citations.
---
## ✅ **Plan de configuration de Ragflow avec les bons LLM selon les types de documents**
> 📁 Objectif : Optimiser la qualité des réponses en adaptant le **LLM, l'embedding, le chunking et la logique de récupération** à la **nature de chaque base documentaire** (normes, essais, formules, schémas…).
---
### 🧠 1. **Cartographie des types de documents + traitement cible**
| Type de documents | Caractéristiques | Besoin IA principal | Approche |
| ---------------------------- | ---------------------------------------- | ------------------------------------- | -------------------------------------- |
| **Normes (AFNOR, Eurocode)** | Textes formels, structurés (articles) | Précision lexicale, citations exactes | LLM texte + chunking juridique |
| **Essais (labo)** | Données tabulaires, mesures | Extraction de valeurs, corrélation | LLM texte + chunking tabulaire |
| **Formules / méthodes** | Formules math, descriptions procédurales | Compréhension mathématique | LLM texte + support vision (optionnel) |
| **Schémas / plans** | Images annotées, figures | Description, interprétation | LLM vision + OCR + metadata |
| **Docs logiciels (BRG-LAB)** | Tech + interface logiciel | QA contextuelle | LLM standard + QA |
---
### ⚙️ 2. **Choix des LLM par catégorie**
| Catégorie | LLM principal (texte) | LLM secondaire (vision / rerank) |
| ------------ | ---------------------------------------------- | -------------------------------------------------- |
| **Normes** | `deepseek-r1:70b-llama-distill-q8_0` | `EraX-multilingual-Rerank-3B-V2.0` pour rerank |
| **Essais** | `mistral:latest` ou `llama3.3:70b-instruct` | `bge-reranker-v2-m3` pour précision résultats |
| **Formules** | `cline_qwen_128k_Q8` (fenêtre large pour math) | `llava:34b-v1.6-fp16` pour interprétation visuelle |
| **Schémas** | `llama3.2-vision:90b-instruct-q8_0` | BLIP/CLIP (optionnel) |
| **BRG-LAB** | `mistral:latest` | - |
---
### 🧩 3. **Stratégie de chunking optimisé**
| Type | Chunking Template Ragflow | Ajustements recommandés |
| ---------------- | ------------------------- | ------------------------------------------- |
| Normes | `law`, `manual` | Chunk ≈ 200300 tokens, + numéros articles |
| Rapports dessai | `table` | Chunk par ligne ou bloc + colonnes en clair |
| Formules | `manual`, `paper` | Formules = texte dans chunk ; OCR si image |
| Schémas | `custom` | Ajouter une légende générée par LLM Vision |
| BRG-LAB | `qa`, `manual` | Chunk logique par écran/fonction |
---
### 🧬 4. **Organisation des KB dans Ragflow**
|KB|Documents|Configuration recommandée|
|---|---|---|
|`Normes`|PDF AFNOR/EN|Chunking `law`, reranker ON, LLM `deepseek`|
|`Essais`|Rapports PDF/Excel|Chunking `table`, LLM `mistral`, reranker `bge`|
|`Formules`|Fiches internes|OCR/Mathpix → chunk texte + LLM `cline`|
|`Schémas`|PDF avec images|OCR + tag image + annotation LLM vision `llava`|
|`BRG-LAB`|Doc logiciel|Chunk `manual`, LLM `mistral`|
---
### 🛠️ 5. **Étapes de configuration dans Ragflow**
1. **Créer les 5 KB distinctes** (Normes, Essais, Formules, Schémas, BRG-LAB)
2. **Uploader les documents** correspondants dans chaque KB
3. Pour chaque KB :
- Sélectionner le template de chunking adapté
- Vérifier les chunks → corriger manuellement si besoin
- Ajouter **tags métiers** dans les chunks si possible (ex: `XC4`, `C35/45`, `durabilité`)
- Activer le **reranker** (ex: EraX ou BGE) pour Normes & Essais
- Affecter le **LLM Ollama** via interface (LLM texte ou vision selon KB)
4. **Créer des assistants par KB** (ou un assistant multi-KB avec priorisation)
5. Tester → ajuster chunking / scoring / prompt selon la qualité de la réponse
---
### 🤖 6. **Prompt système par assistant (exemples)**
**Normes** :
```text
Tu es un expert des normes AFNOR. Réponds uniquement si tu trouves une référence précise. Cite toujours l'article ou la page source.
```
**Essais** :
```text
Tu es un assistant laboratoire. Donne les valeurs exactes trouvées dans les rapports. Si plusieurs essais existent, fais un tableau comparatif.
```
**Formules** :
```text
Tu aides à comprendre les méthodes de formulation béton. Si une formule mathématique est présente, explicite-la. Appuie-toi sur les définitions internes.
```
**Schémas** :
```text
Tu décris et expliques les figures techniques. Si une image est citée, donne son interprétation en te basant sur sa légende ou description extraite.
```
---
### 🚀 7. **Évolution future possible**
- Ajouter une couche dorchestration (agent Python qui choisit le LLM selon la question)
- Centraliser la base vectorielle pour mutualiser les KB
- Finetuner un modèle spécifique béton
- Générer une **FAQ dynamique** à partir des questions les plus fréquentes
---

View File

@ -0,0 +1,221 @@
---
## 🎯 **Résumé idée**
Tu proposes de créer une **application Python avec interface graphique (semi-automatisée)** permettant de :
1. **Charger un PDF technique**
2. **Sélectionner manuellement des zones** (ex : un schéma + son texte)
3. **Associer chaque zone à un type** : schéma, formule, tableau…
4. **Traduire le contexte (si besoin)**
5. **Appeler un LLM vision pour linterprétation**
6. **Réinjecter linterprétation (en français) dans une version enrichie**
7. **Exporter un document markdown ou JSON structuré prêt à chunker dans Ragflow**
---
## 🛠️ Est-ce réalisable ?
Oui, 100% réalisable. Voici pourquoi :
| Composant | Solution technique | Exemples |
| ------------------------------ | ------------------------------------------------ | --------------------------------- |
| **Visualisation du PDF** | `fitz` (PyMuPDF) + `tkinter` ou `PyQt6` pour GUI | Affichage page/image |
| **Sélection manuelle de zone** | GUI avec boîte de sélection (canvas) | Similaire à snipping tool |
| **Extraction OCR** | `pytesseract` ou `EasyOCR` | Pour lire ce qui est dans limage |
| **Traduction** | DeepL API ou HuggingFace | Pour convertir FR ↔ EN |
| **LLM Vision** | API Ollama (`llava`, `llama3-vision`) | Pour interprétation |
| **Réinjection** | Générer un chunk markdown/json enrichi | structuré automatiquement |
| **Export** | Fichier `.md`, `.json`, ou `.csv` | prêt à être ingéré dans Ragflow |
---
## 💡 :
> 🧠 Un **préprocesseur intelligent** pour Ragflow qui allie **sélection manuelle + intelligence automatisée**.
En d'autres termes : **un outil dassistance humaine pour lingestion RAG multimodale**, parfaitement adapté aux documents techniques et complexes comme les normes AFNOR.
---
## 🧱 Comment on peut organiser le développement
Je te propose de fonctionner par **modules progressifs**, par exemple :
### 🔹 **Étape 1** Visionneuse PDF avec zone sélectionnable
- Affichage des pages en image
- Permettre une sélection de rectangle avec la souris
- Stocker la zone sélectionnée (coordonnées, page)
### 🔹 **Étape 2** OCR et traduction
- Extraire le texte visible dans la zone
- Traduire si nécessaire avec un bouton
### 🔹 **Étape 3** Appel LLM Vision
- Joindre image (screenshot de la zone)
- Ajouter contexte texte traduit
- Obtenir la description/interprétation
### 🔹 **Étape 4** Composition de chunk enrichi
- Champ titre + légende + contenu enrichi
- Ajout de métadonnées (type, page, source)
- Export en `.md` ou `.json`
---
---
### 📄 Fichier `.md` généré :
Je configure aussi le prompt pour que la **sortie du traitement se fasse au format Markdown** plutôt quen JSON.
---
## ✅ PROMPT POUR CURSOR PRO (copier-coller dans léditeur IA de Cursor)
```markdown
# 🎯 Objectif
Développe un programme Python avec interface graphique (Tkinter ou PyQt6) permettant de charger un fichier PDF, den visualiser les pages une à une, de sélectionner des zones à lécran (par exemple des schémas techniques), dajouter un contexte (automatique ou manuel), et de générer un fichier Markdown enrichi prêt à être utilisé dans une pipeline RAG (Ragflow).
# 🧱 Architecture du programme
## 📁 Structure du projet
```
ragflow_pretraitement/ ├── main.py # Lanceur principal (GUI) ├── ui/ │ └── viewer.py # Affichage PDF + navigation ├── utils/ │ ├── ocr.py # Extraction texte OCR depuis image │ ├── translate.py # Traduction FR ↔ EN │ ├── vision.py # Appel aux modèles multimodaux (llama3.2-vision) │ ├── markdown_export.py # Génère le fichier .md final │ └── pdf_utils.py # Utilitaires de navigation/conversion PDF ├── data/ │ └── outputs/ # Images et markdown générés └── docs/ └── prompts/ # Prompts de vision ou tests
````
## 🧩 Modules à implémenter
### 1. Viewer PDF
- Charger un PDF
- Afficher chaque page (convertie en image via PyMuPDF ou pdf2image)
- Boutons : page suivante / page précédente
- Possibilité de zoom
- Possibilité de sélection dune zone rectangulaire (canvas)
- Affichage des coordonnées
### 2. Ajout de contexte
- Extraire automatiquement le texte environnant (avec OCR ou heuristique)
- Champ de texte modifiable par lutilisateur
- Dropdown ou boutons pour préciser le type de contenu : `schéma`, `formule`, `tableau`, `autre`
### 3. Traitement IA
- Traduire le contexte FR ➝ EN avec Mistral
- Appeler le modèle `llama3.2-vision:90b` ou `llava:34b` via Ollama pour interprétation de la zone
- Revenir à une version finale FR (si nécessaire)
- Tout se fait via requêtes HTTP vers le serveur `http://217.182.105.173:11434`
### 4. Génération Markdown
Le fichier `.md` doit inclure pour chaque zone :
```markdown
## Figure {n} {titre}
**Contexte** : {texte_fr_contextualisé}
**Description (interprétée par LLM)** :
{réponse_traduite_du_LLM}
**Source** : page {num}, type : {type}, image : `fig{n}.png`
````
### 5. Export
- Enregistre limage de la zone sélectionnée (naming auto fig1.png, fig2.png…)
- Génère un fichier `document_traité.md` dans `data/outputs/`
- Inclut toutes les zones traitées, formatées proprement pour Obsidian
---
# 🧠 Ressources recommandées
## Librairies Python :
- `PyMuPDF (fitz)` ou `pdf2image`
- `Pillow`, `Tkinter` ou `PyQt6`
- `pytesseract` pour OCR
- `requests` pour appels à lAPI Ollama
- `markdown`, `os`, `uuid`, `datetime`
## Modèles LLMs à appeler :
- `mistral:latest` pour la traduction
- `llama3.2-vision:90b-instruct-q8_0` pour analyse des schémas
- `nomic-embed-text` et `bge-reranker` pourront être utilisés plus tard dans Ragflow
---
# ✅ Étapes de tests
1. Lancer linterface, naviguer dans un PDF
2. Sélectionner une zone avec un schéma
3. Ajouter ou modifier le contexte
4. Traduire automatiquement
5. Appeler LLM Vision
6. Générer le fichier Markdown
7. Vérifier la compatibilité avec Ragflow (chunk à la main dans un second temps)
---
# 🧪 Bonus
Ajouter plus tard :
- OCR pour formules mathématiques avec Mathpix
- Reconnaissance automatique des zones avec Layout Detection
- Envoi direct du `.md` dans une base Ragflow via API
---
💡 Commence par créer le viewer PDF avec navigation + sélection de zone. Je te dirai ensuite où intégrer lOCR, la traduction, lappel LLM, etc.
```
---
Souhaites-tu que je te génère ce prompt directement dans un fichier `.md` aussi ?
```

View File

@ -0,0 +1,127 @@
# 🧩 Architecture du Programme - Prétraitement PDF pour Ragflow
## 🎯 Objectif
Créer une application Python avec interface graphique pour :
- Visualiser un document PDF page par page
- Sélectionner une ou plusieurs zones visuelles (schémas, tableaux, formules)
- Ajouter un contexte textuel manuellement ou via OCR
- Traduire, interpréter, et reformuler le contenu sélectionné
- Générer un fichier enrichi (.md ou .json) prêt à être ingéré dans Ragflow
---
## 🧱 Structure générale
### 📁 Arborescence recommandée :
```
ragflow_pretraitement/
├── main.py # Point d'entrée GUI
├── ui/ # Interfaces Tkinter ou PyQt
│ └── viewer.py
├── utils/ # Fonctions OCR, traduction, vision
│ ├── ocr.py
│ ├── translate.py
│ ├── vision.py
│ ├── export.py
│ └── ragflow_api.py (optionnel)
├── data/ # Données intermédiaires
│ └── outputs/
└── docs/ # Templates de prompts
```
---
## 🖼️ Module 1 - Visualisation PDF
- Conversion de chaque page en image (`PyMuPDF` ou `pdf2image`)
- Affichage dans une interface `Tkinter` ou `PyQt6`
- Navigation inter-pages (boutons ou flèches)
- Zoom et défilement
---
## 🖍️ Module 2 - Sélection de zones + typage
- Sélection par rectangle (canvas)
- Affichage des coordonnées
- Ajout d'un label au type de zone :
- `schéma`, `formule`, `tableau`, `autre`
- Possibilité de rattacher un **contexte textuel**
- automatique (texte autour)
- manuel (saisie utilisateur)
---
## 🧠 Module 3 - Traitement par IA
### 🧾 Table de correspondance LLM / usage
| Étape | Objectif | Modèle recommandé |
|-------------------------------------|--------------------------------------------------------------------------|-------------------------------------------|
| Traduction FR ↔ EN | Traduire contexte/légende avant ou après vision | `mistral:latest` |
| Interprétation de schéma | Comprendre une figure annotée + légende | `llama3.2-vision:90b-instruct-q8_0` |
| Vision rapide (test) | Moins précis, plus léger | `llava:34b-v1.6-fp16` |
| Embedding | Création de vecteurs pour Ragflow | `nomic-embed-text:137m-v1.5-fp16` |
| Reranking | Classement fin des chunks pertinents | `bge-reranker-v2-m3` |
| Résumé technique | Résumer sections longues, reformuler | `deepseek-r1:70b-llama-distill-q8_0` |
| Structuration en Markdown/JSON | Générer format final pour Ragflow | `mistral`, `cline_qwen_fp16` |
---
## 📤 Module 4 - Génération export .md / .json
Chaque bloc est structuré comme :
### Markdown :
```md
### Figure 3 - Classification des sols
_Context_: Le schéma illustre...
_Description (générée)_: The diagram shows...
_Image_: `fig3.png`
_Metadata_: page=12, type=schéma, source=NF-P11-300
```
### JSON :
```json
{
"type": "schéma",
"page": 12,
"title": "Figure 3 - Classification des sols",
"context": "Le schéma illustre...",
"description": "The diagram shows...",
"image_path": "fig3.png",
"source": "NF-P11-300"
}
```
---
## 🧠 Ergonomie recommandée
- UI claire avec navigation pages
- Couleur différente pour chaque type de zone
- Ajout manuel possible de contexte
- Historique des zones traitées (affichage à droite ?)
- Export par page ou global
---
## 🔄 Extensions futures
- Intégration API Ragflow
- Traitement automatique complet des tableaux (via `pdfplumber`, `ocr_table`)
- Détection automatique de figures + légendes (via Layout Detection)
- Workflow en ligne de commande pour traitement batch
---
## ✅ Prochaines étapes
- [ ] Valider linterface de navigation
- [ ] Intégrer OCR + zone de contexte
- [ ] Préparer modules LLM via Ollama
- [ ] Tester pipeline complet schéma ➝ chunk enrichi ➝ Ragflow

View File

@ -0,0 +1,101 @@
# 📘 Stratégie de configuration optimale Ragflow + Ollama avec LLM Vision
## 🧭 Objectif
Réorganiser les Knowledge Bases (KB) et configurer Ragflow pour tirer parti des modèles LLM disponibles (notamment `llama3.2-vision`) pour un traitement précis de documents techniques (normes, essais, schémas, formules...).
---
## ✅ 1. Réorganisation des KB par typologie hybride
| Nouvelle KB | Contenu attendu | RAGFlow template | LLM assigné |
|------------------------------------|----------------------------------------------------------------|------------------|----------------------------------|
| `Normes_Textuelles` | Normes purement textuelles (AFNOR, EN...) | `law`, `manual` | `deepseek-r1` ou `llama3.3` |
| `Rapports_Essais_Tabulaires` | Tableaux dessais, valeurs, graphiques avec OCR | `table` | `mistral` + reranker `bge` |
| `Formules_Mathématiques` | Notes de calcul, formules encodées, LaTeX | `manual`, `paper`| `llama3.3` ou `cline_qwen_128k` |
| `Schémas_et_Figures_Annotées` | Images + légendes ou croquis structurés | `custom` | ✅ `llama3.2-vision` |
| `Hybrides_Schéma+Formule` (option) | Cas combinés dans le même doc | `manual` | `llama3.2-vision` |
| `Documentation Logicielle (BRG)` | Interfaces, menus, usage logiciel | `qa`, `manual` | `mistral` |
---
## 🔍 2. Prompt système spécifique par KB (à utiliser dans Ragflow)
### 🧠 Schémas / figures techniques
```txt
You are an expert in reading technical diagrams. If the chunk includes an image, extract its description and explain what it shows. Answer in English clearly. If no image is included, rely on the text content only.
```
### 📐 Formules mathématiques
```txt
You are a mathematical assistant. If the document includes equations or LaTeX expressions, explain their purpose. If an image contains a formula, try to describe it in natural language. Answer in English with clarity.
```
### 📚 Normes AFNOR
```txt
Tu es un expert des normes de construction françaises. Réponds uniquement si une référence précise est trouvée. Cite toujours la norme et l'article. Réponds en français.
```
### 🧪 Rapports dessais
```txt
Tu es un assistant laboratoire. Extrais les données chiffrées avec unité. Compare les valeurs si plusieurs essais sont mentionnés. Réponds en français.
```
---
## ✂️ 3. Chunking optimal et enrichissement OCR/Vision
| Type de contenu | Chunk size | Overlap | Spécificités |
|---------------------|----------------|---------|-------------------------------------------------------------------|
| Texte (normes) | 300400 tokens | 3050 | Découpe par titres + métadonnées section |
| Tableaux | 1 ligne/table | 0 | Inclure colonnes + en-têtes |
| Formules | 200300 | 30 | Ajouter LaTeX / OCR si image |
| Schémas | 1 schéma | 0 | Générer description manuelle/LLM vision |
| Mixte | 500 | 50 | Ajouter `metadata:type=schema+math` |
---
## 🔄 4. Pipeline denrichissement (recommandé)
1. OCR automatique (vérifié)
2. Ajout manuel ou automatique dune description dimage
3. Inclusion de formule en clair dans chunk
4. Taggage des chunks avec types (`schema`, `formule`, `table`, etc.)
---
## 🧠 5. LLM à utiliser depuis Ollama
| Modèle Ollama | Utilisation principale | Prompt en anglais ? | Vision activé ? |
|---------------------------|--------------------------------------|----------------------|------------------|
| `llama3.2-vision` | Schémas, figures, formules complexes| ✅ Obligatoire | ✅ Oui |
| `llava:34b-v1.6-fp16` | Vision alternative / fallback | ✅ Obligatoire | ✅ Oui |
| `deepseek-r1:70b` | Texte technique structuré | ❌ | ❌ |
| `mistral:latest` | Texte rapide, généraliste | ❌ | ❌ |
| `cline_qwen_128k_Q8` | Long contexte, formules | ❌ ou mixte | ❌ |
| `EraX reranker` | Re-ranking, précision recherche | ❌ | ❌ |
---
## 🛠️ 6. Exemple configuration dans Ragflow (vision)
- **Model type**: `chat`
- **Model name**: `llama3.2-vision`
- **Base url**: `http://<adresse_ollama>:11434`
- **Max Tokens**: `4096`
- **Vision support**: ✅ activé
- **Prompt**: *(voir plus haut selon KB)*
---
## 🚀 7. Évolutions possibles
- Agent Python pour router selon type de document
- Assistant global interrogeant plusieurs KB
- Enrichissement automatique des chunks via LLM vision
- Traduction automatique si prompt anglais (→ français)
---
**Auteur :** ChatGPT x [Ton Prénom]
**Date :** {{2025-03-26}}

View File

@ -0,0 +1,167 @@
# Prompt complet pour Cursor Pro Programme de prétraitement PDF avec agents LLM modulables
Développe un programme Python avec interface graphique (Tkinter ou PyQt6) permettant de :
1. Charger un document PDF
2. Naviguer entre les pages
3. Sélectionner une ou plusieurs zones rectangulaires (ex : schéma, tableau, formule)
4. Associer un contexte textuel (automatique via OCR ou manuel)
5. Traduire, interpréter ou résumer le contenu sélectionné en utilisant différents agents LLM configurables
6. Exporter le résultat enrichi au format **Markdown (.md)** prêt à être utilisé dans une base Ragflow
---
## Structure du projet recommandée
```
ragflow_pretraitement/
├── main.py
├── ui/
│ ├── viewer.py # Navigation et sélection dans le PDF
│ └── llm_config_panel.py # Choix des agents, paramètres
├── agents/
│ ├── base.py # Classe LLMBaseAgent
│ ├── vision.py # VisionAgent
│ ├── translation.py # TranslationAgent
│ ├── summary.py # SummaryAgent
│ └── rewriter.py # RewriterAgent
├── utils/
│ ├── ocr.py
│ ├── translate.py
│ ├── markdown_export.py
│ └── api_ollama.py
├── config/
│ └── llm_profiles.json # Profils LLM préconfigurés
├── data/
│ └── outputs/ # .md et images générées
└── docs/
└── prompts/
```
---
## Fonctionnalités de linterface
- Navigation page par page dans le PDF
- Zoom/dézoom + recentrage
- Sélection dune zone avec la souris
- Attribution dun **type** : schéma, tableau, formule, autre
- Zone de texte modifiable pour le contexte
- Menu de sélection :
- Modèle par tâche (vision, résumé, traduction…)
- Langue de prompt (FR / EN)
- Paramètres (température, top_p, top_k, num_tokens)
- Bouton : "Appliquer agent"
- Aperçu live de la sortie
- Export Markdown (`document_final.md`)
---
## Agents LLM
### Classe `LLMBaseAgent`
Chaque agent hérite de cette base, et peut :
- Sappeler avec un prompt
- Prendre une image (pour vision)
- Gérer les paramètres dynamiquement
```python
class LLMBaseAgent:
def __init__(self, model_name, endpoint, **config):
...
def generate(self, prompt: str, images: List[bytes] = None) -> str:
...
```
### Rôles recommandés
| Rôle | Classe | Modèle par défaut | Langue |
| ------------- | ------------------ | ------------------- | --------- |
| Vision | `VisionAgent` | llama3.2-vision:90b | 🇬🇧 |
| Traduction | `TranslationAgent` | mistral / qwen2.5 | 🇫🇷↔🇬🇧 |
| Résumé | `SummaryAgent` | deepseek-r1 | 🇫🇷 |
| Reformulation | `RewriterAgent` | mistral / deepseek | 🇫🇷 |
---
## Profils et configuration dynamique
### Fichier `config/llm_profiles.json`
Permet de charger automatiquement un ensemble dagents, de modèles et de paramètres selon les besoins.
```json
{
"avancé": {
"vision": {
"model": "llama3.2-vision:90b-instruct-q8_0",
"language": "en",
"temperature": 0.2,
"top_p": 0.95
},
"translation": {
"model": "mistral",
"language": "fr",
"temperature": 0.1
}
}
}
```
---
## Format Markdown exporté
```md
## Figure 3 Classification des granulats
**Contexte** :
Ce schéma montre...
**Analyse IA (Vision)** :
The diagram shows...
**Paramètres utilisés** :
modèle=llama3.2-vision, temperature=0.2, langue=en
**Source** :
Page 12, Type: Schéma, Fichier: NF P11-300
```
---
## Étapes de test recommandées
1. Charger un PDF
2. Sélectionner une zone
3. Associer un rôle + agent
4. Lancer lanalyse (vision, résumé, etc.)
5. Vérifier la sortie
6. Exporter le fichier Markdown
---
## Modes d'analyse et niveaux de charge LLM
L'utilisateur peut choisir entre **trois niveaux d'analyse** dans l'interface :
| Niveau | Vision | Résumé / Reformulation | Traduction | Usage recommandé |
| --------- | ----------------- | ---------------------- | -------------------- | ------------------------------- |
| 🔹 Léger | `llava:34b` | `mistral` | `mistral` | Débogage, prototypes rapides |
| ⚪ Moyen | `llava` | `deepseek-r1` | `qwen2.5`, `mistral` | Usage normal |
| 🔸 Avancé | `llama3.2-vision` | `deepseek-r1` | `deepseek` | Documents critiques, production |
### Interface
- Menu déroulant "Mode danalyse" :
- Léger / Moyen / Avancé
- Ce mode détermine les **modèles, la langue, et les paramètres par défaut**
- L'utilisateur peut ensuite **modifier manuellement** chaque agent (surcharger les préréglages)
### Exemple de workflow
1. L'utilisateur sélectionne "Avancé"
2. Tous les agents se préconfigurent avec les modèles lourds
3. Pour la traduction uniquement, il choisit manuellement `mistral` car il veut aller plus vite
4. Le fichier `llm_custom.json` conserve ces réglages personnalisés
Ce système permet d'adapter la **charge GPU** et la **vitesse de traitement** au besoin sans perdre en contrôle.

View File

@ -0,0 +1,141 @@
# Version 1
Développe un programme Python avec interface graphique (Tkinter ou PyQt6) permettant de :
1. Charger un document PDF
2. Naviguer entre les pages
3. Sélectionner une ou plusieurs zones rectangulaires (ex : schéma, tableau, formule)
4. Associer un contexte textuel (automatique via OCR ou manuel)
5. Traduire, interpréter ou résumer le contenu sélectionné en utilisant différents agents LLM configurables
6. Exporter le résultat enrichi au format **Markdown (.md)** prêt à être utilisé dans une base Ragflow
---
## Structure du projet recommandée
```
ragflow_pretraitement/
├── main.py
├── ui/
│ ├── viewer.py # Navigation et sélection dans le PDF
│ └── llm_config_panel.py # Choix des agents, paramètres
├── agents/
│ ├── base.py # Classe LLMBaseAgent
│ ├── vision.py # VisionAgent
│ ├── translation.py # TranslationAgent
│ ├── summary.py # SummaryAgent
│ └── rewriter.py # RewriterAgent
├── utils/
│ ├── ocr.py
│ ├── translate.py
│ ├── markdown_export.py
│ └── api_ollama.py
├── config/
│ └── llm_profiles.json # Profils LLM préconfigurés
├── data/
│ └── outputs/ # .md et images générées
└── docs/
└── prompts/
```
---
## Fonctionnalités de linterface
- Navigation page par page dans le PDF
- Zoom/dézoom + recentrage
- Sélection dune zone avec la souris
- Attribution dun **type** : schéma, tableau, formule, autre
- Zone de texte modifiable pour le contexte
- Menu de sélection :
- Modèle par tâche (vision, résumé, traduction…)
- Langue de prompt (FR / EN)
- Paramètres (température, top_p, top_k, num_tokens)
- Bouton : "Appliquer agent"
- Aperçu live de la sortie
- Export Markdown (`document_final.md`)
---
## Agents LLM
### Classe `LLMBaseAgent`
Chaque agent hérite de cette base, et peut :
- Sappeler avec un prompt
- Prendre une image (pour vision)
- Gérer les paramètres dynamiquement
```python
class LLMBaseAgent:
def __init__(self, model_name, endpoint, **config):
...
def generate(self, prompt: str, images: List[bytes] = None) -> str:
...
```
### 🎭 Rôles recommandés
| Rôle | Classe | Modèle par défaut | Langue |
|--------------|--------------------|-------------------------------|--------|
| Vision | `VisionAgent` | llama3.2-vision:90b | 🇬🇧 |
| Traduction | `TranslationAgent` | mistral / qwen2.5 | 🇫🇷↔🇬🇧 |
| Résumé | `SummaryAgent` | deepseek-r1 | 🇫🇷 |
| Reformulation| `RewriterAgent` | mistral / deepseek | 🇫🇷 |
---
## Profils et configuration dynamique
### Fichier `config/llm_profiles.json`
Permet de charger automatiquement un ensemble dagents, de modèles et de paramètres selon les besoins.
```json
{
"avancé": {
"vision": {
"model": "llama3.2-vision:90b-instruct-q8_0",
"language": "en",
"temperature": 0.2,
"top_p": 0.95
},
"translation": {
"model": "mistral",
"language": "fr",
"temperature": 0.1
}
}
}
```
---
## Format Markdown exporté
```md
## Figure 3 Classification des granulats
**Contexte** :
Ce schéma montre...
**Analyse IA (Vision)** :
The diagram shows...
**Paramètres utilisés** :
modèle=llama3.2-vision, temperature=0.2, langue=en
**Source** :
Page 12, Type: Schéma, Fichier: NF P11-300
```
---
## Étapes de test recommandées
1. Charger un PDF
2. Sélectionner une zone
3. Associer un rôle + agent
4. Lancer lanalyse (vision, résumé, etc.)
5. Vérifier la sortie
6. Exporter le fichier Markdown

View File

@ -0,0 +1,84 @@
# 🧠 RAGFLOW - Traitement des Normes Techniques avec Schémas (v1.0)
## 🎯 Objectif
Définir une stratégie de traitement des documents normatifs techniques (comme les normes AFNOR) contenant :
- Du texte technique en **français**
- Des **schémas annotés** et figures
- Des **formules mathématiques** ou physiques
- Des références croisées complexes
Dans le cadre de lindexation dans **Ragflow** avec accès aux LLMs puissants (via Ollama + H100), et en exploitant un modèle multimodal tel que `llama3.2-vision:90b`.
---
## 🧩 Problèmes identifiés
1. **Langue** : les modèles vision fonctionnent mieux avec des prompts en anglais.
2. **Contenu PDF** : difficulté à extraire proprement les images/schémas.
3. **Mise en contexte** : les légendes et commentaires doivent être reliés au texte environnant.
4. **Traduction** : risque de perte dinformation dans le va-et-vient FR ↔ EN.
---
## 🔁 Pipelines suggérés
| Étape | Description | LLM recommandé | Langue |
|------------------------------|-----------------------------------------------------------------------------|------------------------------------|-------------------|
| 1. Extraction du contenu | Extraction OCR + structure (texte, images, sections) | - | - |
| 2. Traduction technique | Traduire le texte + légendes en anglais si nécessaire | `mistral`, `qwen2.5:72b-instruct` | FR → EN |
| 3. Annotation schéma | Screenshot manuel, lien au texte, ajout de légende traduite | - | FR ou EN |
| 4. Interprétation schéma | Analyse via `llama3.2-vision:90b` ou `llava:34b` | `llama3.2-vision`, `llava` | EN (préférable) |
| 5. Reconstitution document | Recombine : [texte original + interprétation + schéma] | - | FR recomposé |
| 6. Chunking avancé | Chunker selon sens/structure : sections normatives, schéma + explication | Ragflow chunker | FR (ou bilingue) |
| 7. Indexation Ragflow | Intégrer chaque chunk + métadonnées (type, schéma, source) | Ragflow (via interface ou API) | - |
---
## 🧪 Exemple de stratégie pour un schéma de norme
1. Faire un **screenshot** de la figure.
2. Traduire le contexte textuel en anglais.
3. Poser un prompt du type :
```
Analyze this civil engineering diagram and explain the classification shown.
Provide key terms, units, and any thresholds.
```
4. Traduire la réponse (si besoin) en français.
5. Associer cette réponse avec le texte original en chunk unique ou adjacent.
---
## 🧱 Chunking dans Ragflow (conseils)
- **Chunk "intelligent"** : un chunk = une unité sémantique cohérente.
- **Ajouter des métadonnées** :
- `type`: "norme", "figure", "formule"
- `langue`: "fr", "en", "mixte"
- `schéma_interprété`: true/false
- **Regrouper dans des bases thématiques** :
- `NORME_PRODUIT`, `ESSAI_LABO`, `FORMULATION_BETON`
---
## 🧠 Conseils LLM
- Traduire les *légendes* avant vision.
- Utiliser `llama3.2-vision:90b` pour interpréter finement.
- Utiliser `mistral` ou `deepseek` pour structurer ou corriger les textes français.
- Préférer l'anglais pour les **prompts visuels** (LLM vision).
---
## ⏭️ Étapes suivantes
- [ ] Isoler un premier schéma significatif
- [ ] Créer son prompt danalyse en anglais
- [ ] Chunker la réponse avec son contexte
- [ ] Indexer manuellement dans Ragflow
- [ ] Tester linterrogation par LLM
---
Ce document sera enrichi au fur et à mesure de tes tests. Nhésite pas à créer des sous-sections pour chaque norme, figure, ou stratégie alternative.

View File

@ -0,0 +1,90 @@
# 📘 Suivi & Optimisation RAGFlow - Documents Normes + Schémas Annotés
## 🧾 Objectif
Documenter et optimiser le traitement des **documents de normes (AFNOR, EN, etc.)** incluant à la fois du **texte réglementaire** et des **schémas annotés**, dans un pipeline RAG avec Ragflow et LLM vision.
---
## 🧠 Problématique 1 : Documents en français + LLM Vision (anglais)
### ❓ Peut-on utiliser des LLM vision sur des documents en français ?
- **Oui**, mais avec limitations :
- Les LLM vision (comme `llama3.2-vision`) sont **pré-entraînés sur des descriptions anglaises**.
- Si le **texte environnant et les légendes des schémas sont en français**, le modèle peut :
- Ne **pas comprendre les légendes**
- Générer une description incomplète ou fausse
- ⚠️ Cela affecte la **capacité de mise en contexte du schéma** avec la partie textuelle.
### ✅ Solutions proposées :
1. **Pré-traduction automatique** :
- Traduire (via LLM ou outil) les **légendes et titres de schéma** avant ingestion.
- Ajout dans les `metadata` du chunk :
- `original_legende: "Écart-type mesuré à 28j"`
- `translated_legend: "Standard deviation measured at 28d"`
2. **Ajout dun chunk de résumé visuel** :
- Utiliser un LLM vision (manuellement ou via agent) pour **générer une description anglaise du schéma**.
- Exemple :
```text
This diagram shows the compressive strength evolution of concrete over 28 days.
```
- Ajouter ce résumé au chunk contenant le schéma.
---
## ⚙️ Problématique 2 : Création dun profil KB efficace dans Ragflow (H100 disponible)
### 🧬 Configuration recommandée
| Élément | Valeur recommandée |
|----------------------------|-----------------------------------------------------------|
| **KB Name** | `Normes_FR_Schemas` |
| **Template de chunking** | `law` ou `manual` |
| **Chunk size** | 300400 tokens |
| **Overlap** | 50 tokens |
| **Vision activée ?** | ✅ OUI pour assistant associé |
| **LLM principal (chat)** | `llama3.2-vision:90b-instruct-q8_0` via Ollama |
| **Re-ranking** | `EraX-multilingual-Rerank-3B-V2.0` pour précision FR |
| **Langue du prompt système** | Anglais (voir section suivante) |
---
## 🧾 Prompt système recommandé pour cette KB (en anglais pour llama-vision)
```text
You are an assistant specialized in French construction standards. If the chunk contains a diagram with annotations, explain it clearly and link it with the surrounding text. Translate the annotations from French if necessary. Focus on article structure and norms logic. Cite the section if relevant.
```
---
## 📦 Métadonnées à inclure dans chaque chunk
- `type`: `norme` / `schéma` / `texte` / `mixte`
- `original_legende` : texte brut en français
- `translated_legend` : (optionnel) version traduite si disponible
- `image_context` : texte descriptif ou résumé visuel du schéma
- `article_ref` : référence au chapitre ou article
---
## 🧪 Étapes futures à documenter ici
- [ ] Test de parsing sur 5 normes avec schémas
- [ ] Évaluation des descriptions générées avec et sans pré-traduction
- [ ] Qualité des réponses de `llama3.2-vision` sur différents prompts
- [ ] Implémentation dun pipeline semi-automatisé dannotation
- [ ] Comparaison avec un LLM texte seul (`deepseek-r1`, `mistral`)
---
## ✍️ Observations / Journal (à compléter)
| Date | Étape / test | Résultat / problème | Commentaire |
|------------|----------------------------------------|----------------------|-------------|
| | | | |
---
**Fichier mis à jour le :** {{2025-03-26}}
**Auteur :** ChatGPT x [Ton Nom / Équipe]