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:
@@ -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
|
||||
|
||||
@@ -376,10 +376,15 @@ async function processFeed(feed: RssFeed): Promise<FetchResult> {
|
||||
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<FetchResult> {
|
||||
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({
|
||||
|
||||
Reference in New Issue
Block a user