Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#950

Как спроектировать систему поиска ответов на вопросы (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 Сравнение датасетов

ХарактеристикаSQuADruSQuADSberQUAD
ЯзыкАнглийскийРусскийРусский
Размер (вопросов)100k+~50k~50k
Тип ответовСпанСпанСпан
ИсточникWikipediaПеревод SQuADWikipedia (рус.)
ОсобенностьЭталонПрямой переводОригинальные вопросы

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

Шаги:

  1. Загрузить SberQUAD и разделить на train/validation (80/20).
  2. Токенизировать пары (вопрос, контекст) с помощью AutoTokenizer от DeepPavlov/rubert-base-cased.
  3. Создать Pytorch Dataset, возвращающий input_ids, attention_mask, start_positions, end_positions.
  4. Дообучить RuBERT (модель AutoModelForQuestionAnswering) на 3 эпохи с learning rate 2e-5.
  5. На валидации применить инференс: получить start/end logits, выбрать лучший спан.
  6. Вычислить EM и F1 с помощью evaluate.load("squad").

Ожидаемый результат:

  • Модель достигает EM ~65% и F1 ~80% на валидации SberQUAD.
  • Система способна отвечать на вопросы по произвольному русскоязычному тексту (длиной до 512 токенов).

Связь с другими вопросами

ВопросТема
1. Основы NLPБазовые понятия NLP: токенизация, эмбеддинги, архитектуры
949. Как построить пайплайн обработки текста на PythonПайплайн предобработки текста для NLP-задач
951. Как работают attention-механизмы в трансформерахМеханизм внимания, лежащий в основе BERT и T5

Навигация

  • Предыдущий: 949
  • Следующий: 951
  • Индекс: 00. Индекс разборов