Création d'un modèle de recherche sémantique avec des transformateurs de phrases pour une application RAG

La mise en œuvre d'un pipeline RAG (Retrieval Augmented Generation) en affinant votre propre modèle de recherche sémantique est une approche puissante pour améliorer la précision et la pertinence des systèmes de réponse aux questions.

Cette technique combine les forces de la recherche sémantique et de l'IA générative, ce qui permet au système de mieux comprendre les questions des utilisateurs et de générer des réponses plus précises et plus pertinentes sur le plan contextuel. En affinant un modèle de recherche sémantique à l'aide des transformateurs de phrases, les développeurs peuvent adapter le modèle à leur domaine spécifique, ce qui améliore les performances globales du pipeline RAG.

Recherche sémantique

Qu'est-ce que la recherche sémantique ?

La recherche sémantique est une technique de recherche de données qui va au-delà des méthodes traditionnelles de recherche par mots-clés. Elle utilise des algorithmes de traitement du langage naturel et d'apprentissage automatique pour améliorer la précision des résultats de recherche en tenant compte de l'intention du chercheur et de la signification contextuelle des termes utilisés dans sa requête. Cette approche vise à comprendre le sens sous-jacent de la requête de recherche et du contenu des pages web, plutôt que de se contenter de faire correspondre les mots-clés. Ce faisant, la recherche sémantique peut fournir des résultats plus pertinents, même s'ils ne contiennent pas les mots exacts utilisés dans la requête initiale.

Pour ce faire, la recherche sémantique utilise diverses techniques, telles que la désambiguïsation du sens des mots, l'extraction de concepts et l'expansion des requêtes. Elle utilise également la recherche vectorielle et l'apprentissage automatique pour renvoyer des résultats qui correspondent à l'intention et au contexte de l'utilisateur. La recherche sémantique est largement utilisée dans les moteurs de recherche sur le web, tels que Google, et s'appuie sur des technologies telles que le Knowledge Graph, qui stocke des données structurées sur les entités et leurs relations. Cela permet aux moteurs de recherche de comprendre le sens des requêtes et de fournir des résultats plus précis et plus significatifs.

La recherche sémantique est très utile aux entreprises qui souhaitent répondre à des questions sur leur propre connaissance du domaine, comme leur documentation technique, leurs contrats, leurs descriptions de produits...

Qu'est-ce que la Génération Augmentée de Récupération (GAR) ?

Recherche sémantique

La génération augmentée par récupération (RAG) est une technique qui améliore la précision et la fiabilité des modèles génératifs d'IA, tels que les grands modèles de langage (LLM), en incorporant des sources de données externes afin de fournir des informations plus précises et plus récentes sur le plan contextuel. Elle intègre un composant de recherche à un modèle génératif, ce qui permet au système de rechercher et d'extraire des informations pertinentes d'une base de données ou d'une base de connaissances afin de compléter ses connaissances internes lors de la génération de réponses.

Cette approche garantit que le modèle d'IA peut fournir des réponses fondées sur les faits les plus récents et les plus fiables et permet aux utilisateurs de vérifier les sources des informations utilisées dans les réponses du modèle. Les RAG permettent de fonder le modèle d'IA sur des sources de connaissances externes, ce qui améliore la qualité de ses résultats et offre un moyen de mettre à jour le modèle sans qu'il soit nécessaire de procéder à un recyclage approfondi.

Le RAG est une excellente stratégie pour atténuer les hallucinations potentielles des modèles d'IA générative. Les RAG permettent de construire un système de réponse aux questions qui offre le meilleur des deux mondes : exactitude des faits et réponses humaines générées en langage naturel.

Qu'est-ce que la phrase Transformers Library ?

Transformateurs de phrases

La bibliothèque Sentence Transformers est un cadre de travail Python puissant conçu pour l'intégration de textes à la pointe de la technologie. Elle s'appuie sur des réseaux neuronaux transformateurs tels que BERT, RoBERTa, XLM-R, et d'autres, qui atteignent des performances de pointe dans diverses tâches, notamment la recherche sémantique, l'extraction de paraphrases, la comparaison de similitudes sémantiques, le clustering, et bien plus encore. Cette bibliothèque permet d'affiner facilement les méthodes d'intégration de phrases, ce qui permet de créer des intégrations de phrases spécifiques à une tâche donnée et adaptées à des besoins particuliers. Pour en savoir plus, consultez le site web de Sentence Transformers

La bibliothèque offre une large sélection de modèles de transformateurs de phrases pré-entraînés pour plus de 50 langues, disponibles sur la plateforme Hugging Face. Les utilisateurs peuvent également entraîner ou affiner leurs propres modèles à l'aide de la bibliothèque, ce qui permet de créer des modèles personnalisés pour des cas d'utilisation uniques. L'équipe de Sentence Transformers a récemment publié une nouvelle version majeure (v3) qui améliore considérablement les capacités de cette bibliothèque, en particulier ses capacités d'ajustement.

La bibliothèque Sentence Transformers est rapide, complète et bien entretenue, c'est pourquoi nous l'utilisons dans ce tutoriel.

Créer son propre modèle de recherche sémantique

La création de votre propre modèle de recherche sémantique est un excellent moyen d'obtenir des résultats précis tout en garantissant une très faible latence. C'est encore plus vrai si vous déployez votre propre modèle de recherche sémantique sur un GPU.

Commençons par créer un petit ensemble de données contenant nos données. Créez un fichier CSV à une colonne (appelé "dataset.csv") contenant la documentation technique suivante sur les imprimantes HP (dans un scénario réel, vous voudrez bien sûr inclure beaucoup plus d'exemples) :

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

Chaque ligne peut contenir jusqu'à 512 tokens (ce qui équivaut approximativement à 400 mots), et pour maximiser la précision, il est recommandé de rester en dessous de 128 tokens (ce qui équivaut approximativement à 100 mots). Maintenant que nous avons nos 3 documents dans notre ensemble de données, nous pouvons encoder les données en utilisant notre modèle avec Sentence Transformers. Créez un script Python avec ce qui suit (assurez-vous que PyTorch et Sentence Transformers sont installés).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

Ce script télécharge et utilise paraphrase-multilingual-mpnet-base-v2 comme modèle de base et l'utilise pour encoder nos données. Vous pouvez choisir parmi de nombreux modèles pré-entraînés disponibles, en fonction de vos besoins (taille du modèle, cas d'utilisation, langues supportées, ...). En fonction de votre matériel, vous pourrez adapter le paramètre "batch_size" afin d'accélérer le processus d'encodage.

Une fois créé, vous pouvez utiliser votre modèle pour l'inférence avec le script Python suivant :

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

Le script d'inférence ci-dessus donne les résultats suivants :

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

Dans notre script d'inférence, le paramètre "top_k" détermine le nombre de résultats à renvoyer. Dans le résultat, nous affichons le texte correspondant de l'ensemble de données avec un score de confiance. Ce score est important car il nous aide à décider si nous voulons accepter la réponse ou non.

Générer une réponse en langage naturel avec l'IA générative

Comme vous pouvez le constater, la principale limite de la recherche sémantique est que le modèle renvoie le texte brut de l'ensemble de données sans répondre directement à la question. Nous voulons donc donner ce texte à un modèle d'IA génératif en tant que contexte afin de répondre à la question initiale en langage naturel.

Nous pouvons facilement y parvenir en exploitant un LLM avancé comme GPT-4 sur OpenAI ou LLaMA 3 et ChatDolphin sur NLP Cloud. Vous pouvez décider de conserver le meilleur résultat du modèle de recherche sémantique et de le transmettre comme contexte au LLM, ou de conserver plusieurs résultats. Voici un exemple d'invite utilisant uniquement le meilleur résultat :

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

Cette demande renvoie quelque chose comme cela :

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

Modèle de recherche sémantique avec données encodées VS stockage des encodages dans une base de données vectorielle

Dans un système RAG (Retrieval-Augmented Generation), la création d'un modèle de recherche sémantique avec des données encodées locales ou l'utilisation d'une base de données vectorielle sont deux options intéressantes.

Lorsque nous encodons nos propres données, nous les convertissons en tenseurs et avons ensuite la possibilité de les charger sur un GPU. D'autre part, une base de données vectorielle est une base de données spécialisée conçue pour stocker, indexer et interroger efficacement ces vecteurs à haute dimension.

Pour les entreprises qui souhaitent obtenir des temps de latence très faibles, il est recommandé d'encoder leurs propres données et de les charger dans un GPU afin d'améliorer le temps de calcul. Toutefois, cela se fait au détriment de la flexibilité, car vos données doivent être encodées à nouveau à chaque fois que l'ensemble de données change. Si vos données sous-jacentes changent très fréquemment, il peut être plus simple pour vous d'extraire les embeddings et de les stocker de manière incrémentale dans une base de données vectorielle (comme PG Vector par exemple).

Conclusion

La Génération Augmentée de Récupération est cruciale pour les entreprises qui cherchent à répondre à des questions sur des données spécifiques comme la documentation technique, les contrats, etc, car elle augmente considérablement la précision des résultats. La RAG est un élément clé d'un chatbot d'assistance, par exemple.

Sentence Transformers est une excellente bibliothèque qui peut être utilisée pour créer votre propre modèle de recherche sémantique basé sur vos propres données. Lorsqu'il est déployé sur un GPU et couplé à un modèle d'IA génératif avancé, un tel modèle s'avère extrêmement puissant.

Si vous n'êtes pas intéressé par la création et le déploiement de votre propre modèle de recherche sémantique basé sur les transformateurs de phrases, vous pouvez facilement le faire en un clic sur NLP Cloud. Essayez la recherche sémantique sur NLP Cloud dès maintenant !

Si vous avez des questions sur RAG, la recherche sémantique et les transformateurs de phrases, n'hésitez pas à nous les poser, c'est toujours un plaisir de vous conseiller !

Julien
Directeur technique de NLP Cloud