boostcampaitech2 / mrc-level2-nlp-14

mrc-level2-nlp-14 created by GitHub Classroom
MIT License
10 stars 8 forks source link

[Dev] Retrieve Module 개발노트 #3

Closed jinmang2 closed 2 years ago

jinmang2 commented 2 years ago

Special Mission 3에서 언급된 SparseRetrievalDenseRetrieval 객체를 추상화시켜서 확장성있는 코드로 개발.

제공된 retrieval.py에는 boilerplate가 너무 많습니다. 이를 추상화시켜서 나중에 새로운 Retrieval를 추가해도 동작하도록 개발합니다.

jinmang2 commented 2 years ago

RetrievalBase의 get_relevant_doc 메서드를

  1. query embedding을 받아오는 부분
  2. 해당 query에 대해 documents 유사도가 가장 높은 top-k 문서를 가져오는 부분 의 두 part로 나눌 수 있을 것 같아 아래와 같이 구성해봤습니다.
class RetrievalBase(FaissMixin, PandasMixin):

    def get_relevant_doc(self, query: str, k: int, use_faiss: bool = False) -> Tuple[List, List]:
        """
        입력 query에 관련이 있는 상위 k의 document를 검색

        Arguments:
            quert (str):
                하나의 Query를 받음
            k (int):
                상위 몇 개의 pasaage를 반환할지 결정
        Returns:
            document score (List):
                입력 query에 대한 topk document 유사도
            document indices (List):
                입력 query에 대한 topk document 인덱스
        """
        query_emb = self.get_query_embedding(query)
        doc_scores, doc_indices = self.get_topk_similarity(query_emb, k, use_faiss)
        return doc_scores, doc_indices

    @abstractmethod
    def get_query_embedding(self, query):
        pass

    @abstractmethod
    def get_topk_similarity(self, query_emb, k, use_faiss):
        pass
jinmang2 commented 2 years ago

SparseRetrieval의 get_relevant_doc_bulk의 배치화 방식이 비효율적인 것 같아서 numpy의 partition으로 재구현했습니다.

image

저희의 코드에서는 SparseRetrievalget_topk_similarity메서드에 구현할 예정입니다.

jinmang2 commented 2 years ago

SparseRetrieval 구현완료!

unittest 코드 작성 시도

[query exhaustive search] done in 43.945 s
Top-1 passage with score 0.198994
국회에 관해 규정하는 헌법 제4장의 첫 조문이다.
...
[get_relevant_doc] done in 16.390 s
Top-1 passage with score 0.1990
국회에 관해 규정하는 헌법 제4장의 첫 조문이다.
...
jinmang2 commented 2 years ago

https://github.com/boostcampaitech2/mrc-level2-nlp-14/blob/b3b0c4dcecd256fc0570620928ce7fd411e5d851/solution/retrieve/core.py#L287

위에 부분이 method 명을 get_topk_similarity_with_faiss로 바꿨었는데 반영이 안되어있다. 다음 commit에서 수정해야겠다.

jinmang2 commented 2 years ago

주말 간 구현에 참고한 링크들

엘라스틱 관련

uyeongjae commented 2 years ago
jinmang2 commented 2 years ago

Elastic Search 개발 노트 추가

jinmang2 commented 2 years ago

개발 노트 추가 TODO: BM25 파일 저장 에러 확인