Comment apprendre l'EAD à un LLM : RAG (2/3)
L’option du RAG dans le contexte d’inventaires encodés en EAD/XML peut paraître inadéquate au premier abord (vu le format très structuré des documents à intégrer, et étant donné l’objectif qui n’est pas la réalisation d’un agent conversationnel sur ces documents), mais en fait ce type d’apprentissage combinant récupération préalable de contenu externe et génération de nouveau contenu peut aussi donner de bons résultats à deux conditions :
- pour la phase de récupération : que l’étape de conversion des fichiers xml en embeddings soit réalisée de telle manière que ceux-ci arrivent à capter à la fois la sémantique et la structuration du contenu, la hiérarchie des données et leurs règles syntaxiques, le contenu textuel à l’intérieur des balises xml et les tags xml eux-mêmes en tant que balisage sémantique de ce contenu textuel ;
- pour la phase de génération : que le LLM utilisé soit assez large pour avoir été pré-entraîné sur une grande variétés de type de données (comprenant aussi des données structurées) si bien que le modèle, même s’il n’a pas été entraîné spécifiquement sur du xml, soit capable de s’adapter pour en produire.
Autre aspect important à noter et valable pour n’importe quel système de RAG : le RAG avec un LLM quantifié (compressé au format GGUF par exemple) fonctionne assez mal, en tout cas dans le cadre d’un système de RAG impliquant des capacités de synthèse des informations récupérées et pas seulement de restitution de données simples et factuelles. En effet, la diminution de la précision des calculs liée à la réduction de la précision des poids du modèle (due à la quantification) modifie les probabilités des tokens en sortie en dégradant les capacités de raisonnement et de compréhension contextuelle complexe du modèle.
L’ensemble des étapes du processus sont décrites dans ce notebook sur Kaggle :
- chargement des fichiers EAD
- conversion en embeddings
- création du vectorstore stocké dans une base de données Chroma
- mise en place du retriever
- inférence avec le LLM ,
- agent IA.
J'en reprends seulement ici les parties spécifiques, notamment celles liées à la conversion du XML en embeddings.
Documents sources (inventaires EAD/XML)
Les inventaires en EAD/XML destinés à peupler la base de données vectorielles doivent être assez nombreux et diversifiés pour représenter le plus exhaustivement possible les possibilités de description et de structuration des inventaires. On part ici d’une sélection aléatoire de 50 fichiers extraits des inventaires en XML/EAD du Catalogue général des manuscrits (CGM) mis en ligne par la BnF et accessibles par dump depuis https://api.bnf.fr/fr/CCFr/CGM.
Choix du modèle d’embeddings
La difficulté pour garantir la meilleure représentation vectorielle sémantique de données en EAD/XML tient au fait que :
- l’EAD sérialisé en xml contient à la fois des balises et attributs xml (libellés en anglais) et de plus ou moins grandes quantités de texte (en français) ;
- la structure hiérarchique imbriquée et l’articulation des composants est aussi importante à capter que le contenu.
Les possibilités posées quant au choix du meilleur modèle d’embeddings à privilégier pour l’encodage du xml sont donc nombreuses :
- un modèle privilégiant l’encodage du texte non structuré à l’intérieur des balises (all-MiniLM-L12-v2 par exemple) ;
- ou un modèle plus adapté à l’encodage de contenus aux relations complexes et intriquées (comme all-distilroberta-v1) ;
- voire un modèle spécialisé dans l’encodage de code informatique (CodeBERT) ;
- ou alors un modèle qui captera mieux les différences sémantiques entre les fichiers XML et l’aspect potentiellement multilingue (paraphrase-multilingual-MiniLM-L12-v2) ;
- pourquoi pas un modèle déjà fine-tuné pour la récupération d’extraits sémantiquement significatifs dans des documents volumineux (msmarco-distilbert-base-v4) ?
Bien évidemment, aucune réponse dogmatique ne peut à priori être apportée à ces questions, la seule réponse consistant à sélectionner quelques modèles d’embeddings candidats puis de les tester dans la chaîne de récupération et de génération afin de comparer les résultats et de sélectionner le plus efficient. Pour cet exemple, et après plusieurs tests, c'est le modèle msmarco-distilbert-base-v4 qui est utilisé
from transformers import AutoTokenizer, AutoModel, pipeline
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/msmarco-distilbert-base-v4")
model = AutoModel.from_pretrained("sentence-transformers/msmarco-distilbert-base-v4")
Tokenisation du xml
Le composant du modèle qui réalise les opérations de tokenisation est appelé le tokenizer : il est en charge du découpage du texte en unités minimales significatives de contenus puis de leur conversion en nombres sur la base d'un dictionnaire de mapping (le fichier tokenizer.json dans les repositories des modèles). Cette brique est en fait la pièce maîtresse de tout modèle de langage puisque de cette tokenisation découlera l’encodage positionnel des tokens les uns par rapport aux autres, et donc la capacité du modèle à comprendre les nuances linguistiques dans les données. Le point crucial pour un traitement adapté des données en XML réside donc dans le fait que les balises XML elles-mêmes doivent être traitées comme des tokens de manière à ce que le modèle apprenne à prédire des séquences appropriées qui par nature comprennent à la fois du contenu textuel et des balises XML. Une fois le modèle d’embeddings choisi, il faut donc vérifier comment s’effectue nativement la tokenisation et éventuellement ajuster le tokenizer afin qu’il discriminine bien les tags et attributs xml comme des tokens.
Tokenisation native avec msmarco-distilbert-base-v4
prompt = '<ead id="N65537"><eadheader countryencoding="iso3166-1" dateencoding="iso8601" findaidstatus="provisoire" langencoding="iso639-2b" relatedencoding="dc" repositoryencoding="iso15511" scriptencoding="iso15924"><eadid countrycode="fr" encodinganalog="identifier" identifier="FRCGMBPF-000005102-01a" mainagencycode="751131015">FRCGMBPF-000005102-01a.xml</eadid><filedesc><titlestmt><titleproper encodinganalog="title">Catalogue général des manuscrits des bibliothèques publiques de France. Dépôts d\'archives départementales, communales et hospitalières. Archives communales</titleproper><author encodinganalog="creator">Isnard, Abbé Guillaume, Moris, Blancard, Aubépin, Autorde, Lacroix, Merlet, Bondurand, Roschach, Parfouru, Gouget, De la Cour de la Pijardière, Harvut, Libois, Combarieu, André, Demaison, Collin, Jacob, Coüard-Luys'
inputs = tokenizer(prompt, return_tensors="pt")
#outputs = model(**inputs)
tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
print(tokens)
Résultats
['[CLS]', '<', 'ea', '##d', 'id', '=', '"', 'n', '##65', '##53', '##7', '"', '>', '<', 'ea', '##dh', '##ead', '##er', 'country', '##en', '##co', '##ding', '=', '"', 'iso', '##31', '##66', '-', '1', '"', 'date', '##en', '##co', '##ding', '=', '"', 'iso', '##86', '##01', '"', 'find', '##aid', '##sta', '##tus', '=', '"', 'pro', '##vis', '##oire', '"', 'lange', '##nco', '##ding', '=', '"', 'iso', '##6', '##39', '-', '2', '##b', '"', 'related', '##en', '##co', '##ding', '=', '"', 'dc', '"', 'repository', '##en', '##co', '##ding', '=', '"', 'iso', '##15', '##51', '##1', '"', 'script', '##en', '##co', '##ding', '=', '"', 'iso', '##15', '##9', '##24', '"', '>', '<', 'ea', '##di', '##d', 'country', '##code', '=', '"', 'fr', '"', 'encoding', '##anal', '##og', '=', '"', 'id', '##ent', '##ifier', '"', 'id', '##ent', '##ifier', '=', '"', 'fr', '##c', '##gm', '##b', '##pf', '-', '000', '##00', '##51', '##0', '##2', '-', '01', '##a', '"', 'main', '##age', '##ncy', '##code', '=', '"', '75', '##11', '##31', '##01', '##5', '"', '>', 'fr', '##c', '##gm', '##b', '##pf', '-', '000', '##00', '##51', '##0', '##2', '-', '01', '##a', '.', 'xml', '<', '/', 'ea', '##di', '##d', '>', '<', 'filed', '##es', '##c', '>', '<', 'titles', '##tm', '##t', '>', '<', 'title', '##pro', '##per', 'encoding', '##anal', '##og', '=', '"', 'title', '"', '>', 'catalogue', 'general', 'des', 'man', '##us', '##cr', '##its', 'des', 'bi', '##bl', '##iot', '##he', '##ques', 'pub', '##li', '##ques', 'de', 'france', '.', 'depot', '##s', 'd', "'", 'archives', 'depart', '##ement', '##ales', ',', 'communal', '##es', 'et', 'hospital', '##iere', '##s', '.', 'archives', 'communal', '##es', '<', '/', 'title', '##pro', '##per', '>', '<', 'author', 'encoding', '##anal', '##og', '=', '"', 'creator', '"', '>', 'isn', '##ard', ',', 'ab', '##be', 'guillaume', ',', 'mori', '##s', ',', 'blanca', '##rd', ',', 'au', '##be', '##pin', ',', 'auto', '##rde', ',', 'lac', '##roi', '##x', ',', 'mer', '##let', ',', 'bond', '##ura', '##nd', ',', 'ro', '##sch', '##ach', ',', 'par', '##fo', '##uru', ',', 'go', '##uge', '##t', ',', 'de', 'la', 'co', '##ur', 'de', 'la', 'pi', '##jar', '##dier', '##e', ',', 'ha', '##r', '##vu', '##t', ',', 'li', '##bo', '##is', ',', 'comb', '##ari', '##eu', ',', 'andre', ',', 'dem', '##ais', '##on', ',', 'collin', ',', 'jacob', ',', 'co', '##ua', '##rd', '-', 'lu', '##ys', '[SEP]']
Ajout de tokens spéciaux correspondants aux éléments et attributs EAD
special_tokens = ["<author>","<change>","<creation>","<descrules>","<ead>","<eadgrp>","<eadheader>","<eadid>",
"<edition>","<editionstmt>","<filedesc>","<frontmatter>","<langusage>","<notestmt>","<profiledesc>",
"<publicationstmt>","<publisher>","<revisiondesc>","<seriesstmt>","<sponsor>","<subtitle>",
"<titleproper>","<titlestmt>","<archdesc>","<archdescgrp>","<c>","<c01>","<c02>","<c03>","<c04>",
"<c05>","<c06>","<c07>","<c08>","<c09>","<c10>","<c11>","<c12>","<controlaccess>","<did>","<dsc>",
"<dscgrp>","<abstract>","<accessrestrict>","<accruals>","<acqinfo>","<altformavail>","<appraisal>","<archref>","<arrangement>","<bibliography>","<bibref>","<bioghist>","<container>","<custodhist>","<date>","<dimensions>","<extent>","<fileplan>","<langmaterial>","<legalstatus>","<materialspec>","<odd>","<originalsloc>","<origination>","<otherfindaid>","<physdesc>","<physfacet>","<physloc>","<phystech>","<prefercite>","<processinfo>","<relatedmaterial>","<repository>","<scopecontent>","<separatedmaterial>","<unitdate>","<unitid>","<unittitle>","<userestrict>",
"<corpname>","<famname>","<function>","<genreform>","<geogname>","<language>","<name>",
"<occupation>","<persname>","<subject>","<title>","<abbr>","<address>","<addressline>",
"<bibseries>","<blockquote>","<chronitem>","<chronlist>","<colspec>","<defitem>","<descgrp>",
"<div>","<emph>","<entry>","<event>","<eventgrp>","<expan>","<head>","<head01>","<head02>",
"<imprint>","<index>","<indexentry>","<item>","<label>","<lb>","<list>","<listhead>","<namegrp>",
"<note>","<num>","<p>","<row>","<runner>","<subarea>","<table>","<tbody>","<tgroup>","<thead>",
"<titlepage>","<arc>","<dao>","<daodesc>","<daogrp>","<daoloc>","<extptr>","<extptrloc>",
"<extref>","<extrefloc>","<linkgrp>","<ptr>","<ptrgrp>","<ptrloc>","<ref>","<refloc>","<resource>",
"<author","<change","<creation","<descrules","<ead","<eadgrp","<eadheader","<eadid","<edition","<editionstmt","<filedesc","<frontmatter","<langusage","<notestmt","<profiledesc","<publicationstmt","<publisher","<revisiondesc","<seriesstmt","<sponsor","<subtitle","<titleproper","<titlestmt",
"<archdesc","<archdescgrp","<c","<c01","<c02","<c03","<c04","<c05","<c06","<c07","<c08","<c09",
"<c10","<c11","<c12","<controlaccess","<did","<dsc","<dscgrp","<abstract","<accessrestrict",
"<accruals","<acqinfo","<altformavail","<appraisal","<archref","<arrangement","<bibliography",
"<bibref","<bioghist","<container","<custodhist","<date","<dimensions","<extent","<fileplan",
"<langmaterial","<legalstatus","<materialspec","<odd","<originalsloc","<origination",
"<otherfindaid","<physdesc","<physfacet","<physloc","<phystech","<prefercite","<processinfo",
"<relatedmaterial","<repository","<scopecontent","<separatedmaterial","<unitdate","<unitid",
"<unittitle","<userestrict","<corpname","<famname","<function","<genreform","<geogname",
"<language","<name","<occupation","<persname","<subject","<title","<abbr","<address",
"<addressline","<bibseries","<blockquote","<chronitem","<chronlist","<colspec","<defitem",
"<descgrp","<div","<emph","<entry","<event","<eventgrp","<expan","<head","<head01","<head02",
"<imprint","<index","<indexentry","<item","<label","<lb","<list","<listhead","<namegrp","<note",
"<num","<p","<row","<runner","<subarea","<table","<tbody","<tgroup","<thead","<titlepage",
"<arc","<dao","<daodesc","<daogrp","<daoloc","<extptr","<extptrloc","<extref","<extrefloc",
"<linkgrp","<ptr","<ptrgrp","<ptrloc","<ref","<refloc","<resource",
"</author>","</change>","</creation>","</descrules>","</ead>","</eadgrp>","</eadheader>",
"</eadid>","</edition>","</editionstmt>","</filedesc>","</frontmatter>","</langusage>",
"</notestmt>","</profiledesc>","</publicationstmt>","</publisher>","</revisiondesc>",
"</seriesstmt>","</sponsor>","</subtitle>","</titleproper>","</titlestmt>","</archdesc>",
"</archdescgrp>","</c>","</c01>","</c02>","</c03>","</c04>","</c05>","</c06>","</c07>","</c08>",
"</c09>","</c10>","</c11>","</c12>","</controlaccess>","</did>","</dsc>","</dscgrp>","</abstract>","</accessrestrict>","</accruals>","</acqinfo>","</altformavail>","</appraisal>","</archref>","</arrangement>","</bibliography>","</bibref>","</bioghist>","</container>","</custodhist>","</date>","</dimensions>","</extent>","</fileplan>","</langmaterial>","</legalstatus>","</materialspec>","</odd>","</originalsloc>","</origination>","</otherfindaid>","</physdesc>","</physfacet>","</physloc>","</phystech>","</prefercite>","</processinfo>","</relatedmaterial>","</repository>","</scopecontent>","</separatedmaterial>","</unitdate>","</unitid>","</unittitle>","</userestrict>",
"</corpname>","</famname>","</function>","</genreform>","</geogname>","</language>","</name>",
"</occupation>","</persname>","</subject>","</title>","</abbr>","</address>","</addressline>",
"</bibseries>","</blockquote>","</chronitem>","</chronlist>","</colspec>","</defitem>",
"</descgrp>","</div>","</emph>","</entry>","</event>","</eventgrp>","</expan>","</head>",
"</head01>","</head02>","</imprint>","</index>","</indexentry>","</item>","</label>","</lb>",
"</list>","</listhead>","</namegrp>","</note>","</num>","</p>","</row>","</runner>","</subarea>",
"</table>","</tbody>","</tgroup>","</thead>","</titlepage>","</arc>","</dao>","</daodesc>",
"</daogrp>","</daoloc>","</extptr>","</extptrloc>","</extref>","</extrefloc>","</linkgrp>",
"</ptr>","</ptrgrp>","</ptrloc>","</ref>","</refloc>","</resource>","COUNTRYENCODING",
"DATEENCODING","FINDAIDSTATUS","IDENTIFIER","LANGENCODING","RELATEDENCODING","REPOSITORYENCODING",
"SCRIPTENCODING","URL","URN","ABBR","ALTHEAD","ALTRENDER","AUDIENCE","CERTAINTY","CONTINUATION",
"COUNTRYCODE","DATECHAR","ENCODINGANALOG","EXPAN","LABEL","LEVEL","MAINAGENCYCODE","MARK",
"NUMERATION","OTHERLEVEL","OTHERTYPE","PLACEMENT","PUBLICID","RENDER","REPOSITORYCODE","UNIT",
"XMLNS","AUTHFILENUMBER","CALENDAR","ERA","LANGCODE","NORMAL","ROLE","RULES","SCRIPTCODE",
"SOURCE","TYPECTUATE","ARCROLE","ENTITYREF","FROM","HREF","ID","LINKTYPE","PARENT","SHOW",
"TARGET","TITLE","TO","XPOINTER","ALIGN","CHAR","CHAROFF","COLNAME","COLNUM","COLS","COLSEP",
"COLWIDTH","FRAME","MOREROWS","NAMEEND","NAMEST","PGWIDE","ROWSEP","TPATTERN","VALIGN",
"countryencoding","dateencoding","findaidstatus","identifier","langencoding","relatedencoding",
"repositoryencoding","scriptencoding","url","urn","abbr","althead","altrender","audience",
"certainty","continuation","countrycode","datechar","encodinganalog","expan","label","level",
"mainagencycode","mark","numeration","otherlevel","othertype","placement","publicid","render",
"repositorycode","unit","xmlns","authfilenumber","calendar","era","langcode","normal","role",
"rules","scriptcode","source","typectuate","arcrole","entityref","from","href","id","linktype",
"parent","show","target","title","to","xpointer","align","char","charoff","colname","colnum",
"cols","colsep","colwidth","frame","morerows","nameend","namest","pgwide","rowsep","tpattern",
"valign"]
# Add special tokens to the tokenizer
tokenizer.add_special_tokens({'additional_special_tokens': special_tokens})
model.resize_token_embeddings(len(tokenizer))
Nouvelle tokenisation
['[CLS]', '<ead', 'id', '=', '"', 'n', '##65', '##53', '##7', '"', '>', '<eadheader', 'countryencoding', '=', '"', 'iso', '##31', '##66', '-', '1', '"', 'dateencoding', '=', '"', 'iso', '##86', '##01', '"', 'findaidstatus', '=', '"', 'pro', '##vis', '##oire', '"', 'langencoding', '=', '"', 'iso', '##6', '##39', '-', '2', '##b', '"', 'relatedencoding', '=', '"', 'dc', '"', 'repositoryencoding', '=', '"', 'iso', '##15', '##51', '##1', '"', 'scriptencoding', '=', '"', 'iso', '##15', '##9', '##24', '"', '>', '<eadid', 'countrycode', '=', '"', 'fr', '"', 'encodinganalog', '=', '"', 'identifier', '"', 'identifier', '=', '"', 'fr', '##c', '##gm', '##b', '##pf', '-', '000', '##00', '##51', '##0', '##2', '-', '01', '##a', '"', 'mainagencycode', '=', '"', '75', '##11', '##31', '##01', '##5', '"', '>', 'fr', '##c', '##gm', '##b', '##pf', '-', '000', '##00', '##51', '##0', '##2', '-', '01', '##a', '.', 'xml', '</eadid>', '<filedesc>', '<titlestmt>', '<titleproper', 'encodinganalog', '=', '"', 'title', '"', '>', 'catalogue', 'general', 'des', 'man', '##us', '##cr', '##its', 'des', 'bi', '##bl', '##iot', '##he', '##ques', 'pub', '##li', '##ques', 'de', 'france', '.', 'depot', '##s', 'd', "'", 'archives', 'depart', '##ement', '##ales', ',', 'communal', '##es', 'et', 'hospital', '##iere', '##s', '.', 'archives', 'communal', '##es', '</titleproper>', '<author', 'encodinganalog', '=', '"', 'cr', '##ea', 'to', 'r', '"', '>', 'isn', '##ard', ',', 'ab', '##be', 'guillaume', ',', 'mori', '##s', ',', 'blanca', '##rd', ',', 'au', '##be', '##pin', ',', 'au', 'to', 'rd', '##e', ',', 'lac', '##roi', '##x', ',', 'mer', '##let', ',', 'bond', '##ura', '##nd', ',', 'ro', '##sch', '##ach', ',', 'par', '##fo', '##uru', ',', 'go', '##uge', '##t', ',', 'de', 'la', 'co', '##ur', 'de', 'la', 'pi', '##jar', '##dier', '##e', ',', 'ha', '##r', '##vu', '##t', ',', 'li', '##bo', '##is', ',', 'comb', '##ari', '##eu', ',', 'andre', ',', 'dem', '##ais', '##on', ',', 'collin', ',', 'jacob', ',', 'co', '##ua', '##rd', '-', 'lu', '##ys', '[SEP]']
Réduction de dimension des embeddings
Par ailleurs, le modèle d’embeddings msmarco-distilbert-base-v4 choisi génère nativement des vecteurs d’assez grande dimensions (768), ce qui à l’usage - dans l’étape de récupération à partir de la requête depuis la base de données Chroma - augmente significativement le temps de latence de la réponse (les calculs de proximité étant d’autant plus lourds que les dimensions des vecteurs sont élevées). Un des moyens pour diminuer l’espace de stockage des vecteurs et optimiser les calculs de distance consiste donc en outre à appliquer aux embeddings produits une technique de réduction de leur dimension avant leur stockage dans Chroma telle que la méthode d’analyse en composantes principales (PCA).
On obtient ainsi un nouveau modèle d'embeddings spécifiquement dédié à l'encodage de code en EAD/XML et optimisé avec un modèle PCA qui diminue la dimension des vecteurs à 128. Ce modèle personnalisé peut alors être publié sur HuggingFace : Geraldine/msmarco-distilbert-base-v4-ead
Inférence
Après toutes ces étapes, on peut donc vérifier l'efficacité d'un système de RAG dont :
- l'étape d'encodage de portions d'EAD/XML en vecteurs stockés dans une base de données Chroma et la partie retriever du workflow s'appuient sur le modèle d'embeddings précédemment customisé ;
- la partie inférence repose sur un LLM qui parvienne à généraliser depuis les exemples en EAD/XML et soit capable de générer un EAD compliant à partir d’instructions spécifiques.
Avec un prompt tel que celui-çi
Generate a compliant EAD template based on these informations : the archival fund to be described is the Fonds Martin Vetterli (which was the president of the EPFL from 2017 to 2024). The fund has been created in 2023 and it is composed of two series : one serie covers pieces of personal correspondance received by Martin Veretti and the other serie covers personal notes of Martin Vetterli about his works as researcher. The author of the inventory is the EPFL librar
Voici le résultat obtenu
<?xml version="1.0" encoding="UTF-8"?>
<ead xmlns="urn:isbn:1-931666-22-9">
<eadheader>
<eadid countrycode="CH">CH-EPFL-Fonds Martin Vetterli</eadid>
<filedesc>
<titlestmt>
<titleproper>Fonds Martin Vetterli</titleproper>
<author>EPFL Library</author>
</titlestmt>
<publicationstmt>
<date>2023</date>
</publicationstmt>
</filedesc>
</eadheader>
<archdesc level="fonds">
<did>
<unittitle>Fonds Martin Vetterli</unittitle>
<unitid>CH-EPFL-Fonds Martin Vetterli</unitid>
<unitdate calendar="gregorian" era="ce" normal="2023">2023</unitdate>
<physdesc><extent>2 series</extent></physdesc>
</did>
<bioghist>
<p>Martin Vetterli was the president of the EPFL from 2017 to 2024.</p>
</bioghist>
<dsc>
<c id="correspondance" level="series">
<did>
<unittitle>Personal Correspondence</unittitle>
<unitdate calendar="gregorian" era="ce" normal="2017-2024">2017-2024</unitdate>
</did>
<scopecontent>
<p>This series contains personal correspondence received by Martin Vetterli during his presidency of the EPFL.</p>
</scopecontent>
</c>
<c id="notes" level="series">
<did>
<unittitle>Personal Notes</unittitle>
<unitdate calendar="gregorian" era="ce" normal="2017-2024">2017-2024</unitdate>
</did>
<scopecontent>
<p>This series contains personal notes of Martin Vetterli about his works as a researcher.</p>
</scopecontent>
</c>
</dsc>
<accessrestrict>
<p>Access to the fonds is restricted. Please contact the EPFL Library for more information.</p>
</accessrestrict>
</archdesc>
</ead>
Vous pouvez tester l'application de RAG ici :
https://huggingface.co/spaces/Geraldine/comparative-ead-generation
Pour aller plus loin
Afin d'améliorer qualitativement les inventaires EAD/XML produits, on peut intégrer l’approche RAG dans un système d’agent IA capable de raisonnement et augmenté d'outils complémentaires (l'accès au web par exemple), ce qui permettrait d'enrichir le processus génératif de contenus par la récupération d’informations en temps réel sur le web. Ainsi par exemple, en enrichissant le processus génératif de contenus par la récupération d’informations en temps réel sur le web (Wikipedia en l'occurrence), le même prompt génère une description comportant des éléments biographiques du type :
<?xml version="1.0" encoding="UTF-8"?>
<ead xmlns="urn:isbn:1-931666-22-9">
<eadheader>
<eadid countrycode="CH">CH-EPFL-Fonds Martin Vetterli</eadid>
<filedesc>
<titlestmt>
<titleproper>Fonds Martin Vetterli</titleproper>
</titlestmt>
<publicationstmt>
<publisher>EPFL Library</publisher>
<date>2023</date>
</publicationstmt>
</filedesc>
</eadheader>
<archdesc level="fonds">
<did>
<unittitle>Fonds Martin Vetterli</unittitle>
<unitid countrycode="CH">CH-EPFL-Fonds Martin Vetterli</unitid>
<unitdate type="inclusive" normal="2017-2024">2017-2024</unitdate>
<physdesc>
<physfacet type="extent">2 series</physfacet>
</physdesc>
</did>
<bioghist>
<p>Martin Vetterli, born on October 4, 1957, in Solothurn, Switzerland, is a Swiss engineer who has contributed to research in the field of digital signal processing.</p>
<p>He is known for his work on wavelets and has contributed to other fields such as sampling, computational complexity, signal processing for communications, digital video processing, and joint source-channel coding.</p>
<p>He has been the president of the École polytechnique fédérale de Lausanne (EPFL) since January 1, 2017.</p>
</bioghist>
<scopecontent>
<p>The fonds consists of two series: one series covers personal correspondence received by Martin Vetterli, and the other series covers personal notes of Martin Vetterli about his works as a researcher.</p>
</scopecontent>
<arrangement>
<p>The fonds is arranged into two series.</p>
</arrangement>
<controlaccess>
<persname>Vetterli, Martin</persname>
</controlaccess>
</archdesc>
<dsc>
<c level="series">
<did>
<unittitle>Personal correspondence</unittitle>
<unitid>Series 1</unitid>
</did>
<scopecontent>
<p>This series consists of personal correspondence received by Martin Vetterli.</p>
</scopecontent>
</c>
<c level="series">
<did>
<unittitle>Personal notes</unittitle>
<unitid>Series 2</unitid>
</did>
<scopecontent>
<p>This series consists of personal notes of Martin Vetterli about his works as a researcher.</p>
</scopecontent>
</c>
</dsc>
</ead>
