Позвольте моделям-трансформерам делать аннотации за вас с помощью нового генератора вопросов Haystack.

Без помеченных наборов данных не было бы контролируемого машинного обучения: они обеспечивают достоверность, необходимую для построения прогностических моделей. Обученные аннотаторы тратят много часов на создание набора данных — кропотливая и монотонная задача. Но хотя машинному обучению удалось автоматизировать многие задачи, которые ранее зависели от человеческого опыта, маркировка данных сама по себе была препятствием для волны автоматизации. То есть до недавнего времени.

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

Читайте дальше, чтобы узнать о Генераторе вопросов и о том, как вы можете использовать его для облегчения процесса написания аннотаций, включая лучшие практики для рабочего процесса человек в цикле.

Что такое генерация вопросов?

Генерация вопросов — это процесс автоматического создания вопросов из текста. Обычно он связан с созданием вопросов, направленных на поиск фактов, таких как вопросы о людях, местах или датах.

Успешная модель генерации вопросов должна учитывать как синтаксис, так и семантику. Модели недостаточно генерировать грамматически правильные вопросы — ей также необходимо понимать, какие части текста являются центральными, и задавать интересные вопросы. Таким образом, генерация вопросов тесно связана с пониманием естественного языка и обобщением текста.

Когда полезно генерировать вопросы?

Давайте рассмотрим три случая использования, где генератор вопросов может пригодиться.

1. Учебный материал

Классический вариант использования генерации вопросов — автоматическое создание учебного материала. В этом сценарии генератор вопросов предлагает вопросы, которые используются для проверки того, понял ли учащийся заданный текст.

2. Исследование данных

Вариант использования генерации вопросов, с которым вы, вероятно, знакомы, — это автоматическое предложение вопроса. Поисковая система Google использует варианты вопросов, чтобы помочь пользователям ориентироваться и исследовать данные. Для определенных запросов Google возвращает раскрывающийся список «Люди также спрашивают» с автоматически сгенерированными связанными вопросами. При нажатии на вопрос поле расширяется и выделяет соответствующий диапазон ответов в тексте. Оказывается, это отличный способ узнать, какие еще темы освещает ваш документ.

3. Автоматическая аннотация наборов данных «вопрос-ответ»

Еще один ключевой вариант использования — на котором мы сосредоточимся в этой статье — это генерация вопросов в контексте аннотаций. Аннотирование наборов данных — трудоемкий и дорогостоящий процесс, который часто требует, чтобы аннотаторы вручную маркировали каждую точку данных. В то же время репрезентативные и высококачественные наборы данных играют центральную роль в машинном обучении: они не только позволяют вам строить модели, которые могут обобщать, но также необходимы для оценки производительности вашей системы.

Использование генератора вопросов для извлечения вопросов из документов может сэкономить много времени аннотаторам. Поскольку вопросы генерируются автоматически, аннотаторам нужно только проверять качество вопросов. Эти профессионалы сохраняют уместные и правильно сформулированные вопросы, но отбрасывают или исправляют нерелевантные или неправильно сформулированные. В этом рабочем процессе аннотаторы затем вручную отмечают отрывки ответов на сгенерированные вопросы. Однако, комбинируя Генератор вопросов с Читателем, вы также можете автоматизировать маркировку диапазонов ответов — как продемонстрирует наш пример ниже.

Как работает генератор вопросов Haystack?

Генератор вопросов использует языковую модель на основе Transformer, обученную на большом количестве пар вопрос-ответ. Модель по умолчанию — это версия модели T5, которая лучше всего подходит для создания вопросов из текстов общего характера. Если ваши документы относятся к какой-либо специализированной области — скажем, юриспруденции или медицине — или написаны на языке, отличном от английского, вы можете подключить другую модель. Модельный хаб Hugging Face — хорошее место для поиска моделей для различных вариантов использования.

Использовать Генератор вопросов просто. Сначала мы импортируем класс и инициализируем его:

from haystack.nodes import QuestionGenerator
question_generator = QuestionGenerator(model_name_or_path=”valhalla/t5-base-e2e-qg”)

Затем мы создаем текстовый фрагмент, из которого генерируются вопросы:

text = “””Macaroni and cheese is a dish of macaroni that is covered in a cheese sauce. It can be bought packaged. It was introduced in America by Thomas Jefferson’s enslaved chef, James Hemings, in 1803.”””

Наконец, мы запускаем генератор вопросов для нашего текста:

question_generator.generate(text)
>>> [‘ What is a dish of macaroni that is covered in a cheese sauce?’,
 ‘ When was macaroni and cheese introduced in America?’,
 ‘ Who introduced macaroni and cheese in America in 1803?’,
 ‘ What is the name of the dish that is topped with a sauce of cheese?’]

Всего за несколько строк кода нам удалось с нуля создать четыре семантически и синтаксически правильных вопроса!

Обратите внимание, что Генератор вопросов отличается от Генератора. Хотя оба компонента генерируют текст, Генератор используется для созданияответов, а не вопросов.

Как генерировать вопросы в Haystack

Когда дело доходит до интеграции генератора вопросов в ваш рабочий процесс аннотаций, вы можете использовать один из наших готовых конвейеров генерации вопросов. В Haystack есть два основных класса пайплайна, которые мгновенно запустят ваши системы генерации вопросов:

Генерация вопросов

QuestionGenerationPipeline — это оболочка для генератора вопросов. Этот конвейер имеет ту же функциональность, что и Генератор вопросов: документы получены, вопросы получены.

Генерация вопросов и ответов

QuestionAnswerGenerationPipeline объединяет Генератор Вопросов с Читателем. В этом конвейере Генератор вопросов сначала создает вопросы так, как мы видели выше. Затем Reader возвращает ответы, а также контексты, из которых были извлечены ответы. Вы можете использовать этот конвейер для создания полностью синтетических наборов данных ответов на вопросы в полностью автоматизированном процессе. Мы покажем вам, как на примере ниже.

Практический пример: автоматическое аннотирование наборов данных ответов на вопросы

Вы можете использовать генерацию вопросов, чтобы дополнить существующий набор данных QA новыми данными или даже создать весь набор данных с нуля. Давайте посмотрим, как это сделать с QuestionAnswerGenerationPipeline. Мы будем работать с небольшой коллекцией текстов о еде из Википедии:

texts = [
    {“text”:”Macaroni and cheese is a dish of macaroni that is covered in a cheese sauce. It can be bought packaged. It’s an American dish, introduced to America by Thomas Jefferson’s enslaved chef, James Hemings, in 1803.”},
    {“text”:”Falafel is a kind of vegetarian food. It is a deep-fried ball or patty made from ground chickpeas, fava beans, or both. The dish originally came from Egypt.”},
    {“text”:”Ravioli is a type of Italian food pasta dish. It is usually two layers of pasta dough with a filling between the two layers. There are many different recipes, with different kinds of fillings. The most common fillings are meat, vegetables or blackboard cheese.”}
]

Начнем с импорта и инициализации отдельных компонентов:

from haystack.nodes import QuestionGenerator, FARMReader
question_generator = QuestionGenerator()
reader = FARMReader(“deepset/roberta-base-squad2”)

Затем мы поместим два узла в конвейер:

from haystack.pipeline import QuestionAnswerGenerationPipeline
qag_pipeline = QuestionAnswerGenerationPipeline(question_generator, reader)

Теперь мы запустим конвейер на нашем небольшом текстовом корпусе и сохраним результаты в списке:

results = []
for doc in document_store:
    results.append(qag_pipeline.run(documents=[doc]))

Наконец, мы можем распечатать автоматически сгенерированные пары вопрос-ответ:

for doc in results:
    for qa_pair in doc[“results”]:
        print(“Question: {}\nAnswer: {}\n”.format(qa_pair[“query”], qa_pair[“answers”][0][“answer”]))

Это выводит следующие пары вопрос-ответ:

>>> Question: What is a dish of macaroni covered in a cheese sauce?
Answer: Macaroni and cheese
Question: What is the name of the common American food introduced to America by Thomas Jefferson’s enslaved chef, James Hemings?
Answer: Macaroni and cheese
Question: In what year was Macaroni and cheese introduced?
Answer: 1803
Question: What type of food is falafel?
Answer: vegetarian
Question: What is a deep-fried ball or patty made from ground chickpeas, fava beans or both?
Answer: Falafel
Question: Where did Falafel originate?
Answer: Egypt
Question: What is a type of Italian food pasta dish?
Answer: Ravioli
Question: What is usually two layers of pasta dough with a filling between the two layers?
Answer: Ravioli
Question: There are many different recipes with different kinds of what?
Answer: fillings
Question: What are the most common fillings?
Answer: meat, vegetables or blackboard cheese

И вот он: наш полностью сгенерированный машиной набор данных вопросов и ответов! Как видите, не все пары вопрос-ответ правильно сформированы. Основная проблема, похоже, заключается в специфике: например, вопрос «Какие пломбы наиболее распространены?» вряд ли на него можно ответить, не указав, о каком типе пищи идет речь. Точно так же вопрос «Есть много разных рецептов с разными видами чего?» просто не дает достаточного контекста для адекватного ответа.

Как показывают эти примеры, генерация наборов данных для ответов на синтетические вопросы работает лучше всего, когда процесс контролируется человеком. Контролируемая настройка по-прежнему сэкономит аннотаторам много времени без ущерба для качества генерируемых данных. Это может даже помочь улучшить ваши существующие языковые модели, как мы объясним ниже.

Человек в цикле: получение максимальной отдачи от автоматизированной аннотации ответов на вопросы

Чтобы избежать добавления ошибочных пар вопрос-ответ в ваши наборы данных, рекомендуется включать человека-наблюдателя в автоматический цикл аннотации. Более того, сценарий с участием человека может даже помочь вам создать более надежные модели. Мы опишем процесс ниже.

Аннотатор-человек просматривает автоматически сгенерированные пары вопрос-ответ и при необходимости вносит исправления. Когда дело доходит до вопросов, аннотатор может отфильтровывать ошибочные, как те, что мы видели выше. Кроме того, специалист может вручную исправлять неправильные ответы. Этот аспект процесса помогает выявить случаи, когда языковая модель не может найти правильные ответы. Затем вы можете повторно обучить свою языковую модель с помощью измененного вручную набора данных, чтобы убедиться, что модель не повторяет те же ошибки.

Более того, аннотатор-человек может внести большее лексическое и синтаксическое разнообразие в автоматически аннотируемые наборы данных. Генератор вопросов часто придерживается исходного текста дословно. Если входной текст посвящен макаронам и сыру, скорее всего, в сгенерированном вопросе также будут упомянуты «макароны и сыр», тогда как комментатор-человек может сказать «макароны с сыром» или «запеканка из макарон».

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

Изучите генерацию вопросов и многое другое в Haystack

Хотите попробовать новый модуль генерации вопросов, который теперь является частью нашей Структуры Haystack NLP? Перейдите в наш репозиторий GitHub, чтобы узнать больше об ответах на вопросы, семантическом поиске, обобщении и других компонентах НЛП в Haystack. Если это сработает для вас, мы будем признательны за звезду!