Figure 1: Trois approches Qag distinctes.
Le lmqg est une bibliothèque Python pour la génération de questions et de réponses (QAG) avec des modèles de langage (LMS). Ici, nous considérons le QAG au niveau du paragraphe, où l'utilisateur fournira un contexte (paragraphe ou document), et le modèle générera une liste de paires de questions et réponses sur le contexte. Avec lmqg , vous pouvez faire des choses en suivant:
MISE À JOUR NOV 2023: Les modèles de QAG chinois sont désormais disponibles sur lmqg et AutoQG!
MISE À JOUR MAI 2023: Deux articles ont été acceptés par ACL 2023 (QAG à la recherche, LMQG à la démonstration du système).
Mise à jour octobre 2022: Notre journal QG a été accepté par EMNLP Main 2022.
Nos modèles QAG peuvent être regroupés en trois types: pipeline , multitâche et end2end (voir figure 1). Le pipeline est constitué de modèles de génération de questions (QG) et d'extraction des réponses (AE) indépendamment, où AE analysera toutes les phrases dans le contexte pour extraire les réponses, et QG générera des questions sur les réponses. La multitâche suit la même architecture que le pipeline , mais les modèles QG et AE sont des modèles partagés affinés conjointement. Enfin, le modèle End2end générera une liste de paires de questions et réponses de bout en bout. Dans la pratique, le pipeline et le multitâche génèrent plus de paires de questions et réponses, tandis que End2end génère moins mais quelques fois plus rapide, et la qualité des paires de questions et réponses générées dépend de la langue. Tous les types sont disponibles dans les 9 langues diverses (EN / FR / JA / KO / RU / IT / ES / DE / ZH) via lmqg , et les modèles sont tous partagés sur HuggingFace (voir la carte du modèle). Pour en savoir plus sur QAG, veuillez vérifier notre article ACL 2023 qui décrit les modèles QAG et rapporte une comparaison complète de performances de chaque modèle QAG dans chaque langue.
Figure 2: Un exemple de QAG (A) et Qg (B).
Toutes les fonctionnalités soutiennent également la génération de questions. Notre modèle QG suppose que l'utilisateur spécifie une réponse en plus d'un contexte, et le modèle QG générera une question qui est responsable par la réponse compte tenu du contexte (voir la figure 2 pour une comparaison de QAG et QG). Pour en savoir plus sur QG, veuillez consulter notre article EMNLP 2022 qui décrit plus en détail les modèles QG.
Installons d'abord lmqg via PIP.
pip install lmqgGénérez des paires de questions et réponses en quelques lignes.
from lmqg import TransformersQG
model = TransformersQG ( language = "en" )
context = "William Turner was an English painter who specialised in watercolour landscapes. He is often known "
"as William Turner of Oxford or just Turner of Oxford to distinguish him from his contemporary, "
"J. M. W. Turner. Many of Turner's paintings depicted the countryside around Oxford. One of his "
"best known pictures is a view of the city of Oxford from Hinksey Hill."
qa = model . generate_qa ( context )
print ( qa )
[
( 'Who was an English painter who specialised in watercolour landscapes?' , 'William Turner' ),
( 'What is William Turner often known as?' , 'William Turner of Oxford or just Turner of Oxford' ),
( "What did many of Turner's paintings depict?" , 'the countryside around Oxford' ),
( "What is one of Turner's best known pictures?" , 'a view of the city of Oxford from Hinksey Hill' )
] En plus de l'anglais en , nous soutenons it italien, es espagnols, Russian ru , Korean ko , JAME ja , ALLEMAND de , FRANS fr et zh chinois. Vous pouvez changer la langue en spécifiant l'ID de langue au modèle de chargement (par exemple, TransformersQG(language="es") pour l'espagnol). Pour une utilisation plus détaillée, veuillez lire la section suivante.
La principale fonctionnalité de lmqg est de générer des paires de questions et réponses sur un contexte donné avec une API pratique. Les modèles disponibles pour chaque classe QAG peuvent être trouvés sur la carte du modèle.
from pprint import pprint
from lmqg import TransformersQG
# initialize model
model = TransformersQG ( 'lmqg/t5-base-squad-qag' ) # or TransformersQG(model='lmqg/t5-base-squad-qg-ae')
# paragraph to generate pairs of question and answer
context = "William Turner was an English painter who specialised in watercolour landscapes. He is often known "
"as William Turner of Oxford or just Turner of Oxford to distinguish him from his contemporary, "
"J. M. W. Turner. Many of Turner's paintings depicted the countryside around Oxford. One of his "
"best known pictures is a view of the city of Oxford from Hinksey Hill."
# model prediction
question_answer = model . generate_qa ( context )
# the output is a list of tuple (question, answer)
pprint ( question_answer )
[
( 'Who was an English painter who specialised in watercolour landscapes?' , 'William Turner' ),
( 'What is William Turner often known as?' , 'William Turner of Oxford or just Turner of Oxford' ),
( "What did many of Turner's paintings depict?" , 'the countryside around Oxford' ),
( "What is one of Turner's best known pictures?" , 'a view of the city of Oxford from Hinksey Hill' )
]model et model_ae sont respectivement les modèles QG et AE. from pprint import pprint
from lmqg import TransformersQG
# initialize model
model = TransformersQG ( model = 'lmqg/t5-base-squad-qg' , model_ae = 'lmqg/t5-base-squad-ae' )
# paragraph to generate pairs of question and answer
context = "William Turner was an English painter who specialised in watercolour landscapes. He is often known "
"as William Turner of Oxford or just Turner of Oxford to distinguish him from his contemporary, "
"J. M. W. Turner. Many of Turner's paintings depicted the countryside around Oxford. One of his "
"best known pictures is a view of the city of Oxford from Hinksey Hill."
# model prediction
question_answer = model . generate_qa ( context )
# the output is a list of tuple (question, answer)
pprint ( question_answer )
[
( 'Who was an English painter who specialised in watercolour landscapes?' , 'William Turner' ),
( 'What is another name for William Turner?' , 'William Turner of Oxford' ),
( "What did many of William Turner's paintings depict around Oxford?" , 'the countryside' ),
( 'From what hill is a view of the city of Oxford taken?' , 'Hinksey Hill.' )
]model est le modèle QG. Voir le QG-Bench, une référence QG multilingue, pour la liste des modèles QG disponibles. from pprint import pprint
from lmqg import TransformersQG
# initialize model
model = TransformersQG ( model = 'lmqg/t5-base-squad-qg' )
# a list of paragraph
context = [
"William Turner was an English painter who specialised in watercolour landscapes" ,
"William Turner was an English painter who specialised in watercolour landscapes"
]
# a list of answer (same size as the context)
answer = [
"William Turner" ,
"English"
]
# model prediction
question = model . generate_q ( list_context = context , list_answer = answer )
pprint ( question )
[
'Who was an English painter who specialised in watercolour landscapes?' ,
'What nationality was William Turner?'
]model est le modèle QG. from pprint import pprint
from lmqg import TransformersQG
# initialize model
model = TransformersQG ( model = 'lmqg/t5-base-squad-ae' )
# model prediction
answer = model . generate_a ( "William Turner was an English painter who specialised in watercolour landscapes" )
pprint ( answer )
[ 'William Turner' ]AutoQG (https://autoqg.net) est une application Web gratuite hébergeant nos modèles QAG.
Le lmqg fournit également une interface de ligne de commande pour affiner et évaluer les modèles QG, AE et QAG.
Pour affiner le modèle QG (ou AE, QAG), nous utilisons une optimisation hyper-paramètre à deux étapes, décrite comme un diagramme ci-dessus. La commande suivante consiste à exécuter le réglage fin avec l'optimisation des paramètres.
lmqg-train-search -c " tmp_ckpt " -d " lmqg/qg_squad " -m " t5-small " -b 64 --epoch-partial 5 -e 15 --language " en " --n-max-config 1
-g 2 4 --lr 1e-04 5e-04 1e-03 --label-smoothing 0 0.15 Vérifiez lmqg-train-search -h pour afficher toutes les options.
Les modèles de réglage fin à Python suit ci-dessous.
from lmqg import GridSearcher
trainer = GridSearcher (
checkpoint_dir = 'tmp_ckpt' ,
dataset_path = 'lmqg/qg_squad' ,
model = 't5-small' ,
epoch = 15 ,
epoch_partial = 5 ,
batch = 64 ,
n_max_config = 5 ,
gradient_accumulation_steps = [ 2 , 4 ],
lr = [ 1e-04 , 5e-04 , 1e-03 ],
label_smoothing = [ 0 , 0.15 ]
)
trainer . run () L'outil d'évaluation rapporte BLEU4 , ROUGE-L , METEOR , BERTScore et MoverScore après QG-Bench. À partir de la ligne de commande, exécutez la commande suivante
lmqg-eval -m " lmqg/t5-large-squad-qg " -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " Où -m est un alias modèle sur HuggingFace ou le chemin du point de contrôle local, -e , c'est directement pour exporter le fichier métrique, -d est l'ensemble de données à évaluer, et -l est le langage de l'ensemble de tests. Au lieu d'exécuter la prédiction du modèle, vous pouvez fournir un fichier de prédiction à la place pour éviter de le calculer à chaque fois.
lmqg-eval --hyp-test ' {your prediction file} ' -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " Le fichier de prédiction doit être un fichier texte de la génération de modèles dans chaque ligne dans l'ordre de la fraction test dans l'ensemble de données cible (exemple). Vérifiez lmqg-eval -h pour afficher toutes les options.
Enfin, lmqg fournit une API REST qui héberge l'inférence du modèle par API d'inférence HuggingFace. Vous avez besoin de token API HuggingFace pour exécuter votre propre API et d'installer des dépendances comme ci-dessous.
pip install lmqg[api] L'interface utilisateur de Swagger est disponible sur http://127.0.0.1:8088/docs , lorsque vous exécutez l'application localement (remplacez l'adresse par l'adresse de votre serveur).
export API_TOKEN={Your Huggingface API Token}
uvicorn app:app --host 0.0.0.0 --port 8088docker build -t lmqg/app:latest . --build-arg api_token={Your Huggingface API Token}
docker run -p 8080:8080 lmqg/app:latestuvicorn app_local:app --host 0.0.0.0 --port 8088 Vous devez passer le jeton API HuggingFace via la variable environnementale API_TOKEN . Le point de terminaison principal est question_generation , qui a des paramètres suivants,
| Paramètre | Description |
|---|---|
| input_text | Texte d'entrée, paragraphe ou une phrase pour générer une question |
| langue | langue |
| QG_Model | Modèle de génération de questions |
| réponse_model | Modèle d'extraction de réponse |
et retourner une liste de dictionnaires avec question et answer .
{
" qa " : [
{ " question " : " Who founded Nintendo Karuta? " , " answer " : " Fusajiro Yamauchi " },
{ " question " : " When did Nintendo distribute its first video game console, the Color TV-Game? " , " answer " : " 1977 " }
]
}Veuillez citer le papier suivant si vous utilisez une ressource et consultez le code pour reproduire le modèle si nécessaire.
@inproceedings{ushio-etal-2022-generative,
title = "{G}enerative {L}anguage {M}odels for {P}aragraph-{L}evel {Q}uestion {G}eneration",
author = "Ushio, Asahi and
Alva-Manchego, Fernando and
Camacho-Collados, Jose",
booktitle = "Proceedings of the 2022 Conference on Empirical Methods in Natural Language Processing",
month = dec,
year = "2022",
address = "Abu Dhabi, U.A.E.",
publisher = "Association for Computational Linguistics",
}
@inproceedings{ushio-etal-2023-an-empirical,
title = "An Empirical Comparison of LM-based Question and Answer Generation Methods",
author = "Ushio, Asahi and
Alva-Manchego, Fernando and
Camacho-Collados, Jose",
booktitle = "Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics: Findings",
month = Jul,
year = "2023",
address = "Toronto, Canada",
publisher = "Association for Computational Linguistics",
}
@inproceedings{ushio-etal-2023-a-practical-toolkit,
title = "A Practical Toolkit for Multilingual Question and Answer Generation",
author = "Ushio, Asahi and
Alva-Manchego, Fernando and
Camacho-Collados, Jose",
booktitle = "Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics: System Demonstrations",
month = Jul,
year = "2023",
address = "Toronto, Canada",
publisher = "Association for Computational Linguistics",
}