Indexation RAMEAU assistée par IA : le décryptage du Labo

À l’issue d’une expérimentation conduite entre octobre 2024 et janvier 2025, l’Abes a publié le rapport « Indexation  RAMEAU assistée par IA ». Retour en détail sur la façon dont fonctionne cette IA prometteuse.

Lire aussi le Billet Fil’Abes : L’indexation RAMEAU assistée par IA : retour sur une expérimentation prometteuse

Contexte : du projet Labo à l’expérimentation in vivo

En 2023, le Labo de l’Abes a mené un projet dont l’objectif était d’évaluer la faisabilité d’une indexation RAMEAU de qualité satisfaisante au moyen d’une intelligence artificielle (IA), à partir du titre et du résumé d’une monographie en français. Encore fallait-il définir ce qu’est une indexation « satisfaisante », question délicate….

Les particularités de cette tâche nous ont tout d’abord conduits à adopter plusieurs stratégies d’évaluation complémentaires :

  1. Évaluation des indexations machines avec les métriques classiques adaptées à la classification multilabel (= Sudoc comme la vérité).
  2. Évaluation des indexations machines en les comparant à plusieurs indexations humaines, et pas seulement à l’indexation humaine du Sudoc (= pluralité des vérités). Pour ce faire, nous avons demandé à 6 collègues de l’Abes (nommés les “réindexeurs”) d’indexer une centaine de documents déjà indexés dans le Sudoc, sélectionnés de manière aléatoire.
  3. Évaluation qualitative de toutes les indexations, humaines et machines, au moyen d’une grille de notation (= notation comme la vérité). Selon cette grille, noter une indexation, c’était, d’une part, noter chaque sujet retenu pour une notice donnée (on notait l’exactitude et la spécificité de chaque sujet) et, d’autre part, noter le bloc des sujets retenus pour une notice donnée (on notait la complétude et la redondance de chaque bloc).

Les évaluations menées nous ont permis de conclure que l’indexation RAMEAU par une IA est aujourd’hui réalisable en garantissant un niveau de qualité suffisant et un temps de traitement satisfaisant. Cependant, du fait de la grande difficulté à évaluer la qualité d’une indexation et de la nouveauté que présente l’assistance d’une IA, l’Abes a souhaité prolonger ce travail de recherche & développement interne sous la forme d’une expérimentation in vivo, en situation réelle, c’est-à-dire dans WinIBW, l’environnement de catalogage dans le Sudoc.

Dans le cadre de cette expérimentation, il s’agissait d’évaluer à la fois la qualité ressentie du service de suggestion d’indexations et la qualité ressentie de l’intégration de ce service dans l’outil de travail quotidien. L’évaluation de ces deux dimensions a permis de mesurer la satisfaction globale des collègues ayant participé aux tests et d’envisager les améliorations pertinentes. Le rapport final publié récemment décrit les modalités et les conclusions de cette expérimentation.

Dans ce billet, nous nous concentrerons sur la solution technique mise au point et retenue par le Labo de l’Abes pour rendre possible ce nouveau service d’indexation RAMEAU assisté par l’IA. De fait, celui-ci prend la forme d’un web service classique : la requête est une URL qui prend en paramètre le titre+résumé d’un document (outre d’autres paramètres) et renvoie des suggestions sous une forme structurée en JSON. Les détails de ce web service seront présentés plus loin, mais nous souhaitons avant tout présenter de manière simple la solution utilisée pour calculer les concepts RAMEAU à renvoyer, solution basée sur l’état de l’art récent en IA. Cette solution est implémentée dans ce notebook de démonstration.

L’indexation comme recherche des bons concepts

La tâche consiste à trouver dans le vocabulaire RAMEAU les concepts qui représentent le mieux ce dont parle un document. Pour ce faire, il faut trouver une manière de comparer le contenu du document et l’ensemble des concepts RAMEAU.

Mais comment représenter le contenu de ce document ? Et comment représenter un concept RAMEAU ? Et comment les comparer ?

Soit un document à indexer. Supposons que le contenu de ce document est correctement représenté par son titre et son résumé, quand ce dernier existe (pour faire court, on parlera ici de « titre+résumé ».). On peut imaginer d’autres manières de faire, plus ou moins pratiques, plus ou moins efficaces : exploiter tout le texte du document ; exploiter seulement son introduction et sa conclusion ; exploiter sa table des matières ; exploiter un résumé automatique. Dans l’approche retenue, c’est le “titre+résumé” qui est considéré comme le reflet du contenu du document, ce dont il parle.

Côté RAMEAU, il faut également trouver une manière de représenter le « sens » de chaque concept. Il pourrait s’agir de son libellé principal (ex : Élite (sciences sociales)), ou de la liste de tous ses libellés : « Élite (sciences sociales) », « Élites (sciences sociales) », « Establishment », « Haute société », « Notables », « Société, Haute »… Dans l’approche retenue, chaque concept RAMEAU est représenté par l’ensemble des notices bibliographiques Sudoc qui lui sont liées. Plus précisément, dans chaque notice bibliographique liée, on s’intéresse à son titre, et à son résumé s’il existe.

L’indexation sujet revient désormais à comparer deux choses qui semblent comparables :

  • D’un côté, le “titre+résumé” d’une notice bibliographique à indexer
  • De l’autre, l’ensemble des “titres+résumés” des notices bibliographiques liées à un concept RAMEAU

On comprend aisément que cette comparaison doit être faite autant de fois qu’il y a de concepts RAMEAU : ainsi, pour chaque document à indexer, il y a donc des dizaines de milliers de comparaison à effectuer, pour trouver les concepts les plus « ressemblants » au “titre+résumé” de la notice à indexer, ce qui peut prendre un certain temps…

On sait désormais ce qu’on veut comparer, mais comment les comparer ? Que signifie « ressemblant » ici ? On pourrait par exemple comparer les mots présents de chaque côté, si possible en prenant en compte la fréquence des mots dans toute la base et dans les “titres+résumés” de chaque notice bibliographique (avec TF-IDF). Mais bien souvent, le libellé d’un concept RAMEAU pertinent n’est pas explicitement présent dans le “titre+résumé” du document à indexer. Par exemple, le concept « Classes dirigeantes » semble bien convenir pour un document dont le titre (Les sommets de l’État : essai sur l’élite du pouvoir en France) ne contient pas ce terme.

L’indexation comme recherche sémantique des bons concepts

Or, dans le domaine de l’intelligence artificielle, la notion d’embedding permet justement de représenter un mot, une phrase ou un texte en prenant en compte  son « sens », et pas seulement   sa forme linguistique. Ainsi, le terme « allocution » sera calculé comme plus proche de « discours » que d' »allocation ».

Dans notre cas, il s’agit de calculer des embeddings de phrases (sentence embedding). Il existe différents modèles pour le faire, plus ou moins lourds et adaptés à tel ou tel contexte. Nous avons choisi d’en retenir plusieurs, ce qui permet de croiser ensuite les résultats, qui s’avèrent souvent complémentaires.

C’est ainsi que nous pouvons calculer l’embedding de n’importe quelle notice bibliographique (ou plutôt son “titre+résumé”). Précisons qu’en indexant, nous ne cherchons pas à comparer deux notices bibliographiques via leurs embeddings) mais à comparer un embedding de notice bibliographique à l’ensemble des embeddings des notices bibliographiques liées à un concept RAMEAU donné. Comment représenter cet ensemble d’embeddings sous la forme d’un seul ? Autrement dit, comment agréger les embeddings de plusieurs notices ?

Nous avons retenu la solution la plus simple : la moyenne. L’embedding d’un concept RAMEAU est donc la moyenne des embeddings des “titres+résumés” des notices bibliographiques qui lui sont liées. Nous aurions pu retenir d’autres méthodes d’agrégation, plus complexes, et possiblement plus pertinentes (ex : moyenne pondérée en fonction de la fréquence des mots ou d’un autre facteur).

L’indexation sujet donc revient désormais à comparer deux embeddings, exprimés sous forme numérique (des vecteurs) :

  • D’un côté, l’embedding du “titre+résumé” d’une notice bibliographique à indexer
  • De l’autre, l’embedding d’un concept RAMEAU (calculé comme nous venons de l’indiquer)

Voici un exemple (issu du notebook de démonstration)  :

text = "Les sommets de l'État : essai sur l'élite du pouvoir en France"
predict(text, 10)

027322610#Hauts_fonctionnaires
027229629#Bureaucratie
027223345#Classes_dirigeantes
027994775#Institutions_politiques
027792102#Aspect_politique
027225224#Élite_(sciences_sociales)
027365581#Pouvoir_(sciences_sociales)
02726470X#Histoire
027728110#Politique_et_gouvernement
027311163#Caractère_national_français

Ces suggestions de concepts RAMEAU ont été générées par une petite base de vecteurs RAMEAU calculée à partir de 10 000 notices Sudoc (livres), grâce au modèle d’embeddings intfloat/multilingual-e5-large.

Sur cet exemple, malgré la taille du corpus bibliographique et l’absence de résumé, on peut constater que les suggestions sont de très bonne qualité. On observe également des concepts moins pertinents, trop généraux (Histoire) ou « à côté de la plaque » (Caractère national français). Quoique…

En l’état, cette liste de concepts s’avère donc être une très bonne aide à la décision pour l’indexeur, mais encore insuffisante pour une indexation automatique, sans contrôle humain.

Dans cette base de démonstration, on ne trouve que 8 804 concepts RAMEAU, présents dans les 10 000 notices bibliographiques. Les autres concepts RAMEAU ne pouvaient donc pas être suggérés par ce modèle. Il a donc fallu élargir le corpus de notices bibliographiques à exploiter, pour espérer prendre en compte le maximum de concepts RAMEAU.

Dans notre expérimentation (fin 2025), le corpus contenait 400 000 notices de livres. On pourrait inclure des centaines de milliers de thèses pour augmenter encore la couverture de RAMEAU (et inclure des concepts pointus et peu utilisés). On entrevoit la limite de notre approche : même si on peut imaginer des artifices pour dépasser cette limite, un tout nouveau concept RAMEAU, pas encore utilisé dans une notice bibliographique, ne sera jamais proposé.

Plusieurs modèles d’embeddings, jugés par un grand modèle de langage (LLM)

Nous aurions pu décider de ne conserver que le meilleur modèle. Nos évaluations nous ont permis d’observer que les résultats des différents modèles sont souvent complémentaires : les oublis des uns peuvent être compensés par les suggestions des autres. Il est donc intéressant de conserver plusieurs modèles et d’agréger leurs suggestions.

Ainsi, outre les résultats bruts générés par les différents modèles retenus, le web service d’indexation renvoie plusieurs modes d’agrégation de ces résultats :

  • « union » : on cumule toutes les suggestions
  • « intersection » : on ne garde que les suggestions communes à tous les modèles
  • « intersection2best » : on ne garde que les suggestions communes à au moins deux modèles parmi les meilleurs modèles
  • « llm » (ou « llm_bad ») : on demande à un LLM d’identifier les suggestions qui lui semblent erronées et on les exclut de la liste renvoyée par ce mode d’agrégation
  • « llm_good » :  on demande à un LLM d’identifier les suggestions qui lui semblent adéquates
  • « llm_scores » : on demande à un LLM de donner un indice de fiabilité pour chacune des suggestions

Emballer l’IA dans un web service

L’agent (humain ou machine) qui reçoit les résultats du web service possède une grande marge de liberté. Il peut choisir de ne conserver que les résultats du meilleur modèle, ou bien de ceux de l’intersection, ou encore ceux de « llm_good », ou encore les résultats de « llm_score » qui dépassent un certain seuil de confiance (s’il a confiance en eux…). Il peut enfin inventer sa propre méthode de sélection, à partir de la réponse du web service.

Cependant, un grand choix suscite parfois de l’embarras. Le service propose des sorties prémâchées, plus simples à exploiter que la sortie brute (en JSON) :

  • Une sortie UNIMARC classique (en texte ou en HTML)
  • Une sortie UNIMARC affichant les relations hiérarchiques entre les concepts suggérés
  • Une page HTML interactive pour affiner et construire une indexation riche, par drag and drop (expérimental)

Le web service prévoit d’autres paramètres :

  • Nombre de suggestions par modèle
  • Nom du vocabulaire (aujourd’hui RAMEAU, mais demain…)
  • Identifiant du document

Terminons cette démonstration par un exemple complet :

Notice Sudoc : https://www.sudoc.fr/000308838

Titre :  Les sommets de l’État : essai sur l’élite du pouvoir en France

Résumé : Du XIXe siècle à nos jours, l’Etat « fort » à la française a connu bien des vicissitudes que l’on se propose de retracer ici. Institution prestigieuse attirant vers elle les élites de la nation issues des Grandes Ecoles, l’Etat organise les activités les plus diverses grâce à son armée de fonctionnaires fidèles à la logique de leur rôle et aux valeurs du service public. Les élites politiques et celles de l’Etat en viennent alors souvent à se confondre, d’autant que l’état demeure fermé aux intrus du monde des affaires, des professions libérales ou des milieux syndicaux. La République des fonctionnaires étend son contrôle loin dans la société à travers les entreprises publiques, ou encore par le biais du pantouflage. Cet Etat « fort » n’en rencontre pas moins la vive hostilité des élites issues des partis de masse ou des notables de province solidement attachés à leurs fiefs ; le mouvement ouvrier et, davantage encore, les milieux économiques dominants récusent aussi sa légitimité au nom de leurs valeurs propres. En dépit de ces refus, en France, l’Etat est demeuré le lieu de régulation de la vie sociale ou culturelle. De nos jours pourtant, après les diverses alternances, de nouveaux processus de circulation des élites se profilent, estompant peu à peu les frontières autrefois si nettement défendues de l’Etat.

Modèles appelés : victor3_chain, victor1_concept, victor2

Agrégations : toutes

Nombre de résultats par modèle : 6

{
  "DocumentID": "https://www.sudoc.fr/000308838",
  "PredictionByModel": {
    "victor3_chain": {
      "Result": [
        {
          "label": "Élite (sciences sociales)",
          "id": "027225224",
          "score": 0.9189762967389044
        },
        {
          "label": "Classes dirigeantes",
          "id": "027223345",
          "score": 0.9186880052734565
        },
        {
          "label": "Monarchie",
          "id": "050124277",
          "score": 0.9074089154291344
        },
        {
          "label": "Pouvoir (sciences sociales)",
          "id": "027365581",
          "score": 0.9068471643349856
        },
        {
          "label": "Hauts fonctionnaires",
          "id": "027322610",
          "score": 0.906553947770748
        },
        {
          "label": "Élite (sciences sociales)--Histoire",
          "id": "027225224--02726470X",
          "score": 0.9064290266314496
        }
      ],
      "ResponseTime": "0.41 secondes"
    },
    "victor1_concept": {
      "Result": [
        {
          "label": "Hauts fonctionnaires",
          "id": "027322610",
          "score": 0.7638581153626636
        },
        {
          "label": "État",
          "id": "027297942",
          "score": 0.7440623350425135
        },
        {
          "label": "Fédéralisme",
          "id": "027826538",
          "score": 0.737714937615626
        },
        {
          "label": "Centralisation administrative",
          "id": "027465853",
          "score": 0.7310664369558111
        },
        {
          "label": "Armée de métier",
          "id": "030768268",
          "score": 0.7291465091067392
        },
        {
          "label": "Service militaire obligatoire",
          "id": "050549928",
          "score": 0.7253427565342923
        }
      ],
      "ResponseTime": "0.09 secondes"
    },
    "victor2": {
      "Result": [
        {
          "label": "Classes dirigeantes",
          "id": "027223345",
          "score": 0.6716704033357916
        },
        {
          "label": "Hauts fonctionnaires",
          "id": "027322610",
          "score": 0.6692576043596348
        },
        {
          "label": "Élite (sciences sociales)",
          "id": "027225224",
          "score": 0.6563994626198374
        },
        {
          "label": "Pouvoir (sciences sociales)",
          "id": "027365581",
          "score": 0.6537038100972423
        },
        {
          "label": "Pouvoir exécutif",
          "id": "027836622",
          "score": 0.6521094623337023
        },
        {
          "label": "Forces armées françaises",
          "id": "028235460",
          "score": 0.6428029516927859
        }
      ],
      "ResponseTime": "0.14 secondes"
    }
  },
  "PredictionByAggregation": {
    "union": [
      {
        "label": "Centralisation administrative",
        "id": "027465853"
      },
      {
        "label": "État",
        "id": "027297942"
      },
      {
        "label": "Forces armées françaises",
        "id": "028235460"
      },
      {
        "label": "Fédéralisme",
        "id": "027826538"
      },
      {
        "label": "Service militaire obligatoire",
        "id": "050549928"
      },
      {
        "label": "Pouvoir exécutif",
        "id": "027836622"
      },
      {
        "label": "Classes dirigeantes",
        "id": "027223345"
      },
      {
        "label": "Armée de métier",
        "id": "030768268"
      },
      {
        "label": "Monarchie",
        "id": "050124277"
      },
      {
        "label": "Hauts fonctionnaires",
        "id": "027322610"
      },
      {
        "label": "Élite (sciences sociales)",
        "id": "027225224"
      },
      {
        "label": "Élite (sciences sociales)--Histoire",
        "id": "027225224--02726470X"
      },
      {
        "label": "Pouvoir (sciences sociales)",
        "id": "027365581"
      }
    ],
    "intersection": [
      {
        "label": "Hauts fonctionnaires",
        "id": "027322610"
      }
    ],
    "intersection2models": [
      {
        "label": "Hauts fonctionnaires",
        "id": "027322610"
      },
      {
        "label": "Élite (sciences sociales)",
        "id": "027225224"
      },
      {
        "label": "Pouvoir (sciences sociales)",
        "id": "027365581"
      },
      {
        "label": "Classes dirigeantes",
        "id": "027223345"
      }
    ],
    "intersection2Models1Best": [
      {
        "label": "Hauts fonctionnaires",
        "id": "027322610"
      },
      {
        "label": "Élite (sciences sociales)",
        "id": "027225224"
      },
      {
        "label": "Pouvoir (sciences sociales)",
        "id": "027365581"
      },
      {
        "label": "Classes dirigeantes",
        "id": "027223345"
      }
    ],
    "llm": [
      {
        "label": "Centralisation administrative",
        "id": "027465853"
      },
      {
        "label": "État",
        "id": "027297942"
      },
      {
        "label": "Classes dirigeantes",
        "id": "027223345"
      },
      {
        "label": "Hauts fonctionnaires",
        "id": "027322610"
      },
      {
        "label": "Élite (sciences sociales)",
        "id": "027225224"
      },
      {
        "label": "Élite (sciences sociales)--Histoire",
        "id": "027225224--02726470X"
      },
      {
        "label": "Pouvoir (sciences sociales)",
        "id": "027365581"
      }
    ],
    "llm_good": [
      {
        "label": "État",
        "id": "027297942"
      },
      {
        "label": "Classes dirigeantes",
        "id": "027223345"
      },
      {
        "label": "Hauts fonctionnaires",
        "id": "027322610"
      },
      {
        "label": "Élite (sciences sociales)",
        "id": "027225224"
      },
      {
        "label": "Pouvoir (sciences sociales)",
        "id": "027365581"
      }
    ],
    "llm_scores": [
      {
        "label": "État",
        "score": 1,
        "id": "027297942"
      },
      {
        "label": "Hauts fonctionnaires",
        "score": 0.95,
        "id": "027322610"
      },
      {
        "label": "Classes dirigeantes",
        "score": 0.9,
        "id": "027223345"
      },
      {
        "label": "Élite (sciences sociales)",
        "score": 0.9,
        "id": "027225224"
      },
      {
        "label": "Centralisation administrative",
        "score": 0.8,
        "id": "027465853"
      },
      {
        "label": "Pouvoir (sciences sociales)",
        "score": 0.8,
        "id": "027365581"
      },
      {
        "label": "Élite (sciences sociales)--Histoire",
        "score": 0.7,
        "id": "027225224--02726470X"
      },
      {
        "label": "Fédéralisme",
        "score": 0.1,
        "id": "027826538"
      },
      {
        "label": "Service militaire obligatoire",
        "score": 0.1,
        "id": "050549928"
      },
      {
        "label": "Armée de métier",
        "score": 0.1,
        "id": "030768268"
      },
      {
        "label": "Monarchie",
        "score": 0.05,
        "id": "050124277"
      }
    ]
  }
}

Laisser un commentaire

Aller au contenu principal