ODQA (Open-domain Question Answering)
MRC는 지문이 주어진 상황에서 질의응답
ODQA는 지문이 따로 주어지지 않으며, 방대한 world knowledge에 기반한 질의응답
History of ODQA
1) Question processing
2) Passage retrieval
3) Answer processing
주어진 question과 선별된 passage들 내에서 답을 선택
현재 기술처럼 span을 선별하긴 어려웠음
데이터베이스에서 관련있는 문서를 검색
입력-document corpus, 질문(query)
출력-관련성 높은 문서
검색된 문서에서 질문에 해당하는 답을 찾아 냄
입력-Retrieved된 문서, 질문(query)
출력-해당 문서 내 답변
TF-IDF, BM25 (학습 X)
Dense (학습 O)
SQuAD와 같은 MRC dataset으로 학습
학습 데이터를 추가하기 위해 distant supervision 활용
질문-답변만 있는 dataset에서 MRC 학습 데이터 만들기
위키피디아에서 Retriever를 이용해 관련성 높은 문서 검색
너무 짧거나 긴 문서, 질문의 고유명사를 포함하지 않는 등 부적합 문서 제거
answer가 exact match로 들어있지 않은 문서 제거
남은 문서 중 질문과 연관성이 가장 높은 단락을 supporting evidence로 사용
Retriever가 질문과 가장 관련성 높은 n개 문서 출력
Reader는 n개 문서를 읽고 답변 예측
Reader가 예측한 답변 중 가장 score가 높은 것을 최종 답으로 사용
Different granularities of text at indexing time
위키피디아에서 각 Passage 단위를 문서, 단락 또는 문장으로 정의할 지 정해야 함
Retriever 단계에서 몇 개의 문서를 넘길 지 정해야 함
Granularity에 따라 k가 다를 수 밖에 없음
e.g., article → k=5, paragraph → k=29, sentence → k=78
Single-passage training vs Multi-passage training
Single-passage
k개의 passage들을 reader가 각각 확인하고, 특정 answer span에 대한 예측 점수를 나타냄
그 후 가장 높은 점수를 가진 answer span을 고르도록 함
⇒ 각 retrieved passage들에 대한 직접적인 비교라고 볼 수 없음
⇒ 따로 reader model이 보는 것이 아닌, 전체를 한 번에 보게 하자
Multi-passage
retrieved passages 전체를 하나의 passage로 취급하고, reader model이 그 안에서 answer span search
문서가 너무 길어지므로 GPU 리소스가 더 필요함
Importance of each passage
Retriever model에서 추출된 top-k passage들의 retrieval score를 reader model에 전달
MRC model
outputs = model(**inputs)
start, end = torch.max(outputs.start_logits, axis=1).indices.item(), torch.max(outputs.end_logits, axis=1).indices.item()
answer = tokenizer.decode(encoded_dict['input_ids'][start:end+1])
MRC model의 output은 start, end index의 logit 값이 나옴
logit 값이 max인 것을 찾고, 해당 인덱스를 start와 end로 해서 문서 내 answer을 찾음
def open_domain_qa(query, corpus, vectorizer, model, tokenizer, k=1):
# 1. Retrieve k relevant docs by usign sparse matrix
_, doc_id = get_relevant_doc(vectorizer, query, k=1)
context = corpus[doc_id.item()]
# 2. Predict answer from given doc by using MRC model
answer = get_answer_from_context(context, query, mrc_model, tokenizer)
get_relevant_doc 함수로 연관성이 높은 k개의 문서를 찾음
해당 문서를 get_answer_from_context 함수에 넘겨 그 안에서 답을 검색
※ 모든 이미지 및 코드 출처는 네이버 커넥트재단 부스트캠프 AI Tech 5기입니다. ※