RAG UE-2
Techniques culturales & agroécologie (120h)
🎯 But du RAG
Répondre, expliquer pas à pas, et citer les sources internes (UE2) pour :
- préparation des sols, rotations/associations, mise en place de micro-parcelles,
- suivi de croissance, diagnostic maladies ravageurs, interventions agroécologiques,
- check-lists terrain (semis, repiquage, compost, paillage, micro-irrigation).
1-Architecture à terme ODOO pour les contenus > Mais à court terme du texte vers OpenAI pour le RAG
Un bot WhatsApp “agro” sans Odoo, dans un premier temps
un bot WhatsApp “agro” sans Odoo, qui fait uniquement de la recherche dans vos textes + réponse via API OpenAI.
🧱 Architecture (Odoo-first)
Flux logique :
Odoo (Documents/Knowledge/eLearning) → Ingestion worker → Stockage S3-like (vidéos, images) → Postgres + pgvector (texte + images) + BM25 → Service RAG (API) → WhatsApp/WebApp/Portail étudiant.
Deux modes d’intégration :
- Odoo Online (SaaS) : récupération via API/attachments ; vecteurs dans une base Postgres dédiée (gérée par vous).
- Odoo.sh / On-prem : possibilité d’installer pgvector dans la même base que vos modules (plus simple pour requêtes hybrides).
📦 Inventaire & Taxonomie des connaissances
| Domaine | Sous-domaines | Types de docs | Format | Priorité | |---------------------|-----------------------------------------------|--------------------------------------|--------------------|----------| | Sols tropicaux | texture, MO, pH, travail réduit | Fiches UE, schémas, SOP compost | PDF/MD/PNG | Haute | | Rotations/asso. | maïs-niébé, manioc-arachide, maraîchage | Tableaux rotation, cartes de culture | MD/CSV/PNG | Haute | | Micro-parcelles | design, densités, semis/repiquage | Check-lists, gabarits de plan | MD/ODS/PNG | Haute | | Irrigation/paillage | micro-irrigation, paillage, collecte eau | Procédures, photos terrain | MD/JPG | Moyenne | | Santé des plantes | symptômes, seuils, biocontrôle | Fiches ravageurs/maladies, images | MD/JPG/PNG | Haute | | Sécurité & hygiène | EPI, manipulation outils | SOP + pictos | PDF/PNG | Moyenne | | Vidéos UE2 | 50h tutos pas-à-pas | Transcriptions + timecodes | MP4 + VTT | Haute |
🧪 Ingestion & Normalisation
Étapes :
- Extraction
- PDF/Doc → texte, en gardant titres/h1-h3, listes, tableaux (CSV).
- Vidéos → transcriptions VTT + timecodes (segment ≤ 90 s).
- Images (maladies) → légendes + tags (culture, organe, symptôme).
- Nettoyage
- Dé-bruitage, normalisation unités (cm, kg/ha), conversion tableaux → CSV, correction OCR.
- Découpage (chunking)
- Texte : 500–1 000 tokens, overlap 100–150, découpe structuro-sémantique (pas en plein tableau).
- Transcriptions vidéo : par scène/timecode (60–120 s).
- Images : 1 vecteur/image + champs labels (culture, stade, symptôme).
-
Métadonnées (obligatoires)
source_id, titre, type_doc, domaine, sous_domaine, culture, pays/écozone, auteur, version, date, langue, niveau(L1/L2), page/timecode, droits_licence, url_odoo, hash
🧠 Modèles & Index
Texte (multilingue FR/MG)
- Embeddings : modèle multilingue récent (ex. text-embedding-3-large ou équivalent)
- Index : pgvector (cosine) + BM25 (pg_trgm) → hybride (score = 0,65vector + 0,35BM25).
Images (diagnostic visuel)
- Embeddings image : CLIP/SigLIP (ViT-L/14) ; stockage en vector_img.
- Lien image↔texte via source_id + labels.
- Option : petit classifieur supervisé (symptômes) entraîné sur votre set annoté pour rerank.
SQL (DDL — Postgres)
CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE rag_chunks ( id bigserial PRIMARY KEY, source_id text, titre text, type_doc text, domaine text, sous_domaine text, culture text, langue text, niveau text, page int, timecode_start int, timecode_end int, body text, body_plain tsvector, embed vector(1536), meta jsonb, created_at timestamptz default now() ); CREATE INDEX ON rag_chunks USING ivfflat (embed vector_cosine_ops) WITH (lists = 100); CREATE INDEX ON rag_chunks USING GIN (body_plain);
🔎 Requêtes & Rerank
Pipeline de recherche :
-
Requête hybride :
- Vecteur(q) → K=30 (cosine)
- BM25(q) → K=30
- Fusion (RRF/weighted) → top 40
- Rerank cross-encoder (texte-texte ; image-texte si photo jointe) → top 8
- Filtrage : langue, niveau, domaine si précisé
- Génération avec citations (titre + page/timecode + ancre).
Exemple SQL KNN (simplifié)
SELECT *, (1 - (embed <=> $qvec)) AS score_vec FROM rag_chunks ORDER BY embed <=> $qvec LIMIT 30;
💬 Templates de prompts (FR/MG)
System (FR)
Vous êtes le tuteur agro-écologie de l’UE2. Répondez de façon opérationnelle (étapes numérotées, doses, outils, sécurité).
Citez les 2–4 passages les plus pertinents avec [Titre, page/timecode]. Si l’info manque, dites-le et proposez une vérification terrain.
System (MG – Malagasy)
Ianao dia mpampianatra fanabeazana amin’ny agroekolojia ho an’ny UE2. Valio amin’ny dingana mazava (dingana 1, 2, 3…), fatran’ny zezika, fitaovana, fiarovana.
Asongadino ny loharano amin’ny [Lohateny, pejy/timecode].
User → exemples
- FR : « Donnez-moi une rotation 6 mois pour tomate de saison humide avec niébé et paillage, sur sol sablo-limoneux. »
- MG : « Omeo drafitra fanodinana voly ho an’ny voatabia amin’ny vanim-potoanan-orana miaraka amin’ny voanemba sy mulch, amin’ny tany fasika-vasoka. »
Output attendu
- Étapes (1…n) + doses (kg/ha, L/ha), densités, calendrier
- Check-list outils/EPI
- Variantes si sol/écozone
- Citations [Fiche Rotations UE2, p.3], [Tuto vidéo Semis, 00:01:12–00:02:05]
🖼️ RAG multimodal (images terrain)
Cas d’usage : l’étudiant envoie une photo de feuille de tomate.
- Embedding image → top-K images similaires (symptôme proche).
- Rerank par culture + organe + symptôme.
- Génération : diagnostic probabiliste + actions faibles risques (retrait feuilles atteintes, décoction végétale, contrôle arrosage/ventilation) + seuils d’intervention.
- Toujours inclure incertitude + vérifications terrain (loupe, autre angle).
Schéma de métadonnées image
{culture, organe, symptôme, stade, conditions_météo, prise_de_vue(date, angle, distance), auteur}
🔐 Qualité, sécurité, gouvernance
- Véracité : réponses uniquement à partir des sources internes taguées Validé-UE2.
- Citations obligatoires (min 2).
- Rédaction L1 (pas de jargon non expliqué).
- Mises à jour : versionning (semver) + journal de changements.
- Droits : stocker licence/droit d’auteur par doc ; pas de redistribution externe sans accord.
📏 Évaluation & Monitoring
| Axe | Métrique | Cible | |----------------|-----------------------------------|-------| | Recherche | Recall@20 (gold Q/A) | ≥ 0,9 | | Pertinence | NDCG@10 | ≥ 0,8 | | Génération | Note tuteurs (1–5) | ≥ 4,3 | | Traçabilité | % réponses avec ≥2 citations | 100% | | Sécurité | Hallucinations majeures / 1000 | 0 | | Latence | P95 (WhatsApp) | < 4s |
Golden set (extraits, FR/MG)
- Densité de semis niébé en association maïs (pluvio 800–1 000 mm).
- Protocole compost chaud tropical (C:N, retournements, test poignée).
- Séquence tomate → légumineuse → brassicacée (pression nématodes).
- Paillage : épaisseur & renouvellement en saison humide.
- Réglages micro-irrigation goutte-à-goutte pour tomate de plein champ.
-
Checklist EPI pour traitement biocontrôle.
(… jusqu’à 30 questions, avec réponses de référence + sources.)
🔧 Déploiement rapide (J-10)
J1–J2 : création schéma Postgres + buckets S3 + gabarits métadonnées
J3–J5 : ingestion v1 (fiches UE2, 10h de vidéos, 200 images)
J6 : recherche hybride + rerank, citations
J7 : prompts FR/MG, formats WhatsApp + Web
J8 : golden set + dashboard (Prometheus/Grafana)
J9 : tests étudiants (20) + corrections
J10 : gel v1.0 + guide d’usage
🧰 Exemples concrets (copiables)
1) Upsert d’un chunk (pseudo-Python)
# texte -> embedding -> upsert emb = embed_text(body) # 1536-d sql = """ INSERT INTO rag_chunks (source_id,titre,type_doc,domaine,sous_domaine,culture,langue,niveau,page,body,body_plain,embed,meta) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, to_tsvector('simple', %s), %s, %s) ON CONFLICT (source_id,page) DO UPDATE SET body = EXCLUDED.body, embed = EXCLUDED.embed, meta = EXCLUDED.meta; """
2) Fusion hybride (pseudo-code)
hits_vec = knn_vector(q_vec, k=30) hits_bm25 = bm25(q_text, k=30) hits = reciprocal_rank_fusion(hits_vec, hits_bm25) hits = cross_encoder_rerank(q_text, hits, top_k=8)
3) Gabarit réponse (FR)
# Titre ## Résumé opérationnel (3–5 lignes) 1) Étape… 2) Étape… Doses & densités… Check-list outils/EPI… ⚠️ Précautions… Sources : [Titre doc, p.X], [Tuto vidéo, 00:01:12–00:02:05]
4) Gabarit réponse (MG)
# Lohateny ## Famintinana fohy Dingana 1… Dingana 2… Fatran’ny zezika… Fitaovana/EPI… ⚠️ Fiarovana… Loharano : [Anaran’ny antontan-taratasy, p.X], [Tuto vidéo, 00:..]
🏷️ Convention de tags (pour filtrage fin)
niveau:L1 | langue:FR/MG | domaine:sols/rotations/micro-parcelles/santé | culture:tomate,niébé,manioc,… | organe:feuille,fruit,racine | symptôme:tache_olive,chlorose,… | saison:humide/sèche | écozone:côte/hauts-plateaux
✅ Livrables inclus dans cette réponse
- Architecture cible (Odoo-first), taxonomie, schéma de métadonnées.
- Règles d’ingestion/chunking, index hybrides, prompts FR/MG.
- Pipeline de recherche+rerank, gabarits d’output avec citations.
- Plan qualité/évaluation, planning J-10, snippets techniques.
Si vous le souhaitez, je peux vous générer un jeu “golden set” de 30 Q/A adapté à vos cultures prioritaires (Diego/Ankarana) et un CSV modèle d’inventaire de documents (colonnes prêtes à l’import).