VumBleBot / odqa_baseline_code

Baseline code for Korean open domain question answering(ODQA)
https://bit.ly/3fvgZZ0
Apache License 2.0
76 stars 12 forks source link

코드 리뷰 및 질의 #10

Closed olenmg closed 3 years ago

olenmg commented 3 years ago

일단 제가 나중에 보려고 이해한 내용을 적어보았고, 아직 안보신 분들께도 도움이 될 수도 있어 올립니다 😊

run.py 동작

python -m run strategies ST01 --run_cnt 1

질문 및 제안

질문1

valid dataset 정제시 retrieve에서 실제로 활용하는 column은 위에서 언급했듯이 ['answers', 'context', 'id', 'question'] 뿐인데 다른 column값들(context_id, original_context 등)을 굳이 넣어야할까요? 아니면 나중에 다른 곳에 쓰일수도 있기 때문에 다른 부분도 넣는걸까요? (사실 이건 그렇게 주요한 사안은 아닙니다. 😕 가볍게 생각해주세요)

제안1

args.train.do_train, args.train.do_evaltrain_reader에서 설정해주지 말고, 사용자의 argument 입력으로부터 정보를 얻어와서update_args에서 값 설정해주고 아래

train_results = trainer.train()
eval_results = trainer.evaluate()

이 부분과 eval_dataset 불러오는 부분도 이에 맞춰 분기 나눠주면 좋을 것 같습니다.

제안2

추후 retriever가 여러개 생겼을 때를 대비하여 run.py 에서 retriever 불러오는 부분을 수정하는게 좋을 것 같습니다.

get_sparse_embedding()을 아예 get_retriever내부로 넣는 방향으로요!

수정 전

#run.py
...
retriever = get_retriever(args)
retriever.get_sparse_embedding()
...
#prepare.py 
...
def get_retriever(args):
    if args.model.retriever_name == "tfidf":
        from konlpy.tag import Mecab

        mecab = Mecab()
        retriever = SparseRetrieval(args, tokenize_fn=mecab.morphs)
    return retriever
...

수정 후

#run.py
...
retriever = get_retriever(args)
...
#prepare.py 
...
def get_retriever(args):
    if args.model.retriever_name == "tfidf":
        from konlpy.tag import Mecab

        mecab = Mecab()
        retriever = SparseRetrieval(args, tokenize_fn=mecab.morphs)
        retriever.get_sparse_embedding()
    elif ... 
    return retriever
...

리팩토링하려다가 실패한 부분

현재 post_processing_function을 train/eval dataset 전처리마다 한번씩 리턴해주고, train만 할때는 사용하지도 않는 함수라서 이 함수를 그냥 밖으로 빼려고 했는데 생각해보니까 args 변수때문에 밖으로 뺄 수가 없더라구요. 굳이 뺄 필요가 없긴 한데, 그래도 현재 코드가 완전히 깔끔한 구조라고는 볼 수 없을 것 같습니다. 이 부분에 대해서 아이디어 있으신 분은 제안 부탁드립니다!

SeongIkKim commented 3 years ago

post_processing_function 부분은 저도 읽으면서 불편하다고 느꼈습니다. 애초에 감싸고 있는 preprocess_dataset 파트에서 post_processing_function을 정의하고 만들어서 리턴해주는것도 좀 마음에 안들더라구요. Processor 클래스를 새로 만들어서 args, dataset, tokenizer등을 받아두고, preprocessing 파트와 postprocessing 파트를 분리하는건 어떨까요? 가능하다면 pre_XXX, post_XXX 등의 접두사를 붙여서 파트를 구분하고 처리 과정 자체는 최대한 메서드별로 잘게 쪼개고싶긴 합니다. Inner fuction도 그렇고 코드가 너무 길어서 읽기 괴로워요 ㅠㅠ

olenmg commented 3 years ago

써주신 의견 읽어보니 개선은 해야할 것 같은데 방법이 여러가지라 오늘 피어세션에서 관련 내용 짧게 논의해보는 것도 좋을 것 같습니다!

olenmg commented 3 years ago

리팩토링이 예정되어 더이상 도움 안될 것 같으니 이슈 닫겠습니다!