질의응답 (Question Answering)
질의응답(QA)은 주어진 **질문(Question)**에 대해 **문맥(Context)**에서 답변을 찾아내는 태스크입니다. 검색 엔진, 고객 서비스, 사내 문서 질의 등 실무에서 가장 직접적으로 활용되는 NLP 태스크이며, RAG(Retrieval-Augmented Generation) 파이프라인의 핵심 컴포넌트이기도 합니다.학습 목표
이 문서를 완료하면 다음을 수행할 수 있습니다.- Extractive QA와 Generative QA의 차이를 설명할 수 있습니다
- SQuAD/KorQuAD 형식의 데이터를 이해하고 전처리할 수 있습니다
- BERT 기반 Extractive QA 모델을 Fine-tuning할 수 있습니다
- T5 기반 Generative QA를 구현할 수 있습니다
- EM(Exact Match)과 F1-Score로 QA 모델을 평가할 수 있습니다
QA 유형 비교
| 유형 | 입력 | 출력 | 대표 모델 | 특징 |
|---|---|---|---|---|
| Extractive QA | 질문 + 문맥 | 문맥 내 span | BERT, RoBERTa | 문맥에 답이 반드시 존재 |
| Generative QA | 질문 + 문맥 | 자유 형식 답변 | T5, GPT | 문맥을 재구성하여 답변 |
| Open-domain QA | 질문만 | 답변 | Retriever + Reader | 검색 단계 포함 |
SQuAD / KorQuAD 데이터 형식
Extractive QA의 표준 데이터 형식은 SQuAD(Stanford Question Answering Dataset)입니다. KorQuAD는 이를 한국어로 구축한 데이터셋입니다.answer_start입니다. 답변 텍스트가 문맥 내에서 시작하는 문자 위치를 나타내며, 모델은 이 시작 위치와 끝 위치를 예측하도록 학습됩니다.
실습 1: BERT Extractive QA
실습 2: T5 Generative QA
Generative QA는 답변을 직접 생성하므로, 문맥에 없는 표현으로도 답변할 수 있습니다.Extractive vs Generative QA 비교
| 항목 | Extractive QA | Generative QA |
|---|---|---|
| 답변 소스 | 문맥 내 span 추출 | 자유 형식 생성 |
| 대표 모델 | BERT, RoBERTa | T5, GPT, LLaMA |
| 장점 | 답변 근거 명확, 환각 적음 | 유연한 답변, 요약 가능 |
| 단점 | 문맥에 답이 없으면 실패 | 환각(Hallucination) 위험 |
| 평가 지표 | EM, F1 | EM, F1, ROUGE |
| RAG 연결 | Reader 컴포넌트 | Generator 컴포넌트 |
답변이 항상 문맥의 처음 부분만 추출됩니다
답변이 항상 문맥의 처음 부분만 추출됩니다
start_positions와 end_positions의 전처리가 올바른지 확인하세요. 특히 offset_mapping에서 문맥 영역(sequence_id == 1)만 사용해야 합니다. 질문 영역(sequence_id == 0)의 토큰이 답변으로 선택되지 않도록 주의하세요.긴 문맥에서 성능이 크게 떨어집니다
긴 문맥에서 성능이 크게 떨어집니다
BERT의 최대 토큰 길이(512)를 넘는 문맥은 슬라이딩 윈도우로 분할됩니다.
stride 값을 적절히 설정하고(64~128), 여러 청크의 예측 중 가장 높은 신뢰도의 답변을 선택하세요.Generative QA에서 환각이 발생합니다
Generative QA에서 환각이 발생합니다
Generative QA는 문맥에 없는 정보를 만들어낼 수 있습니다.
num_beams를 높이고 no_repeat_ngram_size를 설정하면 품질이 개선됩니다. 프로덕션 환경에서는 Extractive QA 결과와 교차 검증하거나, RAG에서 출처 표시(Citation)를 추가하는 것이 좋습니다.
