jisubae
feat: Add optional HF dataset sync for leaderboard
4a43fed
---
title: Ko-FreshQA Leaderboard
emoji: πŸš€
colorFrom: blue
colorTo: green
sdk: gradio
app_file: app.py
pinned: false
license: apache-2.0
hf_oauth: true
---
## Ko-FreshQA Leaderboard
ν•œκ΅­μ–΄ FreshQA 기반 μžλ™ 평가/λ¦¬λ”λ³΄λ“œ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. μ°Έκ°€μžκ°€ μ—…λ‘œλ“œν•œ CSV의 `model_response`λ₯Ό κΈ°μ€€ 데이터와 λ§€μΉ­ν•˜κ³ , Upstage Solar λͺ¨λΈλ‘œ Relaxed/Strict 평가λ₯Ό μˆ˜ν–‰ν•œ λ’€ κ²°κ³Όλ₯Ό λ¦¬λ”λ³΄λ“œμ— λ°˜μ˜ν•©λ‹ˆλ‹€. Gradio UI둜 μ‹€ν–‰λ©λ‹ˆλ‹€.
### 핡심 κΈ°λŠ₯
- 데이터셋 배포: DEV/TEST CSV λ‹€μš΄λ‘œλ“œ νƒ­ 제곡
- 제좜 및 μžλ™ 평가: μ—…λ‘œλ“œλœ CSVλ₯Ό 병합 β†’ 평가 β†’ μ§€ν‘œ 집계 β†’ λ¦¬λ”λ³΄λ“œ 반영
- 상세 μ§€ν‘œ: fact type, μ „μ œ μœ νš¨μ„±(vp/fp), hop(one/multi), 연도(old/new), 도메인별 정확도
- 제좜 μ œν•œ(μ˜΅μ…˜): μ‚¬μš©μžλ³„ ν•˜λ£¨ 3회 μ œν•œ κΈ°λŠ₯ (Hugging Face μ €μž₯μ†Œ 기반)
---
## 디렉터리 ꡬ쑰
- `app.py`: Gradio μ•± μ΄ˆκΈ°ν™” 및 νƒ­ ꡬ성
- `config.py`: ν™˜κ²½λ³€μˆ˜ λ‘œλ“œ 및 ν•„μˆ˜ μ„€μ • 검증
- `freshqa/`
- `fresheval.py`: 단일 μƒ˜ν”Œ 평가 둜직
- `fresheval_parallel.py`: λ°μ΄ν„°ν”„λ ˆμž„ 병렬 평가 래퍼
- `freshqa_acc.py`: 평가 κ²°κ³Ό 집계(정확도 계산 및 도메인별 톡계)
- `merge_csv_with_model_response.py`: κΈ°μ€€ 데이터와 μ‚¬μš©μž CSV 병합
- `src/`
- `submission_handler.py`: μ œμΆœλΆ€ν„° λ¦¬λ”λ³΄λ“œ λ°˜μ˜κΉŒμ§€ 전체 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜
- `submission_tracker.py`: 제좜 이λ ₯ 좔적(HF repo 기반, μ˜΅μ…˜)
- `leaderboard_manager.py`: λ¦¬λ”λ³΄λ“œ CSV λ‘œλ“œ/μ €μž₯/ν‘œμ‹œμš© 정리
- `quick_csv_loader.py`, `hf_private_csv_loader.py`: HF Private repoμ—μ„œ CSV λ‘œλ“œ μœ ν‹Έ
- `api_key_rotator.py`, `utils.py`: μœ ν‹Έλ¦¬ν‹°
- `ui/`
- `leaderboard_tab.py`, `submission_tab.py`, `dataset_tab.py`, `styles.css`
- `data/leaderboard_results.csv`: λ¦¬λ”λ³΄λ“œ λˆ„μ  데이터
---
## μš”κ΅¬ 사항
- Python 3.10
- Upstage API ν‚€(단일 λ˜λŠ” 닀쀑)
- Hugging Face 토큰(HF Private repo μ ‘κ·Όμš©)
- Hugging Face Dataset repo
- κΈ°μ€€ 데이터: `FRESHQA_DATA_REPO_ID` / `FRESHQA_DATA_FILENAME`
- (μ˜΅μ…˜) 제좜 좔적 μ €μž₯μ†Œ: `SUBMISSION_TRACKER_REPO_ID`
- (μ˜΅μ…˜) λ¦¬λ”λ³΄λ“œλ₯Ό Hugging Face dataset에 λ°±μ—…ν•˜λ €λ©΄ `UPLOAD_LEADERBOARD_TO_HF=true` μ„€μ •
μ„€μΉ˜:
```bash
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
```
λ˜λŠ” Conda:
```bash
conda env create -f environment.yml
conda activate freshqa-leaderboard
```
---
## ν™˜κ²½ λ³€μˆ˜(.env)
`env.example`λ₯Ό `.env`둜 볡사 ν›„ κ°’ μ±„μš°κΈ°:
```bash
cp env.example .env
```
ν•„μˆ˜/μ£Όμš” λ³€μˆ˜
- HF_TOKEN
- FRESHQA_DATA_REPO_ID
- FRESHQA_DATA_FILENAME (κΈ°λ³Έκ°’: ko-freshqa_2025_total.csv)
- UPSTAGE_API_KEY λ˜λŠ” UPSTAGE_API_KEYS(콀마 ꡬ뢄)
- ENABLE_SUBMISSION_LIMIT (κΈ°λ³Έ: true)
- SUBMISSION_TRACKER_REPO_ID (제좜 μ œν•œ μ‚¬μš© μ‹œ ν•„μš”)
- UPLOAD_LEADERBOARD_TO_HF
- true: λ¦¬λ”λ³΄λ“œλ₯Ό HF Private Dataset에도 λ°±μ—…(ꢌμž₯: 운영 ν™˜κ²½)
- false: 둜컬 CSVμ—λ§Œ μ €μž₯(ꢌμž₯: 둜컬 개발)
검증: μ•± μ‹œμž‘ μ‹œ `Config.validate_required_configs()`κ°€ λˆ„λ½λœ ν•„μˆ˜ 섀정을 κ²€μ‚¬ν•©λ‹ˆλ‹€.
---
## μ‹€ν–‰
둜컬:
```bash
python app.py
```
기본 포트: 7860
Hugging Face Spaces:
- ν™˜κ²½λ³€μˆ˜ `SPACE_ID`κ°€ μ‘΄μž¬ν•˜λ©΄ Spaces λͺ¨λ“œλ‘œ λ™μž‘ν•©λ‹ˆλ‹€.
Docker(μ˜΅μ…˜):
- `Dockerfile`, `docker-compose.yml` 제곡 (ν•„μš” μ‹œ 섀정에 맞게 μˆ˜μ •)
---
## μ‚¬μš© 방법(Gradio UI)
1) 데이터셋 νƒ­
- DEV/TEST CSV λ‹€μš΄λ‘œλ“œ
2) 제좜 및 평가 νƒ­
- μ—…λ‘œλ“œ: TEST CSV에 `model_response`κ°€ μ±„μ›Œμ§„ 파일
- μž…λ ₯: 제좜자 이름, μ‚¬μš© λͺ¨λΈ, μ„€λͺ…
- 평가: Upstage Solar λͺ¨λΈλ‘œ Relaxed/Strict λ™μ‹œ μˆ˜ν–‰
- 좜λ ₯: 전체/μ„ΈλΆ€ μ§€ν‘œκ°€ κ³„μ‚°λ˜μ–΄ λ¦¬λ”λ³΄λ“œμ— 반영
3) λ¦¬λ”λ³΄λ“œ νƒ­
- 제좜 κ²°κ³Όκ°€ `data/leaderboard_results.csv`에 λˆ„μ 
- (μ˜΅μ…˜) `UPLOAD_LEADERBOARD_TO_HF=true`인 경우 Hugging Face Dataset에도
`leaderboard_results.csv`둜 μžλ™ μ—…λ‘œλ“œλ©λ‹ˆλ‹€.
- 검색/μƒˆλ‘œκ³ μΉ¨ κ°€λŠ₯
---
## λ™μž‘ 흐름(λ‚΄λΆ€)
1) 제좜 μ ‘μˆ˜: `src/submission_handler.py::process_submission`
2) μ‚¬μš©μž CSV λ‘œλ“œ β†’ κΈ°μ€€ 데이터와 병합:
- `freshqa/merge_csv_with_model_response.py::merge_dataframe_with_model_response_df`
3) 평가:
- `freshqa/fresheval_parallel.py::evaluate_dataframe` β†’ `freshqa/fresheval.py::FreshEval`
4) 정확도 집계:
- `freshqa/freshqa_acc.py::calculate_accuracy`, `process_freshqa_dataframe`
5) μ €μž₯:
- λ¦¬λ”λ³΄λ“œ: `src/leaderboard_manager.py::append_to_leaderboard_data`
- (μ˜΅μ…˜) λ¦¬λ”λ³΄λ“œ HF μ €μž₯μ†Œ λ°±μ—…: `UPLOAD_LEADERBOARD_TO_HF=true`일 λ•Œλ§Œ
- (μ˜΅μ…˜) 제좜 이λ ₯: `src/submission_tracker.py` (ENABLE_SUBMISSION_LIMIT=true 일 λ•Œλ§Œ)
주의: `ENABLE_SUBMISSION_LIMIT=false`인 경우, 제좜 이λ ₯ μΆ”μ μš© Hugging Face μ €μž₯μ†Œ 접근을 μ‹œλ„ν•˜μ§€ μ•Šλ„λ‘ μ½”λ“œκ°€ λ°˜μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
---
## 제좜 μ œν•œ(μ˜΅μ…˜)
- μ„€μ •: `ENABLE_SUBMISSION_LIMIT=true`(κΈ°λ³Έ)
- μ €μž₯μ†Œ: `SUBMISSION_TRACKER_REPO_ID`에 `user_submissions.json` 관리
- 둜직:
- ν•œ μ‚¬μš©μž ν•˜λ£¨ 3회 성곡 μ œμΆœκΉŒμ§€ 카운트
- ν•œκ΅­ μ‹œκ°„ κΈ°μ€€ 00:00에 일자 λ‹¨μœ„λ‘œ 카운트
- λΉ„ν™œμ„±ν™” μ‹œ(HF μ €μž₯μ†Œ μ ‘κ·Ό μ—†μŒ): `SubmissionHandler`κ°€ 좔적기λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŒ
---
## νŠΈλŸ¬λΈ”μŠˆνŒ…
- μ‹œμž‘ μ‹œ β€œν•„μˆ˜ μ„€μ • λˆ„λ½β€ 였λ₯˜
- `.env`μ—μ„œ `UPSTAGE_API_KEY(or KEYS)`, `HF_TOKEN`, `FRESHQA_DATA_REPO_ID` 확인
- 제좜 μ œν•œ λΉ„ν™œμ„±ν™”μΈλ° HF 404 κ²½κ³ κ°€ λ³΄μž„
- ν˜„ 버전은 `ENABLE_SUBMISSION_LIMIT=false`일 λ•Œ 제좜 좔적기λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šλ„λ‘ μˆ˜μ •λ¨
- HF 404 (제좜 μ œν•œ ν™œμ„±ν™”)
- `SUBMISSION_TRACKER_REPO_ID` μ €μž₯μ†Œμ— `user_submissions.json`이 μ—†μœΌλ©΄ 졜초 μ ‘κ·Ό μ‹œ 404κ°€ λ‚  수 μžˆμŠ΅λ‹ˆλ‹€. νŒŒμΌμ„ 빈 JSON `{}`으둜 생성해 λ‘μ„Έμš”.
---
## λΌμ΄μ„ μŠ€/좜처
- λ³Έ λ¦¬λ”λ³΄λ“œλŠ” FreshQAμ—μ„œ μ˜κ°μ„ λ°›μ•„ μ œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
문의 사항은 이슈둜 등둝해 μ£Όμ„Έμš”.