Гайд · TNWS AI
Как извлечь ответ из заданного текста через Transformers question-answering
Контекст, вопрос и контроль отсутствующего ответа: извлекаем span из документа, проверяем offsets и не принимаем догадку за факт.
Задача и применимость
Запрос читателя: «как найти ответ в тексте transformers extractive question answering». Ниже разобрана одна воспроизводимая задача на Python и Transformers 4.57.1. Действия относятся к checkpoint deepset/roberta-base-squad2, а не ко всем нейросетям с похожим названием. Код не отправляет запросы к админ-панели и не меняет чужие данные. Для первого запуска требуется загрузить модель из Hugging Face Hub; модель может требовать памяти и иметь собственные лицензионные условия. Проверяйте карточку checkpoint до применения к пользовательскому контенту. Демонстрационные предсказания не выдаются здесь за фактически выполненный инференс: в доступной проверке сверены документация и синтаксис Python, но веса модели не запускались.
Факт из документации, на который опирается инструкция: QuestionAnsweringPipeline принимает question и context, возвращая answer, score, start и end. Параметр handle_impossible_answer позволяет учитывать вопросы без ответа в контексте. Выбранная модель дообучена на SQuAD2; контекст ниже дан по-английски. Если версия вашей библиотеки или конфигурация checkpoint отличается, повторите короткий тест перед массовым использованием. Код показывает механизм, а не результат промышленной оценки качества на вашем корпусе.
Порядок действий
- Оставьте в контексте только разрешённую и актуальную редакцию документа.
- Напишите короткий вопрос по явному факту, присутствующему в тексте.
- Передайте question и context в pipeline, сохраняя оригинальный документ.
- Сопоставьте возвращённые start/end с действительным substring контекста.
- Добавьте вопрос, на который документ не отвечает, и проверьте логику отказа.
Для установки в отдельном окружении используйте совместимую версию пакета и backend PyTorch: pip install "transformers==4.57.1" torch. Наличие команды не означает, что все веса доступны именно вашей системе или что GPU настроен. Секреты и персональные данные не помещайте в демонстрационные входы. Для быстрой диагностики перед первым большим прогоном проверьте import transformers; print(transformers.__version__).
Готовый шаблон Python
from transformers import pipeline
context = "Policy R7: returns are accepted within 14 days. Delivery takes 3 days."
qa = pipeline("question-answering", model="deepset/roberta-base-squad2")
for question in ["Within how many days are returns accepted?",
"What is the manager's phone number?"]:
out = qa(question=question, context=context,
handle_impossible_answer=True)
print(question, out["answer"], context[out["start"]:out["end"]])
Этот шаблон можно перенести в отдельный файл и заменить демонстрационные тексты на обезличенную выборку. Зафиксируйте checkpoint и входные строки, чтобы отличать ошибки подготовки от поведения модели. В серверном сценарии загрузку модели выполняйте один раз при старте службы, а не заново при каждом обращении. Если пример возвращает словарь, используйте проверку наличия ключа перед сохранением его в долговременное хранилище. Сначала воспроизведите малый тест, лишь затем подключайте массовый поток.
Пример входных данных и ожидаемой проверки
Вход: «Policy R7: returns are accepted within 14 days. Delivery takes 3 days» и вопрос о сроке возврата. Ожидаемое содержимое ответа — фрагмент про 14 days, а не 3 days; при вопросе о телефоне менеджера ожидается признание отсутствия данных после проверки результата модели, не выдуманный номер.
Важно различать ожидаемую структуру ответа и непроверенное заранее содержимое нейросетевого предсказания. Если устройство или модель вернули иное значение, не «подгоняйте» скрипт под рассказ статьи. Сохраните фактический вывод, сопоставьте его с контрольным примером и запишите, какой слой дал отличие: вход, токенизация, checkpoint или постобработка. Так тест остается полезным после обновления окружения.
Как принимать решение по реальным данным
Это extractive QA: модель выбирает отрывок заданного контекста, а не делает общий поиск по интернету. Поэтому две проверки важнее красивого ответа: правильный ли документ был подан и действительно ли ответ является его фрагментом. Если в архивной политике срок был 30 дней, а в актуальной 14, модель не понимает юридической силы редакций; выбор версии выполняет приложение до QA. На очень длинном контексте pipeline может делить его на окна с overlap; факт за границей окна и несколько одинаковых цифр требуют дополнительной проверки. Параметр handle_impossible_answer допускает пустой ответ для невозможного вопроса, но не гарантирует нулевых ложных ответов. При отсутствии телефона в тексте сверяйте пустую строку, offsets и score, а затем отказывайтесь отвечать: нельзя подставить произвольный номер из соседнего абзаца.
Дополнительный тест перед внедрением
Проверьте пять кейсов: число 14, соседнее число 3, отрицание «not accepted», два разных срока в старой и новой редакциях и отсутствующий телефон. Для каждого отметьте правильный документ и допустимый span заранее. Если итоговый ответ позже формулирует LLM, передавайте ему только проверенный фрагмент и ID документа; контролируйте, что он не изменяет единицы измерения и не добавляет исключения. На русскоязычном тексте этот пример модели без языковой оценки неприменим: сперва выберите подтверждённый русскоязычный checkpoint и повторите приёмочные вопросы. Оценка score помогает сортировать сомнительные предсказания, но не является сертификатом корректности. Приложение должно связывать ответ с конкретным источником и редакцией, иначе пользователю нечего перепроверить.
Критерии готовности
- Строка context[start:end] совпадает с отвечающим фрагментом.
- Два соседних числа не перепутаны.
- Несуществующий номер не появляется в результате приложения.
Записывайте тестовый результат вместе с ID входа и конфигурацией, но не публикуйте приватные запросы в открытых логах. Ручная разметка небольшой выборки нужна даже тогда, когда код возвращает ответ без ошибок: технически правильная форма не подтверждает полезность предсказания. После изменения модели или библиотеки прогоните тот же набор повторно. Если одно из условий не пройдено, сначала исправляйте причину, затем расширяйте применение.
Типичные ошибки и что не делать
- Не передавать смесь старых и новых правил как один непомеченный контекст.
- Не считать score фактом наличия ответа.
- Не применять английскую модель к русской политике без тестов.
Не путайте демонстрационный вывод с обещанием точности и не подменяйте источники сведений ответом модели. Для автоматического действия с последствиями для человека добавляйте независимую проверку. Изменения языка, объёма текста и домена применения требуют новой оценки качества. В документации производителя описан интерфейс инструмента, но показатели вашей задачи можно узнать только на вашей контрольной выборке.
FAQ
Ищет ли pipeline в интернете?
Нет, ему передают конкретный context.
Как проверять источник?
Использовать offsets и оригинальный документ.
Что делать с вопросом без ответа?
Проверить невозможность ответа и вернуть отказ, а не догадку.
Официальные источники
Частые вопросы
Ищет ли pipeline в интернете?
Нет, ему передают конкретный context.
Как проверять источник?
Использовать offsets и оригинальный документ.
Что делать с вопросом без ответа?
Проверить невозможность ответа и вернуть отказ, а не догадку.
Читайте также
Как не потерять конец текста при truncation и padding в Transformers
max_length, truncation и padding для пары сообщений: проверяем, что юридически важная оговорка не исчезает до вызова модели.
Как обработать большой поток отзывов пакетами в Transformers без переполнения памяти
batch_size, потоковый источник и честный замер производительности: сохраняем соответствие входов и выходов и тестируем OOM.
Как оформить диалог для локальной LLM через apply_chat_template в Transformers
Роли user и assistant, add_generation_prompt и защита от двойных спецтокенов: проверяем входной шаблон перед генерацией.
Комментарии
Пока тихо. Скажите первое слово