From a7cf918fa8b8e95e963a890cf5decbd6ed61a1af Mon Sep 17 00:00:00 2001 From: Manus Date: Fri, 26 Jun 2026 09:50:58 -0400 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Filtre=20de=20pertinence=20strict?= =?UTF-8?q?=20avant=20insertion=20en=20base=20:=20seuls=20les=20articles?= =?UTF-8?q?=20jug=C3=A9s=20pertinents=20(iaRelevant=3Dtrue)=20sont=20ins?= =?UTF-8?q?=C3=A9r=C3=A9s=20dans=20veille=5Fitems=20et=20aap=5Fitems.=20Le?= =?UTF-8?q?s=20articles=20rejet=C3=A9s=20sont=20logg=C3=A9s=20et=20compt?= =?UTF-8?q?=C3=A9s=20dans=20skippedItems.=20Prompt=20IA=20mis=20=C3=A0=20j?= =?UTF-8?q?our=20avec=20la=20formulation=20exacte=20de=20l'utilisateur=20(?= =?UTF-8?q?expert=20ESMS,=205=20secteurs,=20liste=20noire=20explicite,=20p?= =?UTF-8?q?rincipe=20"doute=20=3D=20false").=2021=20tests=20pass=C3=A9s,?= =?UTF-8?q?=200=20erreur=20TypeScript.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/public/__manus__/version.json | 4 ++-- server/aiClassifier.ts | 12 ++++-------- server/rssEngine.ts | 24 +++++++++++++++++------- todo.md | 8 ++++++++ 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/client/public/__manus__/version.json b/client/public/__manus__/version.json index c077a38..31a49ea 100644 --- a/client/public/__manus__/version.json +++ b/client/public/__manus__/version.json @@ -1,4 +1,4 @@ { - "version": "3370e892", - "timestamp": 1782122832433 + "version": "f01773b1", + "timestamp": 1782481858153 } \ No newline at end of file diff --git a/server/aiClassifier.ts b/server/aiClassifier.ts index 712c5d6..1b2f628 100644 --- a/server/aiClassifier.ts +++ b/server/aiClassifier.ts @@ -32,10 +32,8 @@ export interface AiClassificationResult { // ─── Prompt unique : pertinence + type de veille ───────────────────────────── -const PROMPT_CLASSIFICATION = `Tu es un expert du secteur social, médico-social et sanitaire en France, spécialisé dans les associations gestionnaires d'établissements et services. - -Analyse attentivement le texte fourni. -Détermine si le contenu est pertinent au regard du périmètre d'intervention de l'association, s'il a un impact professionnel direct ou indirect sur les activités, les services, la gestion, la réglementation, le financement, les professionnels, les usagers ou l'environnement stratégique de l'association. +const PROMPT_CLASSIFICATION = `Tu es un expert des établissements et services sociaux et médico-sociaux (ESMS) en France. +Analyse attentivement le texte fourni. Détermine si le contenu est pertinent au regard du périmètre d'intervention de l'association, s'il a un impact professionnel direct ou indirect sur les activités, les services, la gestion, la réglementation, le financement, les professionnels, les usagers ou l'environnement stratégique de l'association. Un article est pertinent UNIQUEMENT s'il traite explicitement d'un sujet en lien avec l'un des 5 secteurs d'activité de l'association : 1. Handicap (enfant et adulte) : services, dispositifs politiques et financement liés au handicap ; ESAT, IME, ITEP, SESSAD, MAS, FAM, SAVS, SAMSAH, MDPH, RQTH, inclusion scolaire, emploi des personnes handicapées @@ -54,11 +52,9 @@ Un article est NON PERTINENT s'il porte principalement sur l'un des sujets suiva - Défense nationale, sécurité intérieure, police, justice (sauf protection de l'enfance) - Sport, culture, tourisme (sauf si lien direct avec des usagers ESMS) - Enseignement supérieur, recherche (sauf si lien direct avec le secteur médico-social) -- Nominations administratives sans lien avec les 5 secteurs ci-dessus -- Il mentionne des personnes vulnérables de façon anecdotique sans lien direct avec les 5 secteurs ci-dessus -- Le lien avec les secteurs d'activité de l'association est vague, indirect ou nécessite plusieurs degrés de déduction +- Nominations administratives sans lien avec les secteurs ci-dessus -Sois STRICT : en cas de doute, réponds pertinent: false. +En cas de doute, réponds pertinent: false — il vaut mieux rejeter un article ambigu que d'en laisser passer un hors périmètre. Si l'article est pertinent, classe-le dans l'un des types de veille suivants : - "reglementaire" : textes de loi, décrets, circulaires, obligations légales, réformes institutionnelles, instructions ministérielles diff --git a/server/rssEngine.ts b/server/rssEngine.ts index 3c9857c..9d4bf21 100644 --- a/server/rssEngine.ts +++ b/server/rssEngine.ts @@ -376,10 +376,15 @@ async function processFeed(feed: RssFeed): Promise { const typeVeille = (aiResult.typeVeille ?? feed.defaultTypeVeille ?? "informationnelle") as "reglementaire" | "concurrentielle" | "technologique" | "informationnelle"; + // ── Filtre de pertinence : ne pas insérer les articles non pertinents ────── + if (!aiResult.relevant) { + console.log(`[RSS] Article rejeté (non pertinent) : "${title.substring(0, 80)}" — ${aiResult.reason}`); + result.skippedItems++; + continue; + } + // Générer le résumé IA uniquement pour les articles pertinents - const iaResume = aiResult.relevant - ? await generateSummary(title, description) - : null; + const iaResume = await generateSummary(title, description); try { // Essayer d'insérer @@ -444,10 +449,15 @@ async function processFeed(feed: RssFeed): Promise { const categorie = (feed.defaultCategorieAap ?? "Autre") as "Handicap" | "PA" | "Enfance" | "Précarité" | "Sanitaire" | "Autre"; - // Générer le résumé IA uniquement pour les articles pertinents - const iaResume = aiResult.relevant - ? await generateSummary(title, description) - : null; + // ── Filtre de pertinence : ne pas insérer les AAP non pertinents ───────── + if (!aiResult.relevant) { + console.log(`[RSS] AAP rejeté (non pertinent) : "${title.substring(0, 80)}" — ${aiResult.reason}`); + result.skippedItems++; + continue; + } + + // Générer le résumé IA pour les AAP pertinents + const iaResume = await generateSummary(title, description); try { await db.insert(aapItems).values({ diff --git a/todo.md b/todo.md index 43c1071..2819954 100644 --- a/todo.md +++ b/todo.md @@ -162,3 +162,11 @@ - [x] Mettre à jour la signature de classifyArticle pour accepter un paramètre optionnel contenuPage - [x] 0 erreur TypeScript, tests passés - [x] Checkpoint + +## Filtre de pertinence strict à l'insertion + mise à jour prompt IA +- [x] aiClassifier.ts : mettre à jour le prompt avec la formulation exacte fournie (expert ESMS, 5 secteurs, liste noire, "doute = false") +- [x] rssEngine.ts : ajouter filtre `if (!aiResult.relevant) { skip; continue; }` avant insertion veille_items +- [x] rssEngine.ts : même filtre avant insertion aap_items +- [x] 21 tests passés, 0 erreur TypeScript +- [ ] Déployer en recette +- [ ] Déployer en production