Passer au playerPasser au contenu principal
  • il y a 1 semaine
Les choix d’architecture technique, fondés sur des critères de simplicité et sur des composants open source, et leur mise en œuvre, en suivant le processus de génération du site web : génération d’un fichier JSON unique plat à partir des 70 000 fichiers RDF produits par le Lab ; application de fichiers de framing JSON-LD pour produire, à partir de ce fichier JSON, une sérialisation JSON arborescente et contrôlée à raison d’un fichier par type d’entité ou par entête ; génération de pages HTML statiques via Eleventy, à partir des fichiers JSON et des pages éditoriales écrites en Markdown ; mise en œuvre du logiciel Pagefind pour indexer de façon appropriée le contenu des pages HTML produites ; pour le service SPARQL, choix et installation de la base de graphes open source QLever, choisie pour ses performances en lecture.

Catégorie

📚
Éducation
Transcription
00:07Il y a un parti pris fort dans l'architecture de Garance,
00:10c'est que Garance, ce n'est pas une application qui diffuse des données,
00:14c'est une chaîne de production de documents.
00:17En fait, on pré-génère, on pré-calcule toutes les pages de notice
00:23des entités d'agents et de lieux qu'a décrites Florence plus tôt,
00:27afin de produire un ensemble de pages, un site web statique
00:32qui est ensuite diffusé via un simple serveur.
00:36Donc ça, c'est un parti pris très fort.
00:40C'est ce qu'on voit ici sur ce petit diagramme
00:42qui va me servir de fil conducteur sur la partie technique.
00:45On part des données de notice en RDF qui sont là-haut,
00:48on part aussi de contenu éditorial,
00:50parce qu'il y a une partie éditoriale en Garance pour donner du contexte,
00:53et puis on prend aussi l'ontologie Rico qui a été mentionnée,
00:56et on génère un ensemble de pages.
00:58Donc on va générer les notices, on va générer les fichiers de téléchargement,
01:01on va générer les pages éditoriales,
01:03et on va même générer des index qui permettent de rechercher à l'intérieur de Garance.
01:07Et tout ça, c'est un ensemble de documents statiques
01:09qu'il suffit de poser sur un serveur.
01:11Il y a aussi dans Garance une partie plus dynamique
01:14qui va s'appuyer sur la base de graphes Clever
01:19dans laquelle on est venu charger les mêmes fichiers de données.
01:24Donc voilà, c'est Garance, c'est un site statique
01:26couplé à cette base RDF SparkQL.
01:29Il n'y a pas de serveur applicatif pour naviguer dans les pages,
01:32c'est seulement un serveur de fichiers.
01:34Donc on est vraiment sur une approche documentaire,
01:36on vient générer des documents, on vient générer des pages HTML.
01:40Alors bien sûr, quand on veut interroger en SparkQL,
01:43il faut avoir la base disponible et accessible dynamiquement,
01:48mais c'est une partie qui est découplée du site lui-même,
01:50qui n'est pas un prérequis.
01:52Les avantages et les inconvénients de ça, c'est quoi ?
01:54Donc les avantages de cette approche-là,
01:55c'est un avantage de performance.
01:58Les pages, les documents qu'on a produits
02:00sont renvoyés dans les navigateurs
02:03qui les demandent sans calcul.
02:04On renvoie juste le document.
02:06Ça, c'est intéressant pour l'optimisation des moteurs de recherche.
02:09Puisque les pages sont très rapides à charger.
02:11Il y a des avantages de sécurité,
02:13parce qu'il n'y a pas ou il y a moins de possibilités
02:15de failles de sécurité,
02:15parce qu'il n'y a pas de serveur applicatif.
02:18Il n'y a pas d'application.
02:19Il y a des avantages en termes de robustesse et de coût,
02:21parce qu'il n'y a pas de maintenance à prévoir,
02:23ou simplement la maintenance d'un serveur web
02:24qui est plutôt facile.
02:26Et il y a moins de risque de panne.
02:28Et puis il y a des avantages en termes de possibilités d'archivage,
02:31parce que l'ensemble de ces documents,
02:32l'ensemble de ces pages de notice,
02:34peut être archivé comme un tout.
02:36Ça forme un ensemble documentaire.
02:38Alors il y a des inconvénients aussi à cette approche-là.
02:40Il y a des inconvénients sur la fraîcheur des données,
02:42puisqu'on n'a pas de mise à jour en temps réel
02:44par rapport aux notices.
02:45Il faut régénérer le site.
02:47Là, ce n'est pas tellement un souci,
02:49parce que les données sont relativement statiques.
02:51Elles bougent peu dans le temps.
02:53Mais ce ne serait pas pareil sur des données
02:55qui seraient plus dynamiques.
02:59C'est du tout ou rien.
03:00Quand on republie,
03:01on republie l'ensemble des sites
03:02et l'ensemble des pages,
03:03seulement si une partie a changé.
03:07Il y a des inconvénients sur la partie plus technique,
03:10qui s'appelle la négociation de contenu.
03:11La négociation de contenu,
03:12c'est le fait de renvoyer soit la page
03:15qui peut s'afficher dans le navigateur,
03:17soit un fichier technique,
03:19le fichier RDF qui contient les données brutes,
03:22parce que le fichier de données brutes,
03:24il faut aussi le pré-générer.
03:26Ce qui n'est pas tellement un problème aussi ici,
03:29puisque ces fichiers individuels existent déjà
03:32comme des fichiers individuels
03:33et donc on peut s'appuyer dessus.
03:35La complexité par rapport à une application dynamique
03:38est identique.
03:39La complexité ne disparaît pas.
03:41C'est simplement que la logique de génération des documents
03:44est déportée dans la chaîne qui pré-génère le site
03:47et pas calculée à la volée
03:50au moment de l'affichage de la page.
03:52Cette chaîne de génération de sites,
03:54qui est la partie la plus...
03:54là où il y a le plus d'intelligence là-dedans,
03:57elle est ici dans mon petit diagramme,
03:58en fait, elle se séquence comme ça.
04:02On part des 75 000 fichiers RDF,
04:05environ 75 000,
04:06plus des fichiers de relations,
04:08plus quelques autres fichiers,
04:10et on vient lire l'ensemble de ces fichiers
04:14qu'on remet dans un seul grand fichier
04:17qui contient tout ce graphe d'entités
04:19dans lequel on va avoir les relations
04:22entre les agents, les lieux
04:23et les vocabulaires contrôlés.
04:24On met tout ça dans un seul grand fichier
04:27qui va être sérialisé dans un format
04:29qui s'appelle JSON-LD.
04:30Et puis ce grand format qui est une liste à plat,
04:33c'est une liste à plat d'entités,
04:34on vient le hiérarchiser.
04:36Donc on passe d'une structure de graphe
04:38à une structure d'arbres.
04:39Et donc là, on va dire comment on veut
04:42que les informations se structurent
04:44en termes arborescentes.
04:46On va dire qu'on veut certaines propriétés
04:47au premier niveau,
04:48puis qu'on va inclure les relations dedans,
04:49puis qu'on va inclure les références
04:51au vocabulaire contrôlé, etc.
04:52Donc là, on vient définir
04:55comment on veut que ces documents,
04:58comment on veut que ces pages se structurent.
05:01Et donc on fait ça séparément
05:03pour les agents d'un côté,
05:05les lieux de l'autre,
05:05et les vocabulaires dans une troisième partie.
05:08Et donc là, on a une sérialisation
05:11JSON arborescente contrôlée.
05:13Et ça, ça se fait à partir d'une technique
05:15qui s'appelle le JSON-LD framing.
05:17Donc on gardera un petit fichier de spécification
05:20de comment on dit ça.
05:22Et puis à partir de ces fichiers hiérarchisés,
05:26on vient ensuite générer les pages.
05:27Donc la génération des pages proprement dites
05:29arrive ici, en plus des comptes méditoriaux
05:33et de l'ontologie.
05:34Et on s'appuie pour ça sur un outil
05:35qui s'appelle Eleventy,
05:37qui est un générateur de sites statiques.
05:39Et on vient produire en sortie
05:4075 000 pages HTML environ.
05:43Et les relations, par exemple,
05:46les entités de relations RICO,
05:48sont incluses dans les pages des agents
05:51ou des lieux qui référencent ces entités.
05:54Également, les libellés sont aussi inclus,
05:57sont comme des sous-sections,
05:58on va le voir juste après,
05:59des sous-sections dans ces pages.
06:01Cette technique de framing,
06:03qui permet de contrôler, de sérialiser,
06:06de produire des documents à partir de graphes,
06:08c'est un standard, W3C,
06:10ce n'est pas quelque chose qu'on a inventé.
06:12C'est un langage de sérialisation déclaratif.
06:15Donc, on vient spécifier, déclarer
06:17la façon dont on veut produire ces documents.
06:19On ne contrôle pas tout avec cette déclaration.
06:22On ne peut pas jouer sur tout.
06:24On ne peut pas vraiment tout à fait filtrer des valeurs.
06:27Des fois, on a envie de filtrer des choses,
06:28de ne pas montrer des choses.
06:30On n'a pas une complète liberté là-dessus.
06:33Donc, ça veut dire qu'on a aussi
06:34des pré-traitements sur les fichiers
06:37qui viennent les nettoyer
06:39ou enlever certaines choses.
06:41On ne contrôle pas non plus l'ordre des valeurs
06:43puisqu'il s'agit de structure JSON
06:45et dans les JSON, on n'a pas de notion d'ordre.
06:48Donc, l'ordre de ce qui s'affiche à l'écran
06:50est contrôlé par d'autres fichiers de configuration.
06:54Sans rentrer dans les détails,
06:57ces déclarations de framing
07:00pour les agents ressemblent à des fichiers comme ça.
07:03Donc là, on dit que ça va s'appliquer
07:04à tous les reco-agents.
07:06Et puis, dans tous les reco-agents,
07:07voilà toutes les propriétés qu'on va vous inclure
07:09dans ces documents,
07:10les reco-identifiers,
07:12les names,
07:13les agent names,
07:14autorised by,
07:14et puis, par exemple,
07:15les other ad corporate body type.
07:17Et là, on a une sous-section
07:19qui me dit,
07:20dans les other ad corporate body type,
07:22on dit,
07:23tu ne me mets pas cette section
07:25s'il n'y a pas de valeur.
07:26tu ne me prends que
07:29que le scope-pref label
07:30que j'ai indiqué ici
07:31et tu vas toujours m'imbriquer
07:35cette partie-là
07:36hiérarchiquement en dessous.
07:39Et donc,
07:40ce qu'on va obtenir en repas,
07:41c'est un fichier season,
07:41on va voir ces entrées,
07:43rico,
07:43other ad corporate body type,
07:45la référence
07:46à l'identifiant
07:47dans le vocabulaire contrôlé,
07:48et puis le libellé correspondant,
07:50ici,
07:50service d'administration centrale,
07:51qui sera celui qui sera affiché à l'écran
07:53dans les pages de documents.
07:55Ensuite,
07:56la génération des pages de documents,
07:58en fait,
07:59utilise deux techniques.
08:01On a une mise en forme
08:03complètement générique
08:03qui va simplement reprendre
08:05la structure des données
08:06et on a des mises en forme spécifiques
08:08qui sont appliquées
08:09sur les vocabulaires contrôlés.
08:12Les mises en forme génériques,
08:13en fait,
08:14elles sont composées,
08:14et vous le verrez tout de suite après
08:15dans la démo,
08:17elles sont composées
08:18d'une entête de métadonnées
08:19avec les identifiants.
08:21Donc, cette entête de métadonnées
08:22qui comprend la date de dernière mise à jour,
08:25les liens d'équivalence,
08:26les liens vers la salle d'inventaire virtuelle,
08:28la salle de lecture virtuelle,
08:30en fait,
08:30ont été isolées dans un fichier à part
08:32et donc,
08:32à partir de ce fichier,
08:33on génère la partie en tête.
08:34Et puis,
08:34on a la partie de corps de page
08:36où on reprend tous les attributs
08:39de l'entité dans le graphe,
08:42mais pas seulement,
08:43puisque vous voyez
08:44qu'on a parfois des relations
08:45qui sont des sous-blocs.
08:46Donc,
08:47on a la cible de la relation,
08:48puis on a un sous-bloc
08:49qui est la relation elle-même
08:53avec la date de début,
08:55la date de fin de la relation
08:56et une note associée.
08:58Et puis,
08:59qui contient encore un autre sous-bloc.
09:00Donc,
09:00on a une indentation
09:01à plusieurs niveaux de profondeur.
09:03On n'a pas que les liens directs dans le graphe.
09:05L'ordre d'affichage de tout ça
09:07et des informations de style spécifique,
09:10par exemple,
09:11le fait d'avoir ces listes de type d'occupation
09:14comme une liste horizontale
09:16sont contrôlées par un fichier de configuration
09:18qui nous permet de dire,
09:20qui nous permet un peu de déterminer
09:23comment vont s'afficher certains types d'attributs.
09:28Je passe rapidement là-dessus.
09:31L'idée,
09:31c'est que cette mise en forme générique,
09:33elle soit vraiment pour l'humain,
09:36entre guillemets.
09:38L'idée,
09:39c'est de la rendre la moins technique possible,
09:40même si il y a une technicité
09:40dans le graphe RDF sous-jacent.
09:44L'idée,
09:45c'est de ne pas montrer cette technicité.
09:47Donc,
09:47il n'y a aucun identifiant technique
09:48irrévisible
09:49ou vraiment le moins possible.
09:51On a des notices riches
09:52avec du contexte à plusieurs niveaux.
09:54On a des mises en forme spécifiques
09:56qui nous permettent
09:57d'avoir un affichage sympathique,
09:58y compris avec des affichages cartographiques
10:00que vous verrez dans la démo,
10:01je pense.
10:03à comparer avec d'autres solutions existantes
10:05qui n'offrent pas du tout
10:08ce même genre d'avantages.
10:10Les affichages spécifiques
10:12pour les vocabulaires contrôlés,
10:13là,
10:13je passe rapidement,
10:14vous les verrez aussi dans la démo,
10:15mais on a des sections dans les pages
10:17où on va retrouver
10:18l'entrée dans le vocabulaire contrôlé,
10:21son information de hiérarchie,
10:22ses synonymes,
10:23ses définitions,
10:24ses concepts plus spécifiques,
10:25ses renvois,
10:26ses alignements exacts,
10:27etc.
10:29Il y a une partie intéressante
10:32dans ce site statique,
10:33c'est que malgré le fait
10:35qu'on a simplement un ensemble de pages,
10:38on arrive tout de même
10:39à pouvoir rechercher,
10:40à pouvoir offrir
10:40des fonctionnalités de recherche
10:42dans ces ensembles de documents.
10:45Et c'est offert par un composant
10:46qui s'appelle PageFind,
10:47qui est un composant open source
10:48de création d'index de recherche
10:50sur des sites statiques.
10:52Ça veut dire quoi ?
10:53Ça veut dire que la recherche
10:53que l'on fait,
10:54elle est donc effectuée
10:55dans le navigateur.
10:56Côté client,
10:56il n'y a pas de serveur.
10:58Et malgré tout,
10:58on arrive à obtenir
10:59des capacités de recherche,
11:02y compris avec des facettes
11:03qui sont assez surprenantes.
11:06Le principe,
11:07c'est qu'une fois que l'ensemble
11:08de ces 75 000 documents
11:11a été fait,
11:13eh bien PageFind
11:14va reparcourir
11:15tous ces 75 000 documents
11:17et construire un index
11:18de recherche spécifique.
11:19Cet index,
11:20il est dirigé
11:21par des annotations particulières
11:22qu'on a été mettre
11:23dans les pages HTML.
11:25Quelle partie des documents
11:27doivent être indexées,
11:28quelles valeurs
11:29correspondent à des facettes
11:29de recherche,
11:30par exemple.
11:33PageFind,
11:33ensuite,
11:33il offre son propre,
11:35sa propre interface
11:36de recherche
11:37qu'on a déployée
11:39dans Garance.
11:40Le déploiement de tout ça
11:40est très simple,
11:41les recherches
11:42sont vraiment rapides
11:43pour quelque chose
11:44qui se fait côté client
11:45et la configuration
11:46était vraiment très aisée.
11:47Ça a été assez bluffant
11:49d'une façon générale.
11:51vous verrez aussi
11:52tout ça dans la démo,
11:53mais voilà à quoi ça ressemble.
11:54On a une zone de recherche
11:55où on vient taper
11:57le texte que l'on recherche,
11:59des filtrages à facettes
12:00ici en fonction
12:02des facettes
12:02que l'on a paramétré,
12:03les résultats de recherche,
12:05du surlignage
12:06du mot qu'on a cherché,
12:07des métadonnées
12:08supplémentaires
12:09sur chaque résultat.
12:10Ici, on voit
12:11des dates de naissance,
12:12des dates de décès
12:12et des types d'occupation.
12:16Et puis,
12:17il y a une partie
12:17de page HTML éditoriale
12:19dans ce site statique
12:21que vous verrez aussi
12:22simplement pour
12:23pointer le fait
12:24que dans ce contenu éditorial,
12:25on a aussi inséré
12:26des diagrammes
12:27dont le contenu
12:32et la répartition
12:33a été calculé
12:34à partir de l'analyse
12:35des données.
12:35Donc, on fait des calculs,
12:36on fait des requêtes
12:38sur le graphe
12:39pour pouvoir fournir
12:40les informations
12:41qui permettent
12:42de générer
12:43ces camemberts
12:43que vous allez voir.
12:46Un petit mot
12:47sur les performances
12:48de génération du site.
12:49La génération,
12:50c'est environ 75 000 pages,
12:52prend un peu plus
12:54de 40 minutes maintenant.
12:56Alors, 40 minutes,
12:56c'est à la fois peu,
12:57à la fois beaucoup.
12:59Dans ces 40 minutes,
13:00il y a une bonne partie,
13:02un bon quart d'heure,
13:04un petit quart d'heure ici
13:05qui s'est maintenant
13:05transformé en bon quart d'heure,
13:07qui est simplement
13:08la première étape
13:09de lecture des fichiers.
13:11Parce que,
13:12on a,
13:14là,
13:15on fait avec
13:17les capacités
13:18des bibliothèques
13:19de lecture
13:20de fichiers RDF
13:21qui sont un peu littéraires
13:23pour ce qu'on veut faire.
13:25Et du coup,
13:25ça prend beaucoup de temps.
13:26Donc, simplement,
13:27relire les fichiers
13:28nous prend une quinzaine
13:29de minutes.
13:30La génération des pages
13:31elle-même,
13:31nous prend neuf minutes.
13:33Donc, c'est pas beaucoup.
13:35Simplement,
13:36la production des pages,
13:37c'est vraiment,
13:39c'est pas la majeure partie
13:40du travail.
13:41Et puis,
13:42on a une autre partie
13:43du temps
13:43qui sont sur la construction
13:44de l'index de recherche
13:45et puis le transfert
13:46de ces fichiers
13:47vers le serveur final.
13:50Cette approche,
13:51donc voilà,
13:51elle a une certaine limite.
13:54il nous semble que c'est scalable
13:56jusqu'à 100 000 pages.
13:58Après, on arrive sur
13:59des nombres de pages
14:01où là,
14:02il faudrait se poser la question
14:04de savoir si un site statique
14:06continuait à être parti.
14:08On a rencontré
14:09des difficultés techniques
14:10dans cette mise en place.
14:12Donc, ces problèmes
14:12de performance
14:13sur la partie lecture,
14:15notamment liés
14:15à la manipulation
14:17de gros fichiers JSON
14:19avec vraiment des limites
14:20techniques bêtes
14:20dont je vous passe le détail.
14:23L'utilisation du visionnel
14:24des framings
14:24est intéressante
14:26par son approche déclarative
14:27parce que c'est que
14:28sur des fichiers de config
14:28mais ça ne permet pas
14:30de faire tout ce qu'on voudrait faire
14:31en termes de mise en forme
14:32des données.
14:34Et puis,
14:34on s'est confronté
14:35à un manque de robustesse
14:36des outils
14:38quand il s'est agi
14:39de débloquer
14:40la production de ces pages.
14:42C'était parfois compliqué
14:44de comprendre
14:44où étaient les problèmes
14:46ce qui nous a fait perdre
14:48un temps significatif
14:49sur le développement
14:51de tout ça.
14:54Et donc,
14:54parfois,
14:55aussi avec des variantes
14:57infimes dans les données
14:58où il pouvait manquer
14:59une information,
15:00ça peut faire planter
15:01la génération
15:02de toute ou partie du site.
15:04Un tout petit mot
15:05pour finir sur Qlever,
15:06la base
15:07qui sert
15:08d'interrogation des données.
15:10Qlever,
15:11c'est l'outil
15:11qui a été utilisé
15:13pour l'interrogation.
15:14C'est une base de graphes
15:15RDF récente
15:16optimisée
15:16pour les requêtes en lecture.
15:17Vous aurez les liens ici
15:18si vous voulez aller voir.
15:19C'est un outil open source
15:20qui est développé
15:21à l'Université de Fribourg.
15:23Il y a un mini-benchmark
15:24de comparaison
15:25de performances
15:26qui a été réalisé
15:27par le Lab
15:27à l'été 2025
15:28sur les données de garance
15:30entre GraveDB
15:31et Qlever
15:31qui a validé le fait
15:33que Qlever
15:34était performant
15:34escalable.
15:36Les résultats
15:37de ce benchmark
15:37sont disponibles
15:38sur demande
15:38au Lab des AN.
15:40L'installation
15:40et la maintenance
15:41de Qlever
15:41a été prise en charge
15:42par les sociétés
15:43Zazoco
15:43et donc
15:44la quantité
15:45de données chargées
15:45dedans
15:45a été mentionnée
15:46par Florent
15:47c'était 16,5 millions
15:48de triplés.
15:49C'est parti.
Commentaires

Recommandations