Figura 1: Três abordagens QAG distintas.
O lmqg é uma biblioteca Python para geração de perguntas e respostas (QAG) com modelos de idiomas (LMS). Aqui, consideramos QAG no nível do parágrafo, onde o usuário fornecerá um contexto (parágrafo ou documento), e o modelo gerará uma lista de pares de perguntas e respostas no contexto. Com lmqg , você pode fazer as seguintes:
Atualização de novembro de 2023: Os modelos QAG chineses agora estão disponíveis no lmqg e no AutoQG!
Atualização de maio de 2023: Dois trabalhos foram aceitos pelo ACL 2023 (QAG em Finding, LMQG na demonstração do sistema).
Atualização de outubro de 2022: Nosso artigo QG foi aceito pelo EMNLP Main 2022.
Nossos modelos QAG podem ser agrupados em três tipos: pipeline , multitarefa e end2end (veja a Figura 1). O oleoduto consiste em modelos de geração de perguntas (QG) e extração de resposta (AE) de forma independente, onde AE analisará todas as frases no contexto para extrair respostas, e QG gerará perguntas sobre as respostas. A multitarefa segue a mesma arquitetura que o pipeline , mas os modelos QG e AE são o modelo compartilhado ajustado em conjunto. Finalmente, o modelo END2END gerará uma lista de pares de perguntas e respostas de maneira pontual a ponta. Na prática, o pipeline e o multitarefa geram mais pares de perguntas e respostas, enquanto o END2END gera menos, mas algumas vezes mais rápido, e a qualidade dos pares de perguntas e respostas gerados dependem da linguagem. Todos os tipos estão disponíveis nos 9 idiomas diversos (en/fr/ja/ko/ru/it/es/de/zh) via lmqg , e os modelos são todos compartilhados no Huggingface (consulte o cartão do modelo). Para saber mais sobre o QAG, verifique nosso papel ACL 2023 que descreve os modelos QAG e relata uma comparação completa de desempenho de cada modelos QAG em todos os idiomas.
Figura 2: Um exemplo de QAG (A) e QG (B).
Todas as funcionalidades também suportam a geração de perguntas. Nosso modelo QG assume que o usuário especifique uma resposta além de um contexto, e o modelo QG gerará uma pergunta que é responsável pela resposta, dado o contexto (veja a Figura 2 para uma comparação de QAG e QG). Para saber mais sobre o QG, verifique nosso artigo EMNLP 2022 que descreve os modelos QG mais em detalhes.
Vamos instalar lmqg via PIP primeiro.
pip install lmqgGere pares de perguntas e respostas em algumas linhas.
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' )
] Além do English en , apoiamos a IT it , Espanha es , ru Russian, ko coreano, japonês ja , Alemão de , fr francês e zh chinês. Você pode alternar o idioma especificando o ID do idioma no modelo de carregamento (por exemplo, TransformersQG(language="es") para espanhol). Para um uso mais detalhado, leia a próxima seção.
A principal funcionalidade do lmqg é gerar pares de perguntas e respostas em um determinado contexto com uma API útil. Os modelos disponíveis para cada classe QAG podem ser encontrados no cartão 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 e model_ae são os modelos QG e 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 é o modelo QG. Consulte o banco QG, um benchmark multilíngue QG, para obter a lista de modelos QG disponíveis. 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 é o 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) é um aplicativo da web gratuito que hospeda nossos modelos QAG.
O lmqg também fornece uma interface da linha de comando para ajustar e avaliar os modelos QG, AE e QAG.
Para ajustar o modelo QG (ou AE, QAG), empregamos uma otimização hiper-parâmetro em dois estágios, descrita como o diagrama acima. O comando a seguir é executar o ajuste fino com otimização 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 exibir todas as opções.
Os modelos de ajuste fino em Python seguem abaixo.
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 () A ferramenta de avaliação relata BLEU4 , ROUGE-L , METEOR , BERTScore e MoverScore após o QG-banch. Na linha de comando, execute o seguinte comando
lmqg-eval -m " lmqg/t5-large-squad-qg " -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " Onde -m é um alias de modelo no Huggingface ou caminho para o ponto de verificação local, -e é o diretamente para exportar o arquivo métrico, -d é o conjunto de dados para avaliar e -l é o idioma do conjunto de testes. Em vez de executar a previsão do modelo, você pode fornecer um arquivo de previsão para evitar computá -lo a cada vez.
lmqg-eval --hyp-test ' {your prediction file} ' -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " O arquivo de previsão deve ser um arquivo de texto de geração de modelos em cada linha na ordem da divisão test no conjunto de dados de destino (amostra). Verifique lmqg-eval -h para exibir todas as opções.
Finalmente, lmqg fornece uma API REST, que hospeda a inferência do modelo através da API de inferência do HuggingFace. Você precisa do HuggingFace API Token para executar sua própria API e instalar dependências como abaixo.
pip install lmqg[api] A interface do usuário do Swagger está disponível em http://127.0.0.1:8088/docs , quando você executa o aplicativo localmente (substitua o endereço pelo endereço do seu 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 Você deve passar no token da API Huggingface através da variável ambiental API_TOKEN . O principal terminal é question_generation , que possui os seguintes parâmetros,
| Parâmetro | Descrição |
|---|---|
| input_text | texto de entrada, um parágrafo ou uma frase para gerar perguntas |
| linguagem | linguagem |
| qg_model | Modelo de geração de perguntas |
| Responder_model | Modelo de extração de resposta |
e devolver uma lista de dicionários com question e 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 o papel a seguir se você usar algum recurso e veja o código para reproduzir o modelo, se necessário.
@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",
}