Время прочтения: 6 мин.

Одним из разделов NLP являются системы автоматического ответа на вопросы (Question Answering /QA). Разделяют три основных вида моделей QA:

  • Извлекающая QA: модель извлекает ответ из контекста. В качестве контекста выступает предоставленный текст, таблица или даже HTML;
  • Открытая генерирующая QA: модель генерирует произвольный текст непосредственно на основе контекста;
  • Закрытый генеративный QA: в этом случае контекст не предоставляется. Ответ полностью генерируется моделью.

Модели QA также могут быть с открытой или закрытой предметной областью. В зависимости от того, ограничены ли они конкретным направлением (например, юридические, медицинские документы) или нет.

Наиболее распространены извлекающие модели. Обычно они разработаны на основе encoder-моделей, чаще всего – на основе какой-то вариации, BERT-а (Bidirectional Encoder Representations from Transformers). Такие модели получают на вход контекст – текст, который должен содержать ответ и сам вопрос, на который нужно найти в контексте ответ. Важно отметить, что данная модель может найти ответ, только если он прямо указан в тексте – ответом является конкретное слово или набор слов в том же виде, в котором оно присутствует в тексте.

Модель для текстов на английском языке

Наиболее популярной моделью такого типа является roberta-base-squad2 от компании DEEPSET. Данная модель, как видно из названия, основана на RoBERTa-base (Robustly Optimized BERT Pretraining Approach) – оптимизации BERT, обученной на большем количестве данных только для маскированной языковой модели с динамическим маскированием и натренирована на датасете SQuAD2.0, содержащем 100 000 вопросов по отрывкам текста из статей Википедии и сами отрывки из SQuAD1.1 с ответами, и 50 000 аналогичных вопросов вместе с отрывками текста, не содержащими ответов.

Данная модель достигает следующих значений метрик: 0,79931 – Exact Match (полное совпадение ответов) и 0,8295 – f1-метрика, рассчитываемая для каждого слова в ответе.

Также существует оптимизированная модель tinyroberta-squad2, работающая в 2 раза быстрее и занимающая в 2 раза меньше места, но предоставляющая сравнимое качество предсказания (0,78863 – Exact Match и  0,82035 – F1). Рассмотрим результат работы модели на небольшом контрольном датасете:

1.	from transformers import AutoModelForQuestionAnswering, AutoTokenizer, pipeline
2.	 
3.	model_name = "deepset/tinyroberta-squad2"
4.	nlp = pipeline('question-answering', model=model_name, tokenizer=model_name)
5.	 
6.	QA_input = [
7.	{
8.	    'question': 'Чем представлены органические остатки?',
9.	    'context': 'В протерозойских отложениях органические остатки встречаются намного чаще, чем в архейских. Они представлены известковыми выделениями сине-зелёных водорослей, ходами червей, остатками кишечнополостных. Кроме известковых водорослей, к числу древнейших растительных остатков относятся скопления графито-углистого вещества, образовавшегося в результате разложения Corycium enigmaticum. В кремнистых сланцах железорудной формации Канады найдены нитевидные водоросли, грибные нити и формы, близкие современным кокколитофоридам. В железистых кварцитах Северной Америки и Сибири обнаружены железистые продукты жизнедеятельности бактерий.'
10.	},
11.	{
12.	    'question': 'Why is model conversion important?',
13.	    'context': 'The option to convert models between FARM and transformers gives freedom to the user and let people easily switch between frameworks.'
14.	},
15.	{
16.	    'question': 'Where do I live?',
17.	    'context': 'My name is Wolfgang and I live in Berlin.'
18.	},
19.	{
20.	    'question': 'Где я живу?',
21.	    'context': 'Меня зовут Вольфганг и я живу в Берлине.'
22.	},
23.	{
24.	    'question': "What's my name?",
25.	    'context': 'My name is Clara and I live in Berkeley.'
26.	},
27.	{
28.	    'question': "Как меня зовут?",
29.	    'context': 'Меня зовут Клара и я живу в Беркли.'
30.	},
31.	{
32.	    'question': "Когда были наполеоновские войны?",
33.	    'context': '«Война и мир» (рус. дореф. «Война и миръ») — роман-эпопея Льва Николаевича Толстого, описывающий русское общество в эпоху войн против Наполеона в 1805—1812 годах. Эпилог романа доводит повествование до 1820 года.'
34.	},
35.	{
36.	    'question': "Когда заканчивается «Война и мир»?",
37.	    'context': '«Война и мир» (рус. дореф. «Война и миръ») — роман-эпопея Льва Николаевича Толстого, описывающий русское общество в эпоху войн против Наполеона в 1805—1812 годах. Эпилог романа доводит повествование до 1820 года.'
38.	},
39.	]
40.	 
41.	print(model_name, " :")
42.	for el in QA_input:
43.	  print(nlp(el))

В результате выводятся степень уверенности в ответе, номер первого и последнего символа ответа и сам ответ:

1.	deepset/tinyroberta-squad2:
2.	{'score': 4.0230079321190715e-06, 'start': 92, 'end': 95, 'answer': 'Они'}
3.	{'score': 0.2624492645263672, 'start': 59, 'end': 132, 'answer': 'gives freedom to the user and let people easily switch between frameworks'}
4.	{'score': 0.9828766584396362, 'start': 34, 'end': 40, 'answer': 'Berlin'}
5.	{'score': 0.0375182144343853, 'start': 0, 'end': 4, 'answer': 'Меня'}
6.	{'score': 0.9775586724281311, 'start': 11, 'end': 16, 'answer': 'Clara'}
7.	{'score': 0.000773214444052428, 'start': 11, 'end': 16, 'answer': 'Клара'}
8.	{'score': 1.999256892304402e-05, 'start': 163, 'end': 176, 'answer': 'Эпилог романа'}
9.	{'score': 5.7890822063200176e-05, 'start': 75, 'end': 83, 'answer': 'Толстого'}

Модель достаточно уверенно находит ответ, состоящий из одного слова на английском языке. Ответ – фразу модель так же находит верно, но с гораздо меньшей уверенностью, так как возможными ответами также являются подмножества правильного ответа.

С русскоязычным текстом модель работает хуже: предсказан только один ответ с очень маленьким score, что неудивительно, так как она была натренирована исключительно на английских текстах. Для обработки текстов на русском языке необходима другая модель.

Модель для русскоязычных текстов

Одной из немногих открытых QA-моделей, поддерживающих русский язык, является xlm-roberta-large-qa-multilingual-finedtuned-ru, аналогично основанная на базе RoBERTa (только large, а не base версии). Главным отличием является то, что модель помимо SQuAD была натренирована на SberQuAD – русскоязычном аналоге SQuAD, состоящем из примерно 50 000 вопросов, и, как следствие, должна быть способна работать как с английским, так и с русским языками.

Данная модель достигает следующих значений метрик: 0,653 – Exact Match (полное совпадение ответов) и 0,843 – f1-метрика, рассчитываемая для каждого слова в ответе на датасете SberQuAD. Проверим ее работу на том же датасете:

1.	model_name_ru = "AlexKay/xlm-roberta-large-qa-multilingual-finedtuned-ru"
2.	 
3.	nlpRu = pipeline('question-answering', model=model_name_ru, tokenizer=model_name_ru)
4.	 
5.	print(model_name_ru, " :")
6.	for el in QA_input:
7.	  print(nlpRu(el))

Полученный результат:

1.	AlexKay/xlm-roberta-large-qa-multilingual-finedtuned-ru  :
2.	{'score': 0.27224454283714294, 'start': 108, 'end': 158, 'answer': ' известковыми выделениями сине-зелёных водорослей,'}
3.	{'score': 0.21338817477226257, 'start': 58, 'end': 133, 'answer': ' gives freedom to the user and let people easily switch between frameworks.'}
4.	{'score': 0.49746039509773254, 'start': 30, 'end': 41, 'answer': ' in Berlin.'}
5.	{'score': 0.8720728158950806, 'start': 29, 'end': 40, 'answer': ' в Берлине.'}
6.	{'score': 0.6046096086502075, 'start': 10, 'end': 16, 'answer': ' Clara'}
7.	{'score': 0.7703461647033691, 'start': 10, 'end': 16, 'answer': ' Клара'}
8.	{'score': 0.8588820695877075, 'start': 143, 'end': 162, 'answer': ' в 1805—1812 годах.'}
9.	{'score': 0.5338698029518127, 'start': 198, 'end': 212, 'answer': ' до 1820 года.'}

Теперь же модель может находить ответ в русскоязычном тексте. Занесем результаты в таблицу:

 tinyroberta-squad2xlm-roberta-large-qa-multilingual-finedtuned-ru
Русский 14.023e-06, неверно0.27, верно
Англ 10.2624, верно0.213, верно
Англ 20.9829, верно0.4975, верно*
Русск 20.0375, неверно0.8721, верно
Англ 30.9776, верно0.6046, верно
Русск 30.00078, верно0.7703, верно
Русск 41.9993e-05, неверно0.85888, верно
Русск 55.789e-05, неверно0.53387, верно

Указанная модель нашла правильные ответы на все вопросы (во втором английском вопросе модель возвращает лишний предлог, что показывает влияние ее тренировки на русской грамматике, даже на тексты на английском языке). Однако для всех тестов на английском языке уверенность двуязычной модели заметно ниже англоязычной, из-за чего для извлечения ответов на английском языке предпочтительно использовать tinyroberta-squad2.

На данный момент не существует открытой модели QA, одинаково хорошо работающей и с русскими, и с английскими текстами. Для работы с английским текстом рекомендуется использовать модель tinyroberta-squad2, а для русского – xlm-roberta-large-qa-multilingual-finedtuned-ru, хотя последняя также может работать и с англоязычными текстами.

Как говорил Рик Декард (Мечтают ли андроиды об электроовцах? Ф. Дик): “Я предпочитаю знать правду”. Мы же смогли узнать с точностью вплоть до 98,29%.