Cet article explore la mise en œuvre d'un système de questions-réponses simple mais efficace qui combine des modèles modernes basés sur des transformateurs. Le système utilise T5 (Text-to-Text Transfer Transformer) pour la génération de réponses et des transformateurs de phrases pour la correspondance de similarité sémantique.
Dans mon article précédent, j'ai expliqué comment créer une API de traduction simple avec une interface Web à l'aide d'un modèle LLM fondamental gratuit. Cette fois, plongeons-nous dans la création d'un système de génération de récupération augmentée (RAG) à l'aide de modèles LLM gratuits basés sur des transformateurs et d'une base de connaissances.
RAG (Retrieval-Augmented Generation) est une technique qui combine deux éléments clés :
Récupération : Tout d'abord, il recherche dans une base de connaissances (comme des documents, des bases de données, etc.) pour trouver des informations pertinentes pour une requête donnée. Cela implique généralement :
Génération : Ensuite, il utilise un modèle de langage (comme T5 dans notre code) pour générer une réponse par :
Combiner les informations récupérées avec la question d'origine
Créer une réponse en langage naturel basée sur ce contexte
Dans le code :
Avantages du RAG :
L'implémentation consiste en une classe SimpleQASystem qui orchestre deux composants principaux :
Vous pouvez télécharger la dernière version du code source ici : https://github.com/alexander-uspenskiy/rag_project
Ce guide vous aidera à configurer votre projet Retrieval-Augmented Generation (RAG) sur macOS et Windows.
Pour macOS :
Installer Homebrew (s'il n'est pas déjà installé) :
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Installez Python 3.8 en utilisant Homebrew
brasser installer python@3.10
Pour Windows :
Téléchargez et installez Python 3.8 depuis python.org
Assurez-vous de cocher « Ajouter Python au PATH » lors de l'installation
macOS :
mkdir RAG_project
cd RAG_project
Windows :
mkdir RAG_project
cd RAG_project
Étape 2 : configurer l'environnement virtuel
macOS :
python3 -m venv venv
source venv/bin/activate
Windows :
python -m venv venv
venvScriptsactivate
**Composants de base
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
Le système s'initialise avec deux modèles principaux :
T5-small : Une version plus petite du modèle T5 pour générer des réponses
paraphrase-MiniLM-L6-v2 : Un modèle de transformateur de phrases pour encoder du texte en vecteurs significatifs
2. Préparation de l'ensemble de données
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
La phase de préparation du jeu de données :
1. Traitement des questions
Lorsqu'un utilisateur soumet une question, le système suit ces étapes :
Génération d'intégration : la question est convertie en représentation vectorielle en utilisant le même modèle de transformateur de phrase que celui utilisé pour les réponses.
Recherche sémantique : le système trouve la réponse stockée la plus pertinente par :
2. Génération de réponses
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
Le processus de génération de réponses :
3. Réponse Nettoyage
def __init__(self): self.model_name = 't5-small' self.tokenizer = T5Tokenizer.from_pretrained(self.model_name) self.model = T5ForConditionalGeneration.from_pretrained(self.model_name) self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
Vous pouvez télécharger la dernière version du code source ici : https://github.com/alexander-uspenskiy/rag_project
def prepare_dataset(self, data: List[Dict[str, str]]): self.answers = [item['answer'] for item in data] self.answer_embeddings = [] for answer in self.answers: embedding = self.encoder.encode(answer, convert_to_tensor=True) self.answer_embeddings.append(embedding)
Le système utilise explicitement le processeur pour éviter les problèmes de mémoire
Les intégrations sont converties en tenseurs CPU si nécessaire
La longueur d'entrée est limitée à 512 jetons
Exemple d'utilisation
def get_answer(self, question: str) -> str: # ... semantic search logic ... input_text = f"Given the context, what is the answer to the question: {question} Context: {context}" input_ids = self.tokenizer(input_text, max_length=512, truncation=True, padding='max_length', return_tensors='pt').input_ids outputs = self.model.generate(input_ids, max_length=50, num_beams=4, early_stopping=True, no_repeat_ngram_size=2
Exécuter dans le terminal
Évolutivité :
L'implémentation actuelle conserve toutes les intégrations en mémoire
Pourrait être amélioré avec des bases de données vectorielles pour des applications à grande échelle
Qualité des réponses :
S'appuie fortement sur la qualité de l'ensemble de données de réponses fourni
Limité par la fenêtre contextuelle de T5-small
Pourrait bénéficier d'une validation des réponses ou d'un score de confiance
Performances :
Cette implémentation fournit une base solide pour un système de questions-réponses, combinant les atouts de la recherche sémantique et de la génération de texte basée sur un transformateur. N'hésitez pas à jouer avec les paramètres du modèle (comme max_length, num_beams, early_stopping, no_repeat_ngram_size, etc.) pour trouver un meilleur moyen d'obtenir des réponses plus cohérentes et stables. Bien qu'il y ait place à l'amélioration, la mise en œuvre actuelle offre un bon équilibre entre complexité et fonctionnalité, ce qui la rend adaptée aux fins éducatives et aux applications à petite et moyenne échelle.
Bon codage !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!