Qu'est-ce que le RAG ?

Le RAG (Retrieval Augmented Generation) est probablement à ce jour le use-case d’inférence sur des LLM le plus populaire. Aussi appelé “In-context learning”, ce dispositif de requêtage sur un LLM a pour but d’augmenter la précision et la pertinence des réponses du modèle en palliant aux limitations “natives” d’un modèle de langage : domaine de connaissances hors de son corpus d’apprentissage, corpus statique constitué à un instant T, hallucinations... . Pour ce faire, il s'agit de combiner le pouvoir génératif des modèles de langage avec la capacité à récupérer des informations pertinentes issues de sources de données externes, autrement dit d’exploiter les capacités de calculs appliquées au langage naturel des LLMs sur des documents externes choisis par l'utilisateur.

Le fine-tuning du modèle est une autre option possible mais un peu plus difficile à mettre en oeuvre, dans la mesure où elle consiste à “sur-entraîner” le LLM avec un dataset significatif et correctement structuré, ce qui implique :

  1. de créer le dataset d’instructions en question ;
  2. de recourir à un processus potentiellement long et coûteux d’apprentissage consistant, par exemple avec la méthode la plus répandu QLoRA, à agir sur les poids de la dernière couche du réseau de neurones du modèle.

Le fine-tuning touche donc à l’architecture même du modèle, tandis que le RAG n’agit que sur le prompt qui est envoyé au modèle sans modifier ses paramètres.

Pour résumer :

  • le RAG implique de stocker l’information complémentaire sous forme d’embeddings (en général dans une base de données vectorielle) puis de pré-selectionner les contenus pertinents qui vont être intégrés au prompt via une recherche préalable de similarité
  • le fine-tuning consiste à modifier les poids de la dernière couche du réseau Transformers en introduisant avant même la phase de prompt une étape complémentaire d’apprentissage supervisé sur un dataset de QA ou d'instructions.

L'éco-système autour du RAG connaît donc naturellement une forte dynamique puisque c’est une technique peu coûteuse d’exploitation des performances langagières d’un LLM pour développer des applications et des agents conversationnels sur ses propres contenus.

Les étapes du RAG

Le RAG consiste ainsi à intégrer des données externes qui ne font pas partie du corpus d’apprentissage du LLM dans le processus de génération de contenu. Pour cela, la démarche de base est assez simple : tandis que l’inférence classique consiste à convertir une invite en embeddings et à la projeter directement dans l’espace vectoriel du modèle, l’inférence via du RAG se décline en étapes supplémentaires :

  1. Data loading : la récupération des données là où elles se trouvent -- qu’il s’agisse de fichiers texte, de fichiers PDF, d’un autre site Web, d’une base de données ou d’une API -- pour constituer le corpus personnalisé qui va venir compléter les données d'entraînement du LLM
  2. Indexing & embedding & storing : le corpus additionnel (les données contextuelles de l’utilisateur) est tout d’abord découpé en une suite de séquences de mots, chacune de ces séquences est ensuite convertie en vecteurs sémantiques avec un modèle d’embeddings, puis le tout est enfin stocké dans un index ou une base de données vectorielle (un vector store)
  3. Query & retriever : le prompt de l’utilisateur, transformé en embedings avec le même modèle que l’étape 2, n’est pas envoyé directement au LLM mais d’abord vers le vector store afin d’y opérer des calculs de similarité sur les vecteurs du contexte et d'en extraire les segments les plus proches (considérés comme les plus pertinents, en accord avec le principe selon lequel des concepts similaires ont des embeddings similaires )
  4. Content generation : au final, la prompt initial de l’utilisateur et les segments du contexte retenus en tant que donnnées sémantiques les plus pertinentes sont plugés dans un même système d’instructions qui est alors envoyé au LLM, de manière à ce le contenu généré (ie les calculs de distance réalisés dans l’espace vectoriel du LLM) prenne en compte les informations contextuelles complémentaires préalablement sélectionnées.

On comprends donc pourquoi il faut être prudent en faisant du RAG sur des documents privés ou sensibles ou les deux en recourant à un LLM hebergé sur un serveur distant par un fournisseur X, car même sans uploader directement des documents dans une interface en ligne et même dans le cas où les documents et les embeddings correspondants sont stockés localement, les données sont tout de même postées vers le LLM (et en plus de manière transparente pour l'utilisateur).


Le RAG pas à pas

Préparation de l'environnement, interfacages avec les modèles (avec Langchain)

# pip install langchain langchain-community chromadb langchain-chroma

from langchain_community.embeddings import HuggingFaceInferenceAPIEmbeddings
from langchain_community.llms import HuggingFaceEndpoint
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import chromadb
import os

# API Key Huggingface
os.environ["HUGGINGFACEHUB_API_TOKEN"] = <your_hf_api_key>
os.environ["HF_HUB_DISABLE_IMPLICIT_TOKEN"] = "1"
HF_TOKEN = os.environ.get("HUGGINGFACEHUB_API_TOKEN")

# Modèle d'embeddings
embeddings = HuggingFaceInferenceAPIEmbeddings(
    api_key=HF_TOKEN, model_name="sentence-transformers/all-MiniLM-l6-v2"
)

# LLM
repo_id = "tiiuae/falcon-7b-instruct"
llm = HuggingFaceEndpoint(
    repo_id=repo_id, max_length=128, temperature=0.5, token=HF_TOKEN
)

Chargement, traitement et stockage des données (étapes 1 & 2)

enter image description here Source : https://python.langchain.com/v0.1/docs/use_cases/question_answering/

Les frameworks d'IA sont généralement livrés avec toute une batterie de Document loaders, soit des connecteurs permettant d'ingérer des données quels que soient leurs sources (fichier local, fichier online, page web, base de données...) et leurs formats (.md, .txt, .docx, .pdf, .pptx, .csv...), puis de les formater dans des objets Documents comprenant les données et leurs métadonnées. Voir par exemple pour Langchain ou le LlamaHub de LlamaIndex.

Pour la démo ici, notre source de données additionnelle sera le texte de ce billet sur Punktokomo.

Cas 1 : chargement des données sans connecteur et segmentation du texte

Le contenu textuel est mis en dur dans le code

Voir le texte

text = """
Refonte de theses.fr : éclairage sur les choix informatiques

Conduit selon la méthode SCRUM, le projet de refonte de theses.fr illustre parfaitement les concepts de la politique de développement de l’Abes. Il est l’aboutissement de 19 mois de travail pour l’équipe constituée d’une Product Owner, de cinq développeurs – dont un en prestation externe – et d’un devops.

Fidèle à la résolution de l’Abes qui, depuis 2019, publie les codes sources de ses applications sur Github, le projet est entièrement open source. Ses différents modules sont répartis dans plusieurs dépôts, tous hébergés dans l’organisation Github de l’Abes.

L’interface du site
Un premier dépôt contient le code de l’interface de l’application réalisée avec le framework Nuxt, surcouche au framework VueJs. VueJs a été choisi par les développeurs de l’Abes pour sa courbe d’apprentissage jugée plus rapide que pour ses concurrents React ou Angular.

La surcouche Nuxt assure une meilleure indexation du site par les moteurs de recherche du web, notamment grâce au Server Side Rendering, qui permet de préparer, côté serveur, une partie du code client qui sera exécuté dans le navigateur et ainsi le rendre immédiatement lisible par les moteurs d’indexation. De plus, Nuxt propose et préconfigure par défaut un certain nombre de fonctionnalités indispensables, comme le routage qui fournit les URLs de l’application, la gestion des erreurs ou encore la récupération des données depuis les API.

L’accès à l’interface via différents types de terminaux est également facilité par le framework VueJS : une navigation aisée sur mobile est une des nouveautés du site.

Une attention toute particulière a été portée par les développeurs sur l’accessibilité de l’interface, qui respecte les règles édictées dans le Référentiel général d’amélioration de l’accessibilité (RGAA) : polices appropriées, choix des couleurs, contraste, mise en forme de la page et utilisation de balises ARIA pour introduire la sémantique des éléments dans le code HTML.

Une intégration continue
L’intégration continue du projet est assurée par des actions Github, programmes qui se déclenchent à chaque fois qu’un développeur pousse (publie) du code sur une branche (qui propose une fonctionnalité) du projet : le code est alors compilé et, si la compilation et les tests réussissent, la branche en question peut alors être publiée comme image sur la plateforme Dockerhub. Ces images sont alors disponibles pour déploiement sur nos machines de développement, test ou production. A noter que le code de l’intégration continue est versionné sur le même dépôt que le projet, au plus près de ce dernier pour en faciliter la maintenance.

Les API
Côté back-office, theses.fr est composé de trois API, ensemble de services utilisés par l’interface VueJs mais qui peuvent également être appelés depuis des programmes externes.  Ces API, programmées en Java Spring et documentées selon la norme OpenAPI, sont publiées à cette adresse : https://api.gouv.fr/les-api/api-export-donnees-these

Ces services recouvrent trois thématiques :

La recherche dans les métadonnées : il est possible d’interroger les données en passant directement une chaine de recherche du langage de requête du moteur d’indexation Elastic Search via l’URL. Les réponses sont renvoyées au format JSON.
La diffusion des documents : cette API fournit à la fois les boutons à afficher dans l’interface pour chacune des thèses et les liens avers les documents eux-mêmes, ou des liens vers des ressources externes décrivant les documents, comme les notices du catalogue Sudoc. Les accès aux documents sont contrôlés : il n’est pas possible de visualiser une thèse confidentielle et la récupération d’une thèse sous embargo est soumis à authentification.
L’export des métadonnées : les métadonnées des thèses sont fournies dans des formats BIBTEX et RIS qui permettent d’échanger ou d’intégrer facilement la thèse comme référence bibliographique. Elles sont aussi disponibles en RDF, format du web sémantique qui facilite leur intégration dans le Linked Open Data cloud
Le moteur Elastic Search
Les données sont indexées dans le moteur Elastic Search, le choix s’étant porté sur cet outil à la fois pour sa popularité et sa présence dans la pile logicielle Elastic Search – LogStash – Kibana, déjà installée dans  le système d’information de l’Abes.

Elastic Search assure les fonctionnalités essentielles telles que filtres, agrégations, pondération ou encore calcul de pertinence lors de l’exécution des requêtes tout en maintenant un haut niveau de performance en termes de délai de réponse.

Consulter :  https://collection-numerique.amue.fr/numero-27/13.html

Fédération d’identité
Si les thèses en accès restreint ne sont pas disponibles pour le grand public, leur diffusion étant par exemple limitée par un embargo, elles doivent cependant être accessibles aux membres de l’Enseignement Supérieur et de la Recherche. Donner accès à ces thèses constitue donc une des principales nouveautés du nouveau theses.fr.

L’implémentation de cette fonctionnalité a été réalisée grâce à l’inscription de theses.fr en tant que fournisseur de services dans la fédération d’identité RENATER. L’authentification des utilisateurs est ainsi déléguée à cette fédération d’identité qui s’assurera que toute personne disposant d’un compte chez un fournisseur d’identités pourra accéder aux thèses en accès restreint.

Le système, qui repose sur le protocole SAML2, requiert l’installation et la configuration de briques logicielles : à cette fin, nous avons mis en place un proxy Apache chargé de rediriger les URLs des thèses en accès restreint vers une page demandant à l’utilisateur de choisir son fournisseur d’identité afin de s’authentifier pour pouvoir accéder à la ressource
"""

# Paramétrage du splitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, # nombre maximal de caractères dans une séquence
    chunk_overlap=50, # nombre de caractères devant se chevaucher entre deux morceaux adjacents.
    length_function=len, 
    separators=["\n\n", "\n", " ", ""] ,# séparateurs utilisés (default)
)
# chunk (fractionnement du texte en segments)
splits = text_splitter.split_text(text)
# conversion en format Document
docs = text_splitter.create_documents(splits)

Voir le texte splité

['Refonte de theses.fr : éclairage sur les choix informatiques\n\nConduit selon la méthode SCRUM, le projet de refonte de theses.fr illustre parfaitement les concepts de la politique de développement de l’Abes. Il est l’aboutissement de 19 mois de travail pour l’équipe constituée d’une Product Owner, de cinq développeurs – dont un en prestation externe – et d’un devops.',
 'Fidèle à la résolution de l’Abes qui, depuis 2019, publie les codes sources de ses applications sur Github, le projet est entièrement open source. Ses différents modules sont répartis dans plusieurs dépôts, tous hébergés dans l’organisation Github de l’Abes.',
 'L’interface du site\nUn premier dépôt contient le code de l’interface de l’application réalisée avec le framework Nuxt, surcouche au framework VueJs. VueJs a été choisi par les développeurs de l’Abes pour sa courbe d’apprentissage jugée plus rapide que pour ses concurrents React ou Angular.',
 'La surcouche Nuxt assure une meilleure indexation du site par les moteurs de recherche du web, notamment grâce au Server Side Rendering, qui permet de préparer, côté serveur, une partie du code client qui sera exécuté dans le navigateur et ainsi le rendre immédiatement lisible par les moteurs d’indexation. De plus, Nuxt propose et préconfigure par défaut un certain nombre de fonctionnalités indispensables, comme le routage qui fournit les URLs de l’application, la gestion des erreurs ou encore',
 'l’application, la gestion des erreurs ou encore la récupération des données depuis les API.',
 'L’accès à l’interface via différents types de terminaux est également facilité par le framework VueJS : une navigation aisée sur mobile est une des nouveautés du site.',
 'Une attention toute particulière a été portée par les développeurs sur l’accessibilité de l’interface, qui respecte les règles édictées dans le Référentiel général d’amélioration de l’accessibilité (RGAA) : polices appropriées, choix des couleurs, contraste, mise en forme de la page et utilisation de balises ARIA pour introduire la sémantique des éléments dans le code HTML.',
 'Une intégration continue',
 'L’intégration continue du projet est assurée par des actions Github, programmes qui se déclenchent à chaque fois qu’un développeur pousse (publie) du code sur une branche (qui propose une fonctionnalité) du projet : le code est alors compilé et, si la compilation et les tests réussissent, la branche en question peut alors être publiée comme image sur la plateforme Dockerhub. Ces images sont alors disponibles pour déploiement sur nos machines de développement, test ou production. A noter que le',
 'développement, test ou production. A noter que le code de l’intégration continue est versionné sur le même dépôt que le projet, au plus près de ce dernier pour en faciliter la maintenance.',
 'Les API\nCôté back-office, theses.fr est composé de trois API, ensemble de services utilisés par l’interface VueJs mais qui peuvent également être appelés depuis des programmes externes.  Ces API, programmées en Java Spring et documentées selon la norme OpenAPI, sont publiées à cette adresse : https://api.gouv.fr/les-api/api-export-donnees-these\n\nCes services recouvrent trois thématiques :',
 'La recherche dans les métadonnées : il est possible d’interroger les données en passant directement une chaine de recherche du langage de requête du moteur d’indexation Elastic Search via l’URL. Les réponses sont renvoyées au format JSON.',
 'La diffusion des documents : cette API fournit à la fois les boutons à afficher dans l’interface pour chacune des thèses et les liens avers les documents eux-mêmes, ou des liens vers des ressources externes décrivant les documents, comme les notices du catalogue Sudoc. Les accès aux documents sont contrôlés : il n’est pas possible de visualiser une thèse confidentielle et la récupération d’une thèse sous embargo est soumis à authentification.',
 'L’export des métadonnées : les métadonnées des thèses sont fournies dans des formats BIBTEX et RIS qui permettent d’échanger ou d’intégrer facilement la thèse comme référence bibliographique. Elles sont aussi disponibles en RDF, format du web sémantique qui facilite leur intégration dans le Linked Open Data cloud\nLe moteur Elastic Search',
 'Le moteur Elastic Search\nLes données sont indexées dans le moteur Elastic Search, le choix s’étant porté sur cet outil à la fois pour sa popularité et sa présence dans la pile logicielle Elastic Search – LogStash – Kibana, déjà installée dans  le système d’information de l’Abes.',
 'Elastic Search assure les fonctionnalités essentielles telles que filtres, agrégations, pondération ou encore calcul de pertinence lors de l’exécution des requêtes tout en maintenant un haut niveau de performance en termes de délai de réponse.\n\nConsulter :  https://collection-numerique.amue.fr/numero-27/13.html',
 'Fédération d’identité\nSi les thèses en accès restreint ne sont pas disponibles pour le grand public, leur diffusion étant par exemple limitée par un embargo, elles doivent cependant être accessibles aux membres de l’Enseignement Supérieur et de la Recherche. Donner accès à ces thèses constitue donc une des principales nouveautés du nouveau theses.fr.',
 'L’implémentation de cette fonctionnalité a été réalisée grâce à l’inscription de theses.fr en tant que fournisseur de services dans la fédération d’identité RENATER. L’authentification des utilisateurs est ainsi déléguée à cette fédération d’identité qui s’assurera que toute personne disposant d’un compte chez un fournisseur d’identités pourra accéder aux thèses en accès restreint.',
 'Le système, qui repose sur le protocole SAML2, requiert l’installation et la configuration de briques logicielles : à cette fin, nous avons mis en place un proxy Apache chargé de rediriger les URLs des thèses en accès restreint vers une page demandant à l’utilisateur de choisir son fournisseur d’identité afin de s’authentifier pour pouvoir accéder à la ressource']

Voir la collection de documents

[Document(page_content='Refonte de theses.fr : éclairage sur les choix informatiques\n\nConduit selon la méthode SCRUM, le projet de refonte de theses.fr illustre parfaitement les concepts de la politique de développement de l’Abes. Il est l’aboutissement de 19 mois de travail pour l’équipe constituée d’une Product Owner, de cinq développeurs – dont un en prestation externe – et d’un devops.'),
 Document(page_content='Fidèle à la résolution de l’Abes qui, depuis 2019, publie les codes sources de ses applications sur Github, le projet est entièrement open source. Ses différents modules sont répartis dans plusieurs dépôts, tous hébergés dans l’organisation Github de l’Abes.'),
 Document(page_content='L’interface du site\nUn premier dépôt contient le code de l’interface de l’application réalisée avec le framework Nuxt, surcouche au framework VueJs. VueJs a été choisi par les développeurs de l’Abes pour sa courbe d’apprentissage jugée plus rapide que pour ses concurrents React ou Angular.'),
 Document(page_content='La surcouche Nuxt assure une meilleure indexation du site par les moteurs de recherche du web, notamment grâce au Server Side Rendering, qui permet de préparer, côté serveur, une partie du code client qui sera exécuté dans le navigateur et ainsi le rendre immédiatement lisible par les moteurs d’indexation. De plus, Nuxt propose et préconfigure par défaut un certain nombre de fonctionnalités indispensables, comme le routage qui fournit les URLs de l’application, la gestion des erreurs ou encore'),
 Document(page_content='l’application, la gestion des erreurs ou encore la récupération des données depuis les API.'),
 Document(page_content='L’accès à l’interface via différents types de terminaux est également facilité par le framework VueJS : une navigation aisée sur mobile est une des nouveautés du site.'),
 Document(page_content='Une attention toute particulière a été portée par les développeurs sur l’accessibilité de l’interface, qui respecte les règles édictées dans le Référentiel général d’amélioration de l’accessibilité (RGAA) : polices appropriées, choix des couleurs, contraste, mise en forme de la page et utilisation de balises ARIA pour introduire la sémantique des éléments dans le code HTML.'),
 Document(page_content='Une intégration continue'),
 Document(page_content='L’intégration continue du projet est assurée par des actions Github, programmes qui se déclenchent à chaque fois qu’un développeur pousse (publie) du code sur une branche (qui propose une fonctionnalité) du projet : le code est alors compilé et, si la compilation et les tests réussissent, la branche en question peut alors être publiée comme image sur la plateforme Dockerhub. Ces images sont alors disponibles pour déploiement sur nos machines de développement, test ou production. A noter que le'),
 Document(page_content='développement, test ou production. A noter que le code de l’intégration continue est versionné sur le même dépôt que le projet, au plus près de ce dernier pour en faciliter la maintenance.'),
 Document(page_content='Les API\nCôté back-office, theses.fr est composé de trois API, ensemble de services utilisés par l’interface VueJs mais qui peuvent également être appelés depuis des programmes externes.  Ces API, programmées en Java Spring et documentées selon la norme OpenAPI, sont publiées à cette adresse : https://api.gouv.fr/les-api/api-export-donnees-these\n\nCes services recouvrent trois thématiques :'),
 Document(page_content='La recherche dans les métadonnées : il est possible d’interroger les données en passant directement une chaine de recherche du langage de requête du moteur d’indexation Elastic Search via l’URL. Les réponses sont renvoyées au format JSON.'),
 Document(page_content='La diffusion des documents : cette API fournit à la fois les boutons à afficher dans l’interface pour chacune des thèses et les liens avers les documents eux-mêmes, ou des liens vers des ressources externes décrivant les documents, comme les notices du catalogue Sudoc. Les accès aux documents sont contrôlés : il n’est pas possible de visualiser une thèse confidentielle et la récupération d’une thèse sous embargo est soumis à authentification.'),
 Document(page_content='L’export des métadonnées : les métadonnées des thèses sont fournies dans des formats BIBTEX et RIS qui permettent d’échanger ou d’intégrer facilement la thèse comme référence bibliographique. Elles sont aussi disponibles en RDF, format du web sémantique qui facilite leur intégration dans le Linked Open Data cloud\nLe moteur Elastic Search'),
 Document(page_content='Le moteur Elastic Search\nLes données sont indexées dans le moteur Elastic Search, le choix s’étant porté sur cet outil à la fois pour sa popularité et sa présence dans la pile logicielle Elastic Search – LogStash – Kibana, déjà installée dans  le système d’information de l’Abes.'),
 Document(page_content='Elastic Search assure les fonctionnalités essentielles telles que filtres, agrégations, pondération ou encore calcul de pertinence lors de l’exécution des requêtes tout en maintenant un haut niveau de performance en termes de délai de réponse.\n\nConsulter :  https://collection-numerique.amue.fr/numero-27/13.html'),
 Document(page_content='Fédération d’identité\nSi les thèses en accès restreint ne sont pas disponibles pour le grand public, leur diffusion étant par exemple limitée par un embargo, elles doivent cependant être accessibles aux membres de l’Enseignement Supérieur et de la Recherche. Donner accès à ces thèses constitue donc une des principales nouveautés du nouveau theses.fr.'),
 Document(page_content='L’implémentation de cette fonctionnalité a été réalisée grâce à l’inscription de theses.fr en tant que fournisseur de services dans la fédération d’identité RENATER. L’authentification des utilisateurs est ainsi déléguée à cette fédération d’identité qui s’assurera que toute personne disposant d’un compte chez un fournisseur d’identités pourra accéder aux thèses en accès restreint.'),
 Document(page_content='Le système, qui repose sur le protocole SAML2, requiert l’installation et la configuration de briques logicielles : à cette fin, nous avons mis en place un proxy Apache chargé de rediriger les URLs des thèses en accès restreint vers une page demandant à l’utilisateur de choisir son fournisseur d’identité afin de s’authentifier pour pouvoir accéder à la ressource')]
....

Cas 2 : chargement avec un Document loader et segmentation du texte

#pip install -U unstructured
from langchain_community.document_loaders import UnstructuredURLLoader

urls = [
    "https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/",
]
loader = UnstructuredURLLoader(urls=urls)
texts = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
   chunk_size=500, 
    chunk_overlap=50, 
    length_function=len, 
    separators=["\n\n", "\n", " ", ""] ,#
)
docs = text_splitter.split_documents(texts)

Voir la collection de documents (avec les métadonnées)

[Document(page_content='Blog\n\nAccueil>\n\nPM>\n\nAvr>\n\n9>\n\nNon classé>\n\nRefonte de theses.fr : éclairage sur les choix informatiques\n\nRefonte de theses.fr : éclairage sur les choix informatiques\n\nAuteur/autrice de la publication\xa0:Punktauteur\n\nPublication publiée\xa0:9 avril 2024\n\nPost category:Non classé\n\nCommentaires de la publication\xa0:2 commentaires\n\nLa nouvelle version de theses.fr a été mise en ligne jeudi 14 mars 2024. Consulter le billet Fil’Abes', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Conduit selon la méthode SCRUM, le projet de refonte de theses.fr illustre parfaitement les concepts de la politique de développement de l’Abes. Il est l’aboutissement de 19 mois de travail pour l’équipe constituée d’une Product Owner, de cinq développeurs – dont un en prestation externe – et d’un devops.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Fidèle à la résolution de l’Abes qui, depuis 2019, publie les codes sources de ses applications sur Github, le projet est entièrement open source. Ses différents modules sont répartis dans plusieurs dépôts, tous hébergés dans l’organisation Github de l’Abes.\n\nL’interface du site', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='L’interface du site\n\nUn premier dépôt contient le code de l’interface de l’application réalisée avec le framework Nuxt, surcouche au framework VueJs. VueJs a été choisi par les développeurs de l’Abes pour sa courbe d’apprentissage jugée plus rapide que pour ses concurrents React ou Angular.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='La surcouche Nuxt assure une meilleure indexation du site par les moteurs de recherche du web, notamment grâce au Server Side Rendering, qui permet de préparer, côté serveur, une partie du code client qui sera exécuté dans le navigateur et ainsi le rendre immédiatement lisible par les moteurs d’indexation. De plus, Nuxt propose et préconfigure par défaut un certain nombre de fonctionnalités indispensables, comme le routage qui fournit les URLs de l’application, la gestion des erreurs ou encore', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='l’application, la gestion des erreurs ou encore la récupération des données depuis les API.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='L’accès à l’interface via différents types de terminaux est également facilité par le framework VueJS\xa0: une navigation aisée sur mobile est une des nouveautés du site.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Une attention toute particulière a été portée par les développeurs sur l’accessibilité de l’interface, qui respecte les règles édictées dans le Référentiel général d’amélioration de l’accessibilité (RGAA) : polices appropriées, choix des couleurs, contraste, mise en forme de la page et utilisation de balises ARIA pour introduire la sémantique des éléments dans le code HTML.\n\nUne intégration continue', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='L’intégration continue du projet est assurée par des actions Github, programmes qui se déclenchent à chaque fois qu’un développeur pousse (publie) du code sur une branche (qui propose une fonctionnalité) du projet : le code est alors compilé et, si la compilation et les tests réussissent, la branche en question peut alors être publiée comme image sur la plateforme Dockerhub. Ces images sont alors disponibles pour déploiement sur nos machines de développement, test ou production. A noter que le', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='développement, test ou production. A noter que le code de l’intégration continue est versionné sur le même dépôt que le projet, au plus près de ce dernier pour en faciliter la maintenance.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Les API\n\nCôté back-office, theses.fr est composé de trois API, ensemble de services utilisés par l’interface VueJs mais qui peuvent également être appelés depuis des programmes externes.\xa0 Ces API, programmées en Java Spring et documentées selon la norme OpenAPI, sont publiées à cette adresse : https://api.gouv.fr/les-api/api-export-donnees-these\n\nCes services recouvrent trois thématiques\xa0:', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Ces services recouvrent trois thématiques\xa0:\n\nLa recherche dans les métadonnées : il est possible d’interroger les données en passant directement une chaine de recherche du langage de requête du moteur d’indexation Elastic Search via l’URL. Les réponses sont renvoyées au format JSON.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='La diffusion des documents : cette API fournit à la fois les boutons à afficher dans l’interface pour chacune des thèses et les liens avers les documents eux-mêmes, ou des liens vers des ressources externes décrivant les documents, comme les notices du catalogue Sudoc. Les accès aux documents sont contrôlés : il n’est pas possible de visualiser une thèse confidentielle et la récupération d’une thèse sous embargo est soumis à authentification.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='L’export des métadonnées : les métadonnées des thèses sont fournies dans des formats BIBTEX et RIS qui permettent d’échanger ou d’intégrer facilement la thèse comme référence bibliographique. Elles sont aussi disponibles en RDF, format du web sémantique qui facilite leur intégration dans le Linked Open Data cloud\n\nLe moteur Elastic Search', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Le moteur Elastic Search\n\nLes données sont indexées dans le moteur Elastic Search, le choix s’étant porté sur cet outil à la fois pour sa popularité et sa présence dans la pile logicielle Elastic Search – LogStash – Kibana, déjà installée dans\xa0 le système d’information de l’Abes.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Elastic Search assure les fonctionnalités essentielles telles que filtres, agrégations, pondération ou encore calcul de pertinence lors de l’exécution des requêtes tout en maintenant un haut niveau de performance en termes de délai de réponse.\n\nConsulter :\xa0 https://collection-numerique.amue.fr/numero-27/13.html\n\nFédération d’identité', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Fédération d’identité\n\nSi les thèses en accès restreint ne sont pas disponibles pour le grand public, leur diffusion étant par exemple limitée par un embargo, elles doivent cependant être accessibles aux membres de l’Enseignement Supérieur et de la Recherche. Donner accès à ces thèses constitue donc une des principales nouveautés du nouveau theses.fr.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='L’implémentation de cette fonctionnalité a été réalisée grâce à l’inscription de theses.fr en tant que fournisseur de services dans la fédération d’identité RENATER. L’authentification des utilisateurs est ainsi déléguée à cette fédération d’identité qui s’assurera que toute personne disposant d’un compte chez un fournisseur d’identités pourra accéder aux thèses en accès restreint.', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Le système, qui repose sur le protocole SAML2, requiert l’installation et la configuration de briques logicielles : à cette fin, nous avons mis en place un proxy Apache chargé de rediriger les URLs des thèses en accès restreint vers une page demandant à l’utilisateur de choisir son fournisseur d’identité afin de s’authentifier pour pouvoir accéder à la ressource.\n\nConsulter les codes de theses.fr : https://github.com/abes-esr', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content="Télécharger les API sur api.gouv : https://api.gouv.fr/les-api/api-export-donnees-these\n\nTweetez\n\nPartagez\n\nPartagez\n\nCet article a 2 commentaires\n\nPing : Theses.fr : ouverture d’une nouvelle version dotée d’un accès réservé pour les membres de l'ESR - FIL'ABES\n\nPing : ACTUS MAI 2024 | Pearltrees\n\nLaisser un commentaire Annuler la réponse\n\nEnregistrer mon nom, mon e-mail et mon site dans le navigateur pour mon prochain commentaire.\n\nPrévenez-moi de tous les nouveaux commentaires par e-mail.", metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content="Prévenez-moi de tous les nouveaux articles par e-mail.\n\nAbonnez-vous à Punktokomo\n\nAdresse e-mail\n\nAbonnez-vous\n\nRejoignez les 437 autres abonnés\n\nPar catégorie\n\nPar date\n\nL'Abes sur X (ex-Twitter)\n\nSuivez notre fil d’activité\n\n@com_abes\n\nFil’Abes, Le fil d’actualité de l’Abes\n\nQualiMarc : Publication des résultats de l’enquête de satisfaction\n\nCalames – publication du Rapport statistique 2023\n\nJournées Abes 2024 : ouverture des inscriptions", metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Journées Abes 2024 : ouverture des inscriptions\n\nOuBiPo : réflexions sur l’évolution des données bibliographiques à l’Abes\n\nRetour sur la réunion des catalogueurs et catalogueuses arabisant.e.s\n\nMieux comprendre le rapport « Les implications pratiques de la TB » : questions / réponses – #billet7\n\nVers une nouvelle feuille de route pour le programme national Transition bibliographique #billet6\n\nArticles récents', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Articles récents\n\nCERCLES : lancement d’un nouveau chantier sur le corpus Arte Vidéo Campus par le SCDI de Montpellier\n\nBilan du chantier Qualité autour des notices d’autorité Personnes physiques de statut 1\u202f- #billet3\n\nBilan du chantier qualité autour des notices d’autorité Personnes physiques de statut 1\u202f- #billet2\n\nLes vidéos de l’Abes\n\nhttps://vimeo.com/279414773?loop=0\n\nPlateforme Prairial\n\nArabesques en ligne\n\nA propos\n\nPrésentation\n\nEn savoir plus sur l’Abes\n\nCommentaires récents', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='En savoir plus sur l’Abes\n\nCommentaires récents\n\nBilan du chantier Qualité autour des notices d’autorité Personnes physiques de statut 1\u202f- #billet1\xa0 - PUNKTOKOMO dans Bilan du chantier qualité autour des notices d’autorité Personnes physiques de statut 1\u202f- #billet2\n\nBilan du chantier qualité autour des notices d’autorité Personnes physiques de statut 1\u202f- #billet2\xa0 - PUNKTOKOMO dans Bilan du chantier Qualité autour des notices d’autorité Personnes physiques de statut 1\u202f- #billet1', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'}),
 Document(page_content='Bilan du chantier qualité autour des notices d’autorité Personnes physiques de statut 1\u202f- #billet2\xa0 - PUNKTOKOMO dans IdRef : chantier qualité autour des notices d’autorité Personnes physiques de statut 1', metadata={'source': 'https://punktokomo.abes.fr/2024/04/09/refonte-de-theses-fr-eclairage-sur-les-choix-informatiques/'})]

Précisons sur le séparateur de texte

Son rôle consiste donc à décomposer un texte en séquences plus petites et plus faciles à gérer pour l’analyse ou le traitement. Dans le cas du RAG avec des LLMs, l'objectif principal de la segmentation des contenus additionnels consiste à adapter la taille du texte à la fenêtre de contexte du modèle (pour donner une idée elle est de 4096 tokens, soit environ 3500 mots pour gpt-3.5-turbo). Dans l'exemple j'ai utilisé le séparateur RecursiveCharacterTextSplitter mais il en existe d'autres, et le choix d'un type de séparateur plutôt qu'un autre influe directement sur la manière dont sera splité le contenu. De même les paramètres de contrôle passés en arguments impactent fortement la qualité finale des réponses du modèle dans la mesure où tout l'enjeu est de parvenir au bon équilibre entre conservation de la sémantique dans les séquences splitées (des chunks pas trop petits), entre les séquences splitées (choix de l'overlap) tout en ne dépassant pas les capacités de "mémoire" du modèle. Pour mieux visualiser l'impact du choix entre un type de séparateur ou un autre et des variations des valeurs des paramètres, voir par exemple ce démonstrateur en ligne ou celui-ci

enter image description here

Stockage dans une base de données vectorielles.

Une base de données de vecteurs est l'outil qui permet de stocker les documents et leurs embeddings, et d'effectuer des recherches vectorielles, notamment afin de récupérer les embeddings les plus similaires à une requête. Un vector store est donc à la fois un "magasin de vecteurs" et un moteur de recherche vectoriel via l'intégration d'algorithmes de recherche du plus proche voisin.

Il en existe toute une panoplie (Faiss, Chroma, Qdrant, PineCone, Milvus,...), y compris dans le cadre de base de données plus classiques (MongoDB Vector Search pour MongoDB, pgvector pour PostgreSQL), l'embarras du choix donc....


Personnellement j'ai un faible pour Qdrant qui stocke les vecteurs en local, offre une UI d'administration pratique et épurée, et se dockerise très facilement.


Neanmoins on va utiliser ici Chroma, que l'on initialise de cette manière :

client = chromadb.PersistentClient(path="./chromadb") # on persiste les données en local
db = Chroma(client=client, embedding_function=embeddings, collection_name="punktokomo")

db.add_documents(docs)

# returns (les ids des documents dans Chroma)
['a85b340b-b470-4bd9-8d18-d1c16ae8af1c',
 '4cf37548-e9dd-4b90-9e5b-6d95ebad2b6d',
 '75ae49b5-14d2-400d-a2f5-98a5e8c41694',
 '06b4e2e7-87a5-4d53-9773-446936764c86',
 '95fa04ab-7edb-41a0-b797-0c947495eebe',
 '4a096772-8943-4316-9cf8-255cff13edf4',
 'f23e5a78-25e5-4e70-a0be-36da25190b2d',
 'f8f3d22a-be60-46d7-b2da-400a93f2fe22',
 '0202175e-3b42-4032-85ba-331f50bd472d',
 'f6b7d4dc-d1e1-42a1-a92b-4c85aed0e477',
 '79464ff5-1a4e-4a64-baa0-115f9fbc49b9',
 'c6529879-6d13-407f-b342-4fd3f0a9d8fd',
 '09b3b366-977e-46a7-b693-fcf74ebdd5fa',
 'b1069d5c-d6c8-4794-bf32-1304841022ca',
 '4af023e8-937a-454c-87eb-2e669597a6a3',
 'e6204dd2-84e5-4b79-b450-ca297b6f4a77',
 'cfa4133f-93dc-448a-8e70-4d48224b9f33',
 '7e482e9a-f853-4a31-9803-fa0bb4ba14ce',
 'dccd8004-a232-4a9e-9508-91f00ce605d8']

Pour inspecter comment ont été sauvegardés les données :

collection = client.get_collection("punktokomo")
documents, embeddings = (collection.get(include=["documents"])["documents"], collection.get(include=["embeddings"])["embeddings"])

Voir les documents dans Chroma

documents
# returns
['L’intégration continue du projet est assurée par des actions Github, programmes qui se déclenchent à chaque fois qu’un développeur pousse (publie) du code sur une branche (qui propose une fonctionnalité) du projet : le code est alors compilé et, si la compilation et les tests réussissent, la branche en question peut alors être publiée comme image sur la plateforme Dockerhub. Ces images sont alors disponibles pour déploiement sur nos machines de développement, test ou production. A noter que le',
 'La surcouche Nuxt assure une meilleure indexation du site par les moteurs de recherche du web, notamment grâce au Server Side Rendering, qui permet de préparer, côté serveur, une partie du code client qui sera exécuté dans le navigateur et ainsi le rendre immédiatement lisible par les moteurs d’indexation. De plus, Nuxt propose et préconfigure par défaut un certain nombre de fonctionnalités indispensables, comme le routage qui fournit les URLs de l’application, la gestion des erreurs ou encore',
 'La diffusion des documents : cette API fournit à la fois les boutons à afficher dans l’interface pour chacune des thèses et les liens avers les documents eux-mêmes, ou des liens vers des ressources externes décrivant les documents, comme les notices du catalogue Sudoc. Les accès aux documents sont contrôlés : il n’est pas possible de visualiser une thèse confidentielle et la récupération d’une thèse sous embargo est soumis à authentification.',
 'L’accès à l’interface via différents types de terminaux est également facilité par le framework VueJS : une navigation aisée sur mobile est une des nouveautés du site.',
 'Le moteur Elastic Search\nLes données sont indexées dans le moteur Elastic Search, le choix s’étant porté sur cet outil à la fois pour sa popularité et sa présence dans la pile logicielle Elastic Search – LogStash – Kibana, déjà installée dans  le système d’information de l’Abes.',
 'Fidèle à la résolution de l’Abes qui, depuis 2019, publie les codes sources de ses applications sur Github, le projet est entièrement open source. Ses différents modules sont répartis dans plusieurs dépôts, tous hébergés dans l’organisation Github de l’Abes.',
 'L’interface du site\nUn premier dépôt contient le code de l’interface de l’application réalisée avec le framework Nuxt, surcouche au framework VueJs. VueJs a été choisi par les développeurs de l’Abes pour sa courbe d’apprentissage jugée plus rapide que pour ses concurrents React ou Angular.',
 'Les API\nCôté back-office, theses.fr est composé de trois API, ensemble de services utilisés par l’interface VueJs mais qui peuvent également être appelés depuis des programmes externes.  Ces API, programmées en Java Spring et documentées selon la norme OpenAPI, sont publiées à cette adresse : https://api.gouv.fr/les-api/api-export-donnees-these\n\nCes services recouvrent trois thématiques :',
 'L’implémentation de cette fonctionnalité a été réalisée grâce à l’inscription de theses.fr en tant que fournisseur de services dans la fédération d’identité RENATER. L’authentification des utilisateurs est ainsi déléguée à cette fédération d’identité qui s’assurera que toute personne disposant d’un compte chez un fournisseur d’identités pourra accéder aux thèses en accès restreint.',
 'l’application, la gestion des erreurs ou encore la récupération des données depuis les API.',
 'Refonte de theses.fr : éclairage sur les choix informatiques\n\nConduit selon la méthode SCRUM, le projet de refonte de theses.fr illustre parfaitement les concepts de la politique de développement de l’Abes. Il est l’aboutissement de 19 mois de travail pour l’équipe constituée d’une Product Owner, de cinq développeurs – dont un en prestation externe – et d’un devops.',
 'L’export des métadonnées : les métadonnées des thèses sont fournies dans des formats BIBTEX et RIS qui permettent d’échanger ou d’intégrer facilement la thèse comme référence bibliographique. Elles sont aussi disponibles en RDF, format du web sémantique qui facilite leur intégration dans le Linked Open Data cloud\nLe moteur Elastic Search',
 'La recherche dans les métadonnées : il est possible d’interroger les données en passant directement une chaine de recherche du langage de requête du moteur d’indexation Elastic Search via l’URL. Les réponses sont renvoyées au format JSON.',
 'Fédération d’identité\nSi les thèses en accès restreint ne sont pas disponibles pour le grand public, leur diffusion étant par exemple limitée par un embargo, elles doivent cependant être accessibles aux membres de l’Enseignement Supérieur et de la Recherche. Donner accès à ces thèses constitue donc une des principales nouveautés du nouveau theses.fr.',
 'Le système, qui repose sur le protocole SAML2, requiert l’installation et la configuration de briques logicielles : à cette fin, nous avons mis en place un proxy Apache chargé de rediriger les URLs des thèses en accès restreint vers une page demandant à l’utilisateur de choisir son fournisseur d’identité afin de s’authentifier pour pouvoir accéder à la ressource',
 'Elastic Search assure les fonctionnalités essentielles telles que filtres, agrégations, pondération ou encore calcul de pertinence lors de l’exécution des requêtes tout en maintenant un haut niveau de performance en termes de délai de réponse.\n\nConsulter :  https://collection-numerique.amue.fr/numero-27/13.html',
 'Une attention toute particulière a été portée par les développeurs sur l’accessibilité de l’interface, qui respecte les règles édictées dans le Référentiel général d’amélioration de l’accessibilité (RGAA) : polices appropriées, choix des couleurs, contraste, mise en forme de la page et utilisation de balises ARIA pour introduire la sémantique des éléments dans le code HTML.',
 'développement, test ou production. A noter que le code de l’intégration continue est versionné sur le même dépôt que le projet, au plus près de ce dernier pour en faciliter la maintenance.',
 'Une intégration continue']
...

Voir les embeddings dans Chroma

embeddings
# returns
[[-0.0138511061668396,
  0.0270092636346817,
  -0.059641033411026,
  -0.11141131818294525,
  0.014633091166615486,
  -0.06717094033956528,
  -0.05423459783196449,
  0.08536693453788757,
  -0.033013392239809036,
  0.019060486927628517,
  0.015246904455125332,
  0.03318428620696068,
  0.08312129974365234,
  -0.03716567903757095,
  -0.04839443415403366,
  -0.07518065720796585,
  -0.059462737292051315,
  0.0044926125556230545,
  0.022679761052131653,
  0.02173173986375332,
  -0.09161139279603958,
  -0.0474194772541523,
  -0.04185058921575546,
  0.018173716962337494,
  -0.0015101875178515911,
...
  0.027302315458655357,
  0.06158699467778206,
  -0.021063655614852905,
  -0.02038956806063652,
  0.015974650159478188]]

Récupération (retriever) et génération (étapes 3 & 4)

enter image description here Source : https://python.langchain.com/v0.1/docs/use_cases/question_answering/

Réaliser une recherche vectorielle de similarité dans le vector store à partir d'une requête (en calculant une métrique de distance entre les vecteurs de la requête et les vecteurs indexés dans la base de données) est ausi simple que :

query = "Quel est le rôle de la Fédération d'identité pour l'accès aux thèses ?"
results = db.similarity_search_with_relevance_scores(query, k=5) # k est le nombre de documents à renvoyer

Voir le résultat

[(Document(page_content='L’implémentation de cette fonctionnalité a été réalisée grâce à l’inscription de theses.fr en tant que fournisseur de services dans la fédération d’identité RENATER. L’authentification des utilisateurs est ainsi déléguée à cette fédération d’identité qui s’assurera que toute personne disposant d’un compte chez un fournisseur d’identités pourra accéder aux thèses en accès restreint.'),
  0.5911816600744317),
 (Document(page_content='Fédération d’identité\nSi les thèses en accès restreint ne sont pas disponibles pour le grand public, leur diffusion étant par exemple limitée par un embargo, elles doivent cependant être accessibles aux membres de l’Enseignement Supérieur et de la Recherche. Donner accès à ces thèses constitue donc une des principales nouveautés du nouveau theses.fr.'),
  0.5012315638417952),
 (Document(page_content='Refonte de theses.fr : éclairage sur les choix informatiques\n\nConduit selon la méthode SCRUM, le projet de refonte de theses.fr illustre parfaitement les concepts de la politique de développement de l’Abes. Il est l’aboutissement de 19 mois de travail pour l’équipe constituée d’une Product Owner, de cinq développeurs – dont un en prestation externe – et d’un devops.'),
  0.18979041118998596),
 (Document(page_content='l’application, la gestion des erreurs ou encore la récupération des données depuis les API.'),
  0.18046089309523727),
 (Document(page_content='L’accès à l’interface via différents types de terminaux est également facilité par le framework VueJS : une navigation aisée sur mobile est une des nouveautés du site.'),
  0.1262815525997093)]


A noter : la conversion de la question en embeddings est transparente mais on peut aussi l'effectuer soi-même

query_result = embeddings.embed_query(query)
query_result
# returns
[-0.0416208878159523,
 0.03017381764948368,
 -0.027335217222571373,
 -0.07207853347063065,
 0.01950657181441784,
...
 0.0012039609719067812,
 -0.03297179937362671,
 0.02061120793223381,
 0.08346986025571823,
 -0.07835739105939865]

Notre pipeline de récupération étant en place, on peut donc passer à la dernière partie de requêtage du LLM avec un prompt augmenté :

# on récupère la bdd
client = chromadb.PersistentClient(path="./chromadb")
db = Chroma(client=client, embedding_function=embeddings, collection_name="punktokomo")``

# template de prompt
template = """
Use the following pieces of context to answer the question at the end. 
If you don't know the answer, just say that you don't know, don't try to make up an answer.
{context}

Question: {question}
Answer:
"""
prompt = PromptTemplate(
    template=template, 
    input_variables=[
        'context', 
        'question',
    ]
)

# génération
qa_chain = RetrievalQA.from_chain_type(
    llm, 
    retriever=db.as_retriever(),
    return_source_documents=True,
    chain_type_kwargs={"prompt": prompt}
)
query = "Quel est le rôle de la Fédération d'identité pour l'accès aux thèses ?"
qa_chain({"query": query})

Voir le résultat

{'query': "Quel est le rôle de la Fédération d'identité pour l'accès aux thèses ?",
 'result': "La Fédération d'identité, en tant que fournisseur d'identité, assure l'authentification des utilisateurs et leur donne accès aux thèses en accès restreint.",
 'source_documents': [Document(page_content='L’implémentation de cette fonctionnalité a été réalisée grâce à l’inscription de theses.fr en tant que fournisseur de services dans la fédération d’identité RENATER. L’authentification des utilisateurs est ainsi déléguée à cette fédération d’identité qui s’assurera que toute personne disposant d’un compte chez un fournisseur d’identités pourra accéder aux thèses en accès restreint.'),
  Document(page_content='Fédération d’identité\nSi les thèses en accès restreint ne sont pas disponibles pour le grand public, leur diffusion étant par exemple limitée par un embargo, elles doivent cependant être accessibles aux membres de l’Enseignement Supérieur et de la Recherche. Donner accès à ces thèses constitue donc une des principales nouveautés du nouveau theses.fr.'),
  Document(page_content='Refonte de theses.fr : éclairage sur les choix informatiques\n\nConduit selon la méthode SCRUM, le projet de refonte de theses.fr illustre parfaitement les concepts de la politique de développement de l’Abes. Il est l’aboutissement de 19 mois de travail pour l’équipe constituée d’une Product Owner, de cinq développeurs – dont un en prestation externe – et d’un devops.'),
  Document(page_content='l’application, la gestion des erreurs ou encore la récupération des données depuis les API.')]}

Une application de RAG en acceléré

Voilà donc pour l'approche ultra-détaillée mais néanmoins fondamentale pour saisir les mécanismes à l'oeuvre sous le capot des applications de RAG. A l'autre bout du spectre, mais juste avant les multiples applications packagées fournissant des alternatives open source et offline à ChatGPT Plus, on peut utiliser le framework embedchain qui rend en grande partie transparent tout le processus de loading-embedding-storing-retrieving et permet de développer et déployer une app de RAG en quelques lignes de code (voir la doc pour adapter la configuration des LLM, modèles d'embeddings et vector store)

Par exemple pour faire du RAG sur le texte du projet d'établissement 2024-2028 de l'Abes :

from embedchain import App
import os

os.environ["GROQ_API_KEY"] = "<your_groq_apikey>"

config = {
  'llm': {
    'provider': 'groq',
    'config': {
      'model': 'llama3-70b-8192',
      'top_p': 0.7
    }
  },
  'embedder': 
    'provider': 'huggingface',
    'config': {
      'model': 'sentence-transformers/all-mpnet-base-v2'
    }
  },
'vectordb':{
  'provider': 'chroma',
  'config': {
    'collection_name': 'abes',
    'dir': 'chromadb',
    'allow_reset': True
  }
 }
}

app = App.from_config(config=config)
app.add('https://projet2024.abes.fr/docs/2.4/projet2024', data_type='web_page')

app.query("Quelle est la stratégie de l'Abes autour des API?", citations=True)

Voir le résultat

('La stratégie de l\'Abes autour des API est d\'adopter une approche "API first" qui consiste à proposer prioritairement des services orientés machines.',
 [('proposé par l’Abes.',
   {'app_id': 'default-app-id',
    'data_type': 'text',
    'doc_id': 'default-app-id--7f83c08660b1b78809f5704a4b33974abc28c37e986865fb3f478a038ee81284',
    'hash': '69d1694b7380a8a8bcff4f5c5536f17b',
    'url': 'local',
    'score': 0.4664609134197235}),
  ('Figure 1 — vue simplifiée du système d’information métier de l’Abes',
   {'app_id': 'default-app-id',
    'data_type': 'text',
    'doc_id': 'default-app-id--7f83c08660b1b78809f5704a4b33974abc28c37e986865fb3f478a038ee81284',
    'hash': '69d1694b7380a8a8bcff4f5c5536f17b',
    'url': 'local',
    'score': 0.48458409309387207}),
  ('La stratégie « API first » adoptée par l’Abes consiste à proposer prioritairement des services orientés machines pour répondre aux besoins :\nde décorrélation entre la forme (interfaces utilisateurs) et le fond (traitement sur les données, calculs et algorithmes)',
   {'app_id': 'default-app-id',
    'data_type': 'text',
    'doc_id': 'default-app-id--7f83c08660b1b78809f5704a4b33974abc28c37e986865fb3f478a038ee81284',
    'hash': '69d1694b7380a8a8bcff4f5c5536f17b',
    'url': 'local',
    'score': 0.5137353539466858})])


Enfin, c'est le code théorique car en réalité j'ai rencontré quelques difficultés à faire fonctionner correctement le loader web_page - ainsi que sitemap aussi d'ailleurs - , ce qui a nécessité d'ajouter manuellement la première étape de scraping du contenu textuel (réalisé avec la super librairie trafilatura)

from trafilatura import fetch_url, extract

def extract_from_url(url: str) -> str:
    downloaded = fetch_url(url)
    if downloaded is not None:
        result = extract(
            downloaded, 
            include_comments=False,
            include_tables=True,
            include_links=False,
            no_fallback=True
        )
        return result

abes_pe_result = extract_from_url("https://projet2024.abes.fr/docs/2.4/projet2024")
app.add(abes_pe_result, data_type='text')

Points de vigilance

Si tout était si simple... ben ce serait trop simple justement ! Il suffit de créer une application de RAG basique (comme ci-dessus) pour se rendre compte que la plupart du temps les résultats se situent en-deça des espérances !

En effet pour un système de RAG en production (sur des données internes d'organisation par exemple), non seulement les phases :

  • de sélection voire de nettoyage des contenus externes pertinents ("Garbage in, garbage out") ;

  • de test et de choix du bon LLM ;

  • de test et de choix du bon modèle d'embeddings ;

  • de réglage des bons paramètres pour le chunking des textes et la création des vecteurs ;

  • de réglage de la structure de l'index ;

  • etc...

ne sont pas triviales du tout, mais c'est souvent le coeur du système de recherche et de récupération qu'il faut aussi optimiser, notamment l'étape de recherche dans le vector store des documents contextuels pertinents par rapport à la requête.

Plusieurs stratégies (non-exclusives les unes des autres) existent afin d'améliorer le retrieving, parmi lesquelles on peut citer par exemple :

  • [pre-retrieving] la technique de récupération à partir de requêtes multiples ("MultiQuery Retrievers") : qui consiste à introduire une instruction intermédiaire au LLM afin qu'il ré-écrive le prompt de l'utilisateur de plusieurs manières possibles selon plusieurs perspectives, ces variantes étant ensuite embeddées dans le vector store pour récupérer un panel plus riche de documents

  • [pre-retrieving] la technique de la création de documents et d'embeddings hypothétiques (Hyde, "Hypothetical Document Embeddings") : qui consiste à pallier le manque de performance du processus quand la signification de la requête utilisateur n’est pas toujours bien représentée dans les documents contextuels en utilisant un LLM pour créer de faux documents "idéaux" à partir du prompt initial et à incorporer ces embeddings factices dans le vector store.

  • [post-retrieval] la technique de recomposition des résultats de récupération ("re-ranking") : qui consiste à réorganiser les enregistrements de documents selon leurs scores de similarité avec le prompt pour prioriser les éléments les plus pertinents et ainsi limiter ainsi le nombre total de documents à prendre en compte

  • [pre-retrieval] la génération augmentée de récupération à base de graphes ("GraphRAG") : qui consiste à modéliser en graphe de nœuds et de relations les données contextuelles de l'utilisateur pour améliorer la profondeur et la contextualité des informations récupérées.

Si l'on souhaite appliquer des méthodes de RAG dans un contexte documentaire, on comprend assez intuitivement que cette dernière stratégie de RAG basée sur une structuration préalable de données en graphe de connaissances sous forme d'entités interconnectées ensuite combinée avec une recherche vectorielle à travers du texte non structuré est sans doute celle qui s'accorde le mieux avec les métadonnées que nous manipulons en bibliothèque.

"> ');