Figura 1: Tres enfoques de QAG distintos.
El lmqg es una biblioteca de Python para la generación de preguntas y respuestas (QAG) con modelos de idiomas (LMS). Aquí, consideramos QAG a nivel de párrafo, donde el usuario proporcionará un contexto (párrafo o documento), y el modelo generará una lista de pares de preguntas y respuestas en el contexto. Con lmqg , puede hacer las siguientes cosas:
Actualización de noviembre de 2023: ¡los modelos QAG chinos ahora están disponibles tanto en lmqg como en AutoQG!
Actualización de mayo de 2023: ACL 2023 aceptó dos documentos (QAG en Finding, LMQG en la demostración del sistema).
Actualización de octubre de 2022: nuestro documento QG fue aceptado por EMNLP Main 2022.
Nuestros modelos QAG se pueden agrupar en tres tipos: tubería , multitarea y end2end (ver Figura 1). La tubería consta de modelos de generación de preguntas (QG) y extracción de respuestas (AE) de forma independiente, donde AE analizará todas las oraciones en el contexto para extraer respuestas, y QG generará preguntas sobre las respuestas. La multitarea sigue la misma arquitectura que la tubería , pero los modelos QG y AE se comparten con el modelo compartido conjuntamente. Finalmente, el modelo End2END generará una lista de pares de preguntas y respuestas de una manera de extremo a extremo. En la práctica, la tubería y la multitarea generan más pares de preguntas y respuestas, mientras que End2End genera menos pero unas pocas veces más rápido, y la calidad de los pares de preguntas y respuestas generados depende del lenguaje. Todos los tipos están disponibles en los 9 idiomas diversos (EN/FR/JA/KO/RU/IT/ES/DE/ZH) a través de lmqg , y todos los modelos se comparten en Huggingface (ver la tarjeta modelo). Para saber más sobre QAG, consulte nuestro documento ACL 2023 que describe los modelos QAG e informa una comparación de rendimiento completa de cada modelos QAG en cada idioma.
Figura 2: Un ejemplo de QAG (A) y QG (B).
Todas las funcionalidades también apoyan la generación de preguntas. Nuestro modelo de QG asume que el usuario especifica una respuesta además de un contexto, y el modelo QG generará una pregunta que sea respondida por la respuesta dada el contexto (consulte la Figura 2 para una comparación de QAG y QG). Para saber más sobre QG, consulte nuestro artículo EMNLP 2022 que describe los modelos QG más en detalle.
Instalemos lmqg a través de PIP primero.
pip install lmqgGenere pares de preguntas y respuestas en algunas líneas.
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' )
] Además del inglés en , apoyamos it italiana, es , ruso ru , coreano ko , japonés ja , alemán de , French fr , y chino zh . Puede cambiar el idioma especificando la ID del idioma en el modelo de carga (por ejemplo, TransformersQG(language="es") para español). Para un uso más detallado, lea la siguiente sección.
La principal funcionalidad de lmqg es generar pares de preguntas y respuestas en un contexto dado con una práctica API. Los modelos disponibles para cada clase QAG se pueden encontrar en la tarjeta modelo.
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 y model_ae son los modelos QG y AE respectivamente. 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 es el modelo QG. Consulte el Banco QG, un punto de referencia de QG multilingüe, para la lista de modelos 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 es el modelo 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) es una aplicación web gratuita que aloja nuestros modelos QAG.
El lmqg también proporciona una interfaz de línea de comando para ajustar y evaluar los modelos QG, AE y QAG.
Para ajustar el modelo QG (o AE, QAG), empleamos una optimización de hiper-paraméter de dos etapas, descrita como el diagrama anterior. El siguiente comando es ejecutar la optimización de parámetros con la optimización de parámetros.
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 Verifique lmqg-train-search -h para mostrar todas las opciones.
Los modelos de ajuste fino en Python siguen a continuación.
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 () La herramienta de evaluación informa BLEU4 , ROUGE-L , METEOR , BERTScore y MoverScore después de QG-Bench. Desde la línea de comando, ejecute el siguiente comando
lmqg-eval -m " lmqg/t5-large-squad-qg " -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " donde -m es un modelo de alias en Huggingface o ruta al punto de control local, -e es directamente para exportar el archivo métrico, -d es el conjunto de datos para evaluar y -l es el lenguaje del conjunto de pruebas. En lugar de ejecutar la predicción del modelo, puede proporcionar un archivo de predicción para evitar calcularlo cada vez.
lmqg-eval --hyp-test ' {your prediction file} ' -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " El archivo de predicción debe ser un archivo de texto de la generación de modelos en cada línea en el orden de la división test en el conjunto de datos de destino (muestra). Verifique lmqg-eval -h para mostrar todas las opciones.
Finalmente, lmqg proporciona una API REST que aloja la inferencia del modelo a través de la API de inferencia de Huggingface. Necesita Huggingface API Token para ejecutar su propia API e instalar dependencias como se muestra a continuación.
pip install lmqg[api] Swagger UI está disponible en http://127.0.0.1:8088/docs , cuando ejecuta la aplicación localmente (reemplace la dirección por la dirección de su servidor).
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 Debe pasar el token API Huggingface a través de la variable ambiental API_TOKEN . El punto final principal es question_generation , que tiene los siguientes parámetros,
| Parámetro | Descripción |
|---|---|
| input_text | texto de entrada, un párrafo o una oración para generar preguntas |
| idioma | idioma |
| QG_MODEL | modelo de generación de preguntas |
| Respuesta_modelo | modelo de extracción de respuesta |
y devuelve una lista de diccionarios con question y 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 " }
]
}Cite el siguiente documento si usa algún recurso y vea el código para reproducir el modelo si es necesario.
@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",
}