DonnIA
Toutes les ressources
GuideAgents15 min

Monter une veille automatisée

Une chaîne qui collecte des flux, dédoublonne, trie sur un critère écrit et résume, avec les prompts à copier.


Une veille manuelle meurt toujours de la même façon : trois semaines d'enthousiasme, puis un onglet ouvert qu'on ne lit plus. Le problème n'est pas la lecture, c'est le tri. Sur cent articles publiés dans ton domaine chaque semaine, cinq te concernent vraiment.

Un agent de veille fait bien ce tri, à deux conditions. Il faut lui donner un critère de pertinence écrit, précis, qui ressemble à une consigne de stage et non à un thème. Et il faut résoudre le problème des doublons avant de lui parler, parce qu'aucun modèle ne le fera correctement à ta place.

Ce guide monte une chaîne en quatre morceaux : collecter, dédoublonner, trier, résumer. Les trois premiers sont du code déterministe. Seul le dernier est du travail de modèle.

Ce que l'agent ne doit pas faire

Il ne décide pas de ce qui est important, il applique ton critère. Il ne résume pas ce qu'il n'a pas lu : un titre de flux RSS n'est pas un article. Et il ne juge pas la fiabilité d'une source, c'est toi qui choisis les sources.

Le format de sortie décide de l'usage

Une veille lue est une veille courte. Vise dix lignes par semaine : trois éléments, une phrase de contexte chacun, un lien. Un rapport de deux pages finira comme les onglets.

Avant de commencer

  • Python 3.10 ou plus récent, et pip install feedparser
  • Cinq à quinze sources qui publient un flux RSS ou Atom
  • Un critère de pertinence écrit en trois lignes

1Choisir des sources, pas des mots-clés

Commence par les flux RSS et Atom : ils sont structurés, datés, stables, et leur lecture ne pose aucun problème d'étiquette. Beaucoup de blogs, de médias spécialisés, de dépôts GitHub (fil des releases) et de portails institutionnels en publient encore, même sans l'afficher.

Quinze sources bien choisies battent une recherche large. Une recherche large ramène du bruit corrélé : dix reprises du même communiqué de presse.

2Collecter et dédoublonner

Le dédoublonnage se fait sur deux niveaux : le même article vu deux fois, et le même sujet couvert par deux sources.

Le premier niveau est mécanique. Chaque entrée d'un flux porte un identifiant (id, le guid en RSS) ; à défaut, le lien fait l'affaire, à condition de le normaliser en retirant les paramètres de suivi.

import json
import feedparser
from pathlib import Path
from urllib.parse import urlsplit, urlunsplit, parse_qsl, urlencode

VUS = Path("vus.json")
deja = set(json.loads(VUS.read_text())) if VUS.exists() else set()

def cle(entree):
    url = entree.get("id") or entree.link
    p = urlsplit(url)
    params = [(k, v) for k, v in parse_qsl(p.query) if not k.startswith("utm_")]
    return urlunsplit((p.scheme, p.netloc, p.path, urlencode(params), ""))

nouveaux = []
for source in SOURCES:
    flux = feedparser.parse(source)
    for e in flux.entries:
        k = cle(e)
        if k in deja:
            continue
        deja.add(k)
        nouveaux.append({
            "titre": e.title,
            "lien": e.link,
            "date": e.get("published", ""),
            "extrait": e.get("summary", "")[:600],
            "source": flux.feed.get("title", source),
        })

VUS.write_text(json.dumps(sorted(deja)))

Le second niveau, deux sources qui racontent la même chose, relève du modèle : c'est une question de sens, pas d'URL. On le traite à l'étape de tri.

L'état doit survivre à l'exécution

Sans fichier vus.json persistant, chaque exécution te resservira les mêmes articles. C'est la panne numéro un de ce type de script, et elle passe inaperçue tant que tu testes à la main.

3Le prompt de tri

Un seul appel, sur la liste entière. Le modèle voit tous les éléments d'un coup, c'est ce qui lui permet de repérer les doublons de sujet.

Tu tries une veille. Voici [N] elements bruts, au format titre, source,
date, extrait.

Est pertinent uniquement ce qui concerne :
- [SUJET 1, formule en une ligne concrete]
- [SUJET 2]
- [SUJET 3]

N'est pas pertinent : [CE QUI REVIENT SOUVENT ET QU'ON NE VEUT PAS].

Consignes :
1. Ecarte tout element hors de ces trois sujets. Dans le doute, ecarte.
2. Si plusieurs elements traitent le meme fait, garde le plus complet et
   cite les autres comme reprises.
3. Garde au maximum 5 elements. S'il y en a moins de 5 de pertinents,
   rends-en moins. Ne complete pas pour atteindre 5.
4. Rends un tableau : titre, source, pourquoi c'est pertinent (une ligne),
   lien.
5. Si rien n'est pertinent cette semaine, ecris "Rien a signaler" et
   arrete-toi.

[LISTE]

Le point 5 n'est pas décoratif. Sans autorisation explicite de ne rien rendre, un modèle remplira toujours les cinq lignes, et ta veille perdra sa valeur en trois semaines.

4Le prompt de résumé

Le tri travaille sur des extraits, le résumé doit travailler sur les articles. Deuxième appel, seulement sur les éléments retenus.

Voici [N] articles retenus. Pour chacun, ecris :
- une phrase sur ce qui est nouveau ;
- une phrase sur ce que ca change pour [TON CONTEXTE : equipe, produit,
  metier] ;
- le lien.

Contraintes : pas d'introduction, pas de conclusion, pas d'adjectif
d'enthousiasme. Si un article ne dit rien de nouveau par rapport a ce que
tout le monde sait deja, ecris-le et passe au suivant.

5Le faire tourner tout seul

En ligne de commande, le mode non interactif suffit :

python collecte.py > nouveaux.json
cat nouveaux.json | claude -p "$(cat prompt-tri.txt)" > veille.md

Pour un déclenchement hebdomadaire, GitHub Actions accepte une planification cron, avec deux limites à connaître : l'intervalle minimum est de cinq minutes, et les horaires sont en UTC. Les exécutions planifiées peuvent aussi être retardées en période de charge, ce qui n'a aucune importance pour une veille.

on:
  schedule:
    - cron: "0 7 * * 1"

Quelques prompts pour aller plus loin

ObjectifPrompt à adapter
Trouver les fluxVoici 20 sites que je consulte. Pour chacun, trouve l'URL de son flux RSS ou Atom. Si le site n'en publie pas, dis-le au lieu de deviner une URL.
Écrire le critèreVoici 15 articles que j'ai trouves utiles et 15 que j'ai ignores. Deduis-en un critere de pertinence en trois lignes, formule pour un agent de tri.
Calibrer le triVoici ma consigne de tri et 40 elements dont je te donne mon verdict. Signale les cas ou ta consigne aurait donne un verdict different du mien.
Détecter les reprisesParmi ces elements, regroupe ceux qui traitent du meme fait. Pour chaque groupe, indique la source la plus complete et pourquoi.
Bilan mensuelVoici les 4 veilles hebdomadaires du mois. Degage les 3 tendances de fond, en ignorant les faits isoles.

Tu as d’autres ressources comme ça ?

Ce que tu viens de lire est entièrement gratuit. Une nouvelle ressource part chaque semaine dans la newsletter : guides, modèles à copier et liens triés, sans compte à créer.

Cette page est en accès libre, n’hésite pas à la partager.