| νΉμ§ | μ€λͺ |
|---|---|
| λν μ£Όμ | λ€μ΄λ² λΆμ€νΈμΊ ν AI-Tech 8κΈ° NLP νΈλμ Open-Domain Question Answering (ODQA) λν |
| λν μ€λͺ | μ§λ¬Έμ λν΄ λ°©λν μ§λ¬Έ(Corpus)μμ κ΄λ ¨ λ¬Έμλ₯Ό μ°Ύμλ΄κ³ (Retriever), μ λ΅μ μΆλ‘ (Reader)νλ μμ€ν κ΅¬μΆ |
| μ§ν κΈ°κ° | 2025λ 12μ 3μΌ ~ 2025λ 12μ 11μΌ |
| λ°μ΄ν° κ΅¬μ± | Wikipedia Passage (60,613κ°), KorQuAD v1/v2 νμ΅ λ°μ΄ν° |
| νκ° μ§ν | Exact Match (EM) - μ λ΅ μμ μΌμΉ μ¬λΆ (λ©μΈ μ§ν), F1 Score |
| λ©μ 리ν¬νΈ | Gen for NLP NLP-03 λ©μ 리ν¬νΈ |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| μ΄λ¦ | μν |
|---|---|
| κΉβ μ€β ν¬ | λ°μ΄ν° EDA, Hybrid Retrieval(BM25+Dense) μ€κ³ λ° κ΅¬ν, Reader Fine-tuning, μμλΈ μ λ΅ μ립 |
| λ°β μβ μ§ | Dense Retrieval μ€ν λ° λͺ¨λΈ(BGE-M3 λ±) μ μ , Retrieval νμΈνλ μ€ν, λ°μ΄ν° μ μ²λ¦¬ |
| κ³½β λβ μ | λ°μ΄ν° μ μ²λ¦¬ νμ΄νλΌμΈ ꡬμΆ, Hybrid Retrieval ꡬν λ° μ±λ₯ μ΅μ ν, Retrieval Fine-tuning |
| κΉβ μ΄β μ¬ | KorQuAD 2.0 λ°μ΄ν° μ μ²λ¦¬ λ° μ¦κ°, ElasticSearch κΈ°λ° Retrieval ꡬν λ° μ€ν |
| μ°β νβ μ§ | BM25 κΈ°λ° Sparse Retrieval ꡬν, Reader λͺ¨λΈ κ°μ (Negative Passage, Curriculum Learning), Qwen3 μ€ν |
| μ΅β β μ€νΈ | Curriculum Learning λμ΄λ μ§ν(Embedding+Position) κ΅¬μ± λ° λͺ¨λΈ νμ΅, μμλΈ(Soft/Hard Voting) ꡬν |
λ³Έ νλ‘μ νΈλ μλ§ κ°μ μν€νΌλμ μ§λ¬Έ μ€ μ§λ¬Έμ μ ν©ν μ 보λ₯Ό μ°Ύμ μ νν λ΅μ λ΄λλ ODQA μμ€ν μ μ±λ₯μ κ·Ήλννλ κ²μ λͺ©νλ‘ ν©λλ€. λ¨μ κ²μμ λμ΄ μλ―Έλ‘ μ μ μ¬λμ νμ΅ λμ΄λλ₯Ό μ‘°μ νλ κ³ λνλ μ λ΅μ μ¬μ©νμ΅λλ€.
- Hybrid Retrieval & Reranking:
- BM25(Sparse)μ BGE-M3(Dense)λ₯Ό κ²°ν©νμ¬ ν€μλμ μλ―Έλ₯Ό λμμ ν¬μ°©
- **RRF(Reciprocal Rank Fusion)**λ₯Ό ν΅ν μμ μ μΈ μμ ν΅ν© λ° Cross-Encoder Rerankerλ‘ μμ λ¬Έμ μ¬μ λ ¬
- Reader Optimization:
- Negative Passage Training: μ λ΅μ΄ μλ μ€λ΅ μ§λ¬Έμ νμ΅μ ν¬ν¨νμ¬ λͺ¨λΈμ λ³λ³λ ₯ κ°ν
- Curriculum Learning: Passage κ°μμ μ λ΅ μμΉ μ 보λ₯Ό νμ©ν΄ Easy β Medium β Hard μμΌλ‘ λ¨κ³μ νμ΅ μν
- Robustness:
- Stride(128)λ₯Ό μ μ©ν Passage ChunkingμΌλ‘ λ¬Έλ§₯ μμ€ μ΅μν
- Position Bias μνλ₯Ό μν΄ μ λ΅ μμΉ λλ€ν μ μ©
- Ensemble Strategy: λ¬Έμμ΄ μ μ¬λ κΈ°λ°μ Soft Votingμ ν΅ν΄ κ°λ³ λͺ¨λΈμ μ€λ΅μ μνΈ λ³΄μ
korean-mrc-negative-passage/
βββ data_preparation/ # λ°μ΄ν°μ
μμ±
β βββ create_negative_passage_dataset.py
β βββ build_passages.py
βββ retrieval/ # κ²μ λͺ¨λ
β βββ retrieval.py
β βββ retrieval_bm25.py
β βββ retrieval_dense.py
β βββ retrieval_hybrid.py
β βββ retrieval_hybrid_passage.py
β βββ retrieval_hybrid_passage_rerank_only.py
βββ training/ # νμ΅ λͺ¨λ
β βββ train.py
β βββ trainer_qa.py
β βββ arguments.py
β βββ utils_qa.py
βββ inference/ # μΆλ‘ λͺ¨λ
β βββ inference.py
β βββ inference_bm25.py
β βββ inference_hybrid_passage_rerank_only.py
βββ ensemble/ # μμλΈ λͺ¨λ
β βββ ensemble_voting.ipynb
βββ scripts/ # μ€ν μ€ν¬λ¦½νΈ
β βββ create_negative_passage.sh
βββ analysis/ # λΆμ λꡬ
βββ compare_predictions.py
βββ analy
pip install -r requirements.txtpython data_preparation/build_passages.pyκΈ°λ³Έ μ¬μ© (κ³ μ κ°μ)
python data_preparation/create_negative_passage_dataset.py \
--train_dataset_path ../data/train_dataset \
--passages_path ../data/wikipedia_passages_256_128.json \
--output_path ../data/train_dataset_negative_passage \
--top_k_retrieval 100 \
--rerank_top_k 5 \
--alpha 0.7 \
--use_rerankCurriculum Learning (Easy β Medium β Hard)
Easy (3 passages):
python data_preparation/create_negative_passage_dataset.py \
--curriculum_mode easy \
--output_path ../data/train_dataset_easyMedium (5 passages):
python data_preparation/create_negative_passage_dataset.py \
--curriculum_mode medium \
--output_path ../data/train_dataset_mediumHard (7 passages):
python data_preparation/create_negative_passage_dataset.py \
--curriculum_mode hard \
--output_path ../data/train_dataset_hardλ¨μΌ μ€ν μ΄μ§ νμ΅
python -m training.train \
--model_name_or_path HANTAEK/klue-roberta-large-korquad-v1-qa-finetuned \
--dataset_name ../data/train_dataset_negative_passage \
--output_dir ../models/reader_negative_passage \
--do_train \
--do_eval \
--num_train_epochs 3 \
--per_device_train_batch_size 16 \
--fp16Curriculum Learning (μμ°¨ νμ΅)
# Stage 1: Easy
python -m training.train \
--model_name_or_path HANTAEK/klue-roberta-large-korquad-v1-qa-finetuned \
--dataset_name ../data/train_dataset_easy \
--output_dir ../models/curriculum_stage1_easy \
--num_train_epochs 2 \
--per_device_train_batch_size 16
# Stage 2: Medium (μ΄μ λͺ¨λΈμμ μμ)
python -m training.train \
--model_name_or_path ../models/curriculum_stage1_easy \
--dataset_name ../data/train_dataset_medium \
--output_dir ../models/curriculum_stage2_medium \
--num_train_epochs 2 \
--per_device_train_batch_size 16
# Stage 3: Hard
python -m training.train \
--model_name_or_path ../models/curriculum_stage2_medium \
--dataset_name ../data/train_dataset_hard \
--output_dir ../models/curriculum_stage3_hard \
--num_train_epochs 2 \
--per_device_train_batch_size 16python -m inference.inference_hybrid_passage_rerank_only \
--model_name_or_path ../models/curriculum_stage3_hard \
--dataset_name ../data/test_dataset \
--output_dir ../outputs/predictions- KorQuAD 1.0 - νκ΅μ΄ μ§μμλ΅ λ°μ΄ν°μ (μ£Όμ νμ΅/κ²μ¦ λ°μ΄ν°)
- KorQuAD 2.0 - λκ·λͺ¨ νκ΅μ΄ μ§μμλ΅ λ°μ΄ν°μ (λ°μ΄ν° μ¦κ° λ° μΈλΆ λ°μ΄ν° νμ©)
- KLUE Benchmark - νκ΅μ΄ μμ°μ΄ μ΄ν΄ νκ° νμ€ λ°μ΄ν°μ
- KLUE-RoBERTa (Reader) - Reader λ² μ΄μ€ λͺ¨λΈλ‘ νμ©λ klue/roberta-large
- BGE-M3 (Retrieval) - λ€κ΅μ΄ μ§μ λ° νμ΄λΈλ¦¬λ κ²μμ΄ κ°λ₯ν κ³ μ±λ₯ μλ² λ© λͺ¨λΈ
- Ko-Reranker - κ²μ κ²°κ³Όμ μ λ°λλ₯Ό λμ΄κΈ° μν νκ΅μ΄ μ μ© Cross-Encoder λͺ¨λΈ
- Rank-BM25 - ν€μλ κΈ°λ° Sparse Retrieval ꡬνμ μν μκ³ λ¦¬μ¦ λΌμ΄λΈλ¬λ¦¬
- FAISS - λκ·λͺ¨ Dense Vector κ²μμ μν Facebook AI Researchμ κ³ μ±λ₯ λΌμ΄λΈλ¬λ¦¬
- Reciprocal Rank Fusion (RRF) - μλ‘ λ€λ₯Έ κ²μ κ²°κ³Ό(Sparse & Dense)λ₯Ό ν¨κ³Όμ μΌλ‘ ν΅ν©νλ μμ μ°μ κΈ°λ²
- Curriculum Learning - νμ΅ λ°μ΄ν°μ λμ΄λλ₯Ό μ μ§μ μΌλ‘ λμ¬ λͺ¨λΈ μ±λ₯μ μ΅μ ννλ μ λ΅
- Dense Passage Retrieval (DPR) - λμΌ μΈμ½λ ꡬ쑰λ₯Ό νμ©ν μλ―Έλ‘ μ λ¬Έμ κ²μ νλ μμν¬








