Как спроектировать систему поиска ответов на вопросы (QA) на основе SQuAD-подобных датасетов?
Краткий тезис
Проектирование QA-системы на базе SQuAD-подобных датасетов сводится к выбору архитектуры (экстрактивной или генеративной), подготовке данных в формате «контекст + вопрос → ответ», обучению/дообучению модели и оценке метриками Exact Match и F1. Для русского языка ключевыми датасетами выступают ruSQuAD и SberQUAD, а основными моделями — BERT (экстрактивный подход) и T5/Llama (генеративный подход).
----|--------| | Высокая точность при наличии ответа в контексте | Не может ответить, если ответа нет в тексте | | Быстрый инференс (одна модель) | Требует точного выделения границ спана | | Хорошо работает на коротких ответах | Плохо обобщается на вопросы, требующие синтеза |
2. Generative QA: T5, Llama
Генеративный подход формулирует задачу как text-to-text: модель получает контекст и вопрос и генерирует ответ свободной формы.
2.1 Модели-кандидаты
- T5 (base/large) — encoder-decoder, обучен на смеси задач; для русского языка доступны ruT5.
- Llama (2/3) — decoder-only, требует форматирования промпта (например,
Answer the question based on the context: ...). - FRED-T5 — российская альтернатива от SberDevices.
2.2 Обучение и инференс
- Формат данных:
question: {вопрос} context: {контекст} answer: {ответ}. - Генерация с помощью beam search (beam=4) или top-p sampling.
- Для ограничения длины ответа —
max_new_tokens=50.
2.3 Преимущества и ограничения
| Плюсы | Минусы |
|---|---|
| Может отвечать, даже если ответа нет в контексте (абстрактивный) | Требует больше вычислительных ресурсов |
| Гибкость: поддержка многословных ответов | Риск галлюцинаций (hallucination) |
| Легко адаптируется под другие QA-форматы | Сложнее оценивать (необходима семантическая близость) |
3. Датасеты: SQuAD, ruSQuAD, SberQUAD
Качество QA-системы напрямую зависит от датасета. Для русского языка основными являются:
3.1 SQuAD (Stanford Question Answering Dataset)
- Англоязычный, 100k+ пар вопрос-ответ на статьях Wikipedia.
- Формат:
{context, question, answers (список), answer_start}. - Используется как baseline для сравнения.
3.2 ruSQuAD
- Перевод SQuAD 1.1 на русский язык (около 50k вопросов).
- Выполнен краудсорсингом, качество перевода высокое.
- Подходит для обучения экстрактивных моделей.
3.3 SberQUAD
- Оригинальный русскоязычный датасет от SberDevices (около 50k вопросов).
- Вопросы составлены по статьям русской Википедии.
- Отличается более естественными формулировками вопросов.
3.4 Сравнение датасетов
| Характеристика | SQuAD | ruSQuAD | SberQUAD |
|---|---|---|---|
| Язык | Английский | Русский | Русский |
| Размер (вопросов) | 100k+ | ~50k | ~50k |
| Тип ответов | Спан | Спан | Спан |
| Источник | Wikipedia | Перевод SQuAD | Wikipedia (рус.) |
| Особенность | Эталон | Прямой перевод | Оригинальные вопросы |
4. Оценка: exact match, F1
Для QA-систем на SQuAD-подобных датасетах стандартными метриками являются:
4.1 Exact Match (EM)
- Доля примеров, где предсказанный ответ в точности совпадает с одним из эталонных ответов (с учётом нормализации: нижний регистр, удаление пунктуации, артиклей).
- Формула:
EM = (количество точных совпадений) / (общее количество вопросов). - Жёсткая метрика: малейшее отличие (лишний пробел) даёт 0.
4.2 F1-score
- Среднее гармоническое precision и recall на уровне токенов.
- Для каждого вопроса вычисляется F1 между предсказанным ответом и каждым эталонным, затем берётся максимум.
- Более мягкая метрика, допускает частичное совпадение.
4.3 Дополнительные метрики
- ROUGE-L — для генеративных моделей (оценивает longest common subsequence).
- BLEU — редко, так как не учитывает синонимы.
- Answer Correctness — семантическая оценка через эмбеддинги (например, BERTScore).
4.4 Пример расчёта
import collections
def normalize_answer(s):
return ' '.join(s.lower().split())
def f1_score(pred, gold):
pred_tokens = normalize_answer(pred).split()
gold_tokens = normalize_answer(gold).split()
common = collections.Counter(pred_tokens) & collections.Counter(gold_tokens)
num_same = sum(common.values())
if len(pred_tokens) == 0 or len(gold_tokens) == 0:
return int(pred_tokens == gold_tokens)
precision = num_same / len(pred_tokens)
recall = num_same / len(gold_tokens)
return 2 * precision * recall / (precision + recall) if (precision + recall) else 0
5. Пет-проект для закрепления
Задача: Разработать экстрактивную QA-систему для русскоязычных текстов на основе RuBERT, обученную на SberQUAD, и оценить её на тестовой выборке.
Инструменты:
- Python 3.10+, PyTorch, Transformers (Hugging Face)
- Датасет: SberQUAD (загрузить через
datasets) - Библиотеки:
datasets,evaluate,scikit-learn
Шаги:
- Загрузить SberQUAD и разделить на train/validation (80/20).
- Токенизировать пары (вопрос, контекст) с помощью
AutoTokenizerотDeepPavlov/rubert-base-cased. - Создать Pytorch Dataset, возвращающий
input_ids,attention_mask,start_positions,end_positions. - Дообучить RuBERT (модель
AutoModelForQuestionAnswering) на 3 эпохи с learning rate 2e-5. - На валидации применить инференс: получить start/end logits, выбрать лучший спан.
- Вычислить EM и F1 с помощью
evaluate.load("squad").
Ожидаемый результат:
- Модель достигает EM ~65% и F1 ~80% на валидации SberQUAD.
- Система способна отвечать на вопросы по произвольному русскоязычному тексту (длиной до 512 токенов).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1. Основы NLP | Базовые понятия NLP: токенизация, эмбеддинги, архитектуры |
| 949. Как построить пайплайн обработки текста на Python | Пайплайн предобработки текста для NLP-задач |
| 951. Как работают attention-механизмы в трансформерах | Механизм внимания, лежащий в основе BERT и T5 |
Навигация
- Предыдущий: 949
- Следующий: 951
- Индекс: 00. Индекс разборов