Рисунок 1: Три различных подхода QAG.
lmqg - это библиотека Python для вопросов и генерации ответов (QAG) с языковыми моделями (LMS). Здесь мы рассмотрим QAG на уровне параграфа, где пользователь предоставит контекст (абзац или документ), а модель будет генерировать список пар вопросов и ответов в контексте. С lmqg вы можете делать следующие вещи:
Обновление ноября 2023 года: китайские модели QAG теперь доступны как для lmqg , так и для AutoQG!
Обновление мая 2023 года: две статьи были приняты ACL 2023 (QAG AT SCUS, LMQG на демонстрации системы).
Обновление октября 2022 года. Наша бумага QG была принята EMNLP Main 2022.
Наши модели QAG могут быть сгруппированы в три типа: трубопровод , многозадачность и End2end (см. Рисунок 1). Трубопровод состоит из моделей генерации вопросов (QG) и извлечения ответов (AE) независимо, где AE анализирует все предложения в контексте для извлечения ответов, а QG будет генерировать вопросы по ответам. Многозадачность следует той же архитектуре, что и трубопровод , но модели QG и AE являются общей моделью, которая совместно настроена совместно. Наконец, модель End2end будет генерировать список паров вопросов и ответов. На практике трубопровод и многозадачный состав генерируют больше паров вопросов и ответов, в то время как End2end генерирует меньше, но в несколько раз быстрее, а качество сгенерированных паров вопросов и ответов зависит от языка. Все типы доступны на 9 разнообразных языках (EN/FR/JA/KO/RU/IT/ES/DE/ZH) через lmqg , и все модели совместно используются на HuggingFace (см. Модель карту). Чтобы узнать больше о QAG, пожалуйста, проверьте нашу статью ACL 2023, которая описывает модели QAG и сообщает о полном сравнении производительности каждых моделей QAG на каждом языке.
Рисунок 2: Пример QAG (A) и QG (B).
Все функции также поддерживают генерацию вопросов. Наша модель QG предполагает, что пользователь указал ответ в дополнение к контексту, и модель QG будет генерировать вопрос, который отвечает ответом, учитывая контекст (см. Рисунок 2 для сравнения QAG и QG). Чтобы узнать больше о QG, пожалуйста, проверьте нашу статью EMNLP 2022, которая подробно описывает модели QG.
Давайте сначала установим lmqg через PIP.
pip install lmqgСоздайте пары вопросов и ответов в нескольких строках.
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 мы поддерживаем итальянскую it , испанскую es , русский ru , корейский ko , японский ja , German de , French fr и китайский zh . Вы можете переключить язык, указав идентификатор языка в модели загрузки (например, TransformersQG(language="es") на испанский). Для более подробного использования, пожалуйста, прочитайте следующее раздел.
Основная функциональность lmqg - генерировать пары вопросов и ответов в данном контексте с удобным API. Доступные модели для каждого класса QAG можно найти на модельной карте.
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 и model_ae являются моделями QG и 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 является моделью QG. Смотрите QG-Bench, многоязычный эталон QG, для списка доступных моделей QG. 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 является моделью 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) - это бесплатное веб -приложение, которое размещает наши модели QAG.
lmqg также предоставляет интерфейс командной строки для тонкой настройки и оценки моделей QG, AE и QAG.
Для тонкой настройки QG (или AE, QAG) мы используем двухэтапную гиперпараметрическую оптимизацию, описанную как приведенную выше диаграмму. Следующая команда-запустить тонкую настройку с оптимизацией параметров.
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 Проверьте lmqg-train-search -h чтобы отобразить все параметры.
Модели с тонкой настройкой в Python следует ниже.
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 () Инструмент оценки сообщает BLEU4 , ROUGE-L , METEOR , BERTScore и MoverScore после QG-Bench. Из командной строки запустите следующую команду
lmqg-eval -m " lmqg/t5-large-squad-qg " -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " Где -m -это псевдоним модели на Huggingface или Path to Local Checkpoint, -e -это непосредственно для экспорта метрического файла, -d -это набор данных для оценки, а -l -язык тестового набора. Вместо того, чтобы запустить прогноз модели, вы можете предоставить вместо этого файл прогнозирования, чтобы избежать его вычисления каждый раз.
lmqg-eval --hyp-test ' {your prediction file} ' -e " ./eval_metrics " -d " lmqg/qg_squad " -l " en " Файл прогнозирования должен быть текстовым файлом генерации модели в каждой строке в порядке разделения test в целевом наборе данных (пример). Проверьте lmqg-eval -h чтобы отобразить все параметры.
Наконец, lmqg обеспечивает API REST, который проводит модельный вывод через API вывода HuggingFace. Вам нужен токен API HuggingFace, чтобы запустить свой собственный API и установить зависимости, как показано ниже.
pip install lmqg[api] Swagger UI доступен по адресу http://127.0.0.1:8088/docs , когда вы запускаете приложение локально (замените адрес на адрес вашего сервера).
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 Вы должны передать токен API HuggingFice через переменную переменную среды API_TOKEN . Основной конечной точкой является question_generation , который имеет следующие параметры,
| Параметр | Описание |
|---|---|
| input_text | Ввод текста, абзац или предложение для создания вопроса |
| язык | язык |
| qg_model | Модель генерации вопросов |
| respons_model | Ответ извлечение модель |
и вернуть список словарей с question и 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 " }
]
}Пожалуйста, цитируйте следующую бумагу, если вы используете какой -либо ресурс, и посмотрите код для воспроизведения модели, если это необходимо.
@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",
}