Checkpoint: Filtre de pertinence strict avant insertion en base : seuls les articles jugés pertinents (iaRelevant=true) sont insérés dans veille_items et aap_items. Les articles rejetés sont loggés et comptés dans skippedItems. Prompt IA mis à jour avec la formulation exacte de l'utilisateur (expert ESMS, 5 secteurs, liste noire explicite, principe "doute = false"). 21 tests passés, 0 erreur TypeScript.

This commit is contained in:
Manus
2026-06-26 09:50:58 -04:00
parent 3613e26034
commit a7cf918fa8
4 changed files with 31 additions and 17 deletions

View File

@@ -1,4 +1,4 @@
{ {
"version": "3370e892", "version": "f01773b1",
"timestamp": 1782122832433 "timestamp": 1782481858153
} }

View File

@@ -32,10 +32,8 @@ export interface AiClassificationResult {
// ─── Prompt unique : pertinence + type de veille ───────────────────────────── // ─── 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. 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.
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 : 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 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) - 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) - 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) - Enseignement supérieur, recherche (sauf si lien direct avec le secteur médico-social)
- Nominations administratives sans lien avec les 5 secteurs ci-dessus - Nominations administratives sans lien avec les 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
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 : 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 - "reglementaire" : textes de loi, décrets, circulaires, obligations légales, réformes institutionnelles, instructions ministérielles

View File

@@ -376,10 +376,15 @@ async function processFeed(feed: RssFeed): Promise<FetchResult> {
const typeVeille = (aiResult.typeVeille ?? feed.defaultTypeVeille ?? "informationnelle") as const typeVeille = (aiResult.typeVeille ?? feed.defaultTypeVeille ?? "informationnelle") as
"reglementaire" | "concurrentielle" | "technologique" | "informationnelle"; "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 // Générer le résumé IA uniquement pour les articles pertinents
const iaResume = aiResult.relevant const iaResume = await generateSummary(title, description);
? await generateSummary(title, description)
: null;
try { try {
// Essayer d'insérer // Essayer d'insérer
@@ -444,10 +449,15 @@ async function processFeed(feed: RssFeed): Promise<FetchResult> {
const categorie = (feed.defaultCategorieAap ?? "Autre") as const categorie = (feed.defaultCategorieAap ?? "Autre") as
"Handicap" | "PA" | "Enfance" | "Précarité" | "Sanitaire" | "Autre"; "Handicap" | "PA" | "Enfance" | "Précarité" | "Sanitaire" | "Autre";
// Générer le résumé IA uniquement pour les articles pertinents // ── Filtre de pertinence : ne pas insérer les AAP non pertinents ─────────
const iaResume = aiResult.relevant if (!aiResult.relevant) {
? await generateSummary(title, description) console.log(`[RSS] AAP rejeté (non pertinent) : "${title.substring(0, 80)}" — ${aiResult.reason}`);
: null; result.skippedItems++;
continue;
}
// Générer le résumé IA pour les AAP pertinents
const iaResume = await generateSummary(title, description);
try { try {
await db.insert(aapItems).values({ await db.insert(aapItems).values({

View File

@@ -162,3 +162,11 @@
- [x] Mettre à jour la signature de classifyArticle pour accepter un paramètre optionnel contenuPage - [x] Mettre à jour la signature de classifyArticle pour accepter un paramètre optionnel contenuPage
- [x] 0 erreur TypeScript, tests passés - [x] 0 erreur TypeScript, tests passés
- [x] Checkpoint - [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