Editorial Intelligence
Ce que c'est
Editorial Intelligence est un module Drupal qui sélectionne des actualités externes pour un site au lieu d'ajouter un flux brut. Il interroge des sources pour trouver des articles candidats, attribue une note à chacun en fonction de la similarité des embeddings avec le contenu propre du site, et n'affiche que ceux qui sont pertinents : dans une barre latérale, dans un bloc de couverture associée sur un article, et, associé au module Species External Entity, dans un widget par espèce sur une page d'espèce.
Il traite la couverture externe comme une salle de rédaction curatoriale, et non comme un flux non filtré : rien n'apparaît tant qu'il n'a pas été évalué et jugé pertinent. Editorial Intelligence est en ligne aujourd'hui sur Biodiversa.
En un coup d'œil
- Modules
editorial_intelligence, le moteur : stockage, embeddings et scoring ;editorial_intelligence_feedseteditorial_intelligence_manual, deux adaptateurs d'entrée interchangeables- Drupal core
- 10 ou 11
- Nécessite
- Le module contribué
external_entitiesetkey;editorial_intelligence_feedsnécessite également Feeds - Embeddings
- Un serveur Ollama auto-hébergé exécutant
nomic-embed-text, configuré via le module Drupal AI - Fonctionne avec
species_ext, pour un widget par espèce et un corpus d'espèces sur lequel calculer un score- Statut
- Fonctionnel. En production sur Biodiversa.
Ce que voient les visiteurs et les éditeurs
Les visiteurs voient une couverture éditorialisée partout où un site place un bloc : une liste dans une barre latérale, un bloc de couverture associée sur un article ou, sur un site consacré à la biodiversité, un widget d’actualités sur les espèces présentes sur la page.
Les éditeurs traitent une file d’attente de révision pilotée au clavier : un élément dont le score dépasse un seuil est publié automatiquement, un élément dont le score est inférieur est écarté, et tout ce qui se situe entre les deux attend qu’une personne l’approuve ou le rejette.
Ce que cela apporte à un site Drupal
Stockage des entités
Chaque candidat est stocké sous forme d'entité externe (editorial_news), et non de nœud, de sorte que le moteur n'ajoute rien à la table des nœuds de Drupal.
Corpus
La notation s'effectue par rapport à des corpus nommés plutôt qu'à un flux global unique. Les corpus fournis sont news_article, le contenu propre au site, et species, pour les sites exécutant species_ext. Chaque candidat conserve le corpus par rapport auquel il a été évalué, de sorte que plusieurs corpus coexistent sans s'écraser mutuellement, et en ajouter un nouveau se fait en deux appels Drush, sans nouveau code.
Composants d'affichage
Le plugin de bloc EditorialNewsRelatedBlock est réutilisable par corpus. Il est fourni avec trois placements construits sur le même modèle :
- Editorial news : barre latérale, une liste à l'échelle du site, configurée par étiquette et une limite de résultats
- Editorial news : associés, placé sur un article, mis en correspondance par type de contenu et corpus, avec une option
include_queuedpour afficher aussi les candidats non approuvés - Editorial news : à propos de cette espèce, placé sur une page d'espèce, mis en correspondance avec le corpus des espèces, avec ses propres paramètres de correspondance minimale et de notation
Sources d'entrée
Le moteur ne sait rien de la provenance d'un candidat. Chaque façon dont un candidat peut arriver est un sous-module frère : editorial_intelligence_feeds interroge les flux RSS et Atom via Drupal Feeds, et editorial_intelligence_manual permet à un éditeur de coller une URL, d'en prévisualiser les métadonnées Open Graph et de l'ajouter manuellement. Une nouvelle source est un troisième sous-module de même forme, et non une modification du moteur.
Commandes Drush
Ingestion et notation : ei:seed-sources, ei:add-source, ei:embed-onsite, ei:rescore-all (son option --rerank réutilise les embeddings stockés au lieu d'appeler Ollama à nouveau), ei:apply-thresholds. Espèces et taxonomie : ei:embed-taxa, ei:embed-siblings. Légendes IA : ei:generate-taglines, ei:explain-matches. Diagnostics : ei:diag, ei:purge.
Sources de données et licences
- Flux RSS et Atom : interrogés selon un calendrier nocturne via le sous-module
editorial_intelligence_feeds - Wikipédia : résumés intégrés pour la chaîne taxonomique lors de l’évaluation du corpus d’espèces
- GBIF : espèces sœurs vivantes d’une espèce, récupérées par sa clé de taxon GBIF, pour le corpus d’espèces
- Ollama : un serveur auto-hébergé fournissant le modèle d’embedding qui évalue chaque candidat
- Claude Haiku (Anthropic), en option : une brève légende expliquant pourquoi un candidat approuvé est important ; la valeur par défaut est un modèle local, Claude est une option de production, et l’un ou l’autre est configuré comme fournisseur du module Drupal AI plutôt que codé en dur
Le recalcul des scores réutilise les embeddings stockés par défaut, donc réajuster un seuil ou ajouter un corpus ne fait pas de nouvel appel au modèle d’embedding.
Décisions de conception
- Curation, et non agrégation. Chaque candidat est évalué, classé et affiché uniquement là où il est pertinent, plutôt que de publier tout ce qu’une source fournit.
- Un moteur, plusieurs corpus. Une seule table d’embeddings sert un nombre quelconque de corpus nommés, chaque candidat étant étiqueté avec le corpus par rapport auquel il a été évalué, de sorte que l’évaluation par rapport à un nouveau type de contenu relève surtout de la configuration une fois qu’un premier corpus existe.
- Un filtre de pertinence par emplacement. Un bloc peut n’afficher que des éléments approuvés par l’éditeur, ou faire directement confiance au score ; le choix se fait par emplacement, et non à l’échelle du site.
- L’ingestion reste séparée de l’évaluation. Le moteur ne fait que stocker, évaluer et afficher ; chaque façon dont un candidat peut arriver, par polling ou collé à la main, est un sous-module frère dont le moteur ne sait rien.
Démarrer un projet.
Dites-nous ce que votre site publie déjà, et où la couverture externe doit apparaître.