일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- golang slice remove
- receiver method
- 패스트캠퍼스업스테이지부트캠프
- 상수
- 패스트캠퍼스
- 스코프
- golang interface
- UpstageAILab
- 국비지원
- receiver
- scope
- array
- 패스트캠퍼스AI부트캠프
- golang
- 패스트캠퍼스업스테이지에이아이랩
- struct
- Interface
- keyword
- 타입
- slice
- 변수
- golang pointer
- 메서드
- golang array
- 업스테이지패스트캠퍼스
- method
- Pointer
- package
- 함수
- golang slice
Archives
- Today
- Total
느리지만 꾸준히, 코딩
과학 지식 질의 IR 경진대회 본문
1. 서론
이번 Information Retrieval(이하 IR) 대회는 “질문과 이전 대화 히스토리를 보고 최적의 문서를 찾아 답변을 생성”하는 과제를 해결하는 과정이었습니다. 2025-04-16 부터 2025-04-22 까지 단 1주일이라는 짧은 기간 동안 빠르게 가설을 세우고, 실험을 반복하며, 점차 성능을 끌어올렸습니다. 최종적으로는 0.8833이라는 만족스러운 점수에 도달했고, 그 과정에서 검색 · 분류 · 재랭킹 전반에 걸친 노하우를 축적했습니다.
2. 대회 목표 & 범위
구분 내용
궁극적 목표 | 다양한 질의 유형(과학 지식 질문 vs 일반 질문)에 대해 정확하고 빠른 문서 검색 파이프라인 구축 |
제한 사항 | 1. 과학 · 지식 질문에만 문서 검색 적용2. 그 외 질문은 문서 검색 X |
평가지표 | 대회 측에서 제공한 전용 스코어(정확도 + 정성 평가 혼합) |
기간 | 2025-04-16 ~ 2025-04-22 (7 일) |
3. 실험 연대기
실험 핵심 전략 주요 변화 점수
1 | Function Call 기반 검색 | 슬라이드 정보를 함수 호출로 직접 꺼내 쓰도록 시도 | 0.3197 |
2 | 한글 쿼리 + 간단 분류기 | 영문 대신 한글 쿼리로 전환, 질문을 과학/비과학으로 분류 | 0.7424 |
3 | 문서 기반 분류기 Fine-tuning | Gemma-3-4B를 미세조정하여 질문–문서 적합성 분류 | 0.7848 |
4 | 문서 Chunking | 긴 문서를 문단 단위로 쪼개어 Recall ↑ | — |
5 | Re-Ranker 도입 | BM25 top-k → Cross-Encoder 재랭킹 | — |
6 | 임베딩 모델 교체 | jinaai/jina-embeddings-v3 적용, 하이브리드 검색 | 0.8833 |
7 | 질문 증강 | ReAct 스타일 키워드 보강 | — |
4. 단계별 회고
4.1 실험 1 — Function Call
“문서에 정답이 있는데 함수 호출이 안 일어난다?”
- 문제: LLM이 함수 호출 트리거 토큰을 학습하지 못함 → 정답 포함해도 call 불청.
- 교훈: 구조화 출력 제어(토큰 강제, tool description) 없이는 LLM이 일관되게 행동하지 않는다.
4.2 실험 2 — 한글 쿼리 & 라이트 분류기
- 쿼리를 Korean BM25로 변환
- 간단한 키워드 규칙으로 “과학 질문”만 검색 적용.
↳ 에러 케이스: “피라미드 높이는?” → 비과학으로 잘못 분류.
4.3 실험 3 — 문서 기반 분류기 Fine-tuning
- Gemma-3-4B 파인 튜닝.
- Prompt 설계: “질문 Q 와 문서 D 가 있을 때, 답이 D 안에 있나?” → 분류
- Fine-tune 효과 검증.
4.4 실험 4 ~ 5 — Chunking & Re-Ranking
- 긴 PDF → 한글문장 분류 Chunking 후 성능 향상
- Cross-Encoder로 top-10 재랭킹 → Precision 눈에 띄게 개선.
- 다만 latency ↑
4.6 실험 6 — Embedding 교체
- 기존 모델의 한국어 표현력 한계 인지 →jina-embeddings-v3(multilingual, 1024-dim)로 전환
- 최종 0.8833 달성
4.7 실험 7 — 질문 증강
- ReAct 프롬프트로 “질문 분해 + 연관 키워드” 생성하여 검색 다양화
- 점수 개선은 미미
4.8 최종 구조
5. 활용 정리
범주 선택/구현 내용 이유
Retrieval | BM25 (elasticsearch) + Chroma | 전통 vs 임베딩 결합 효과 |
Embedding | jina-embeddings-v3 | 한국어 다국어 성능 우수 |
Re-Rank | cross-encoder/ms-marco-MiniLM-L-6-v2 | 경량 + 빠른 추론 |
Prompt Eng. | Tool Calling | 일관된 함수 호출 |
6. 결과 & 성과
- Public Score: 0.8833
- RAG 파이프라인 구축 경험: 검색-분류-재랭킹
- 한국어 IR에서 Chunking + 멀티랭 임베딩 조합의 실효성 확인.
7. 아쉬움 & 배운 점
- 데이터 스케일링
- Fine-tune 데이터가 제한적이어서 Overfitting 위험 ⟶ knowledge distillation 시도 못함.
- Latency–Quality Trade-off
- Re-Ranker depth 조정이 어려웠음. Elastic Search score cutoff 자동화 필요.
- Tool Calling 안정화
- System prompt 설계가 성능만큼 중요. 함수 호출 실패확률 존재
8. 다음 단계
- Dense Retriever 학습: Korean ColBERT or Contriever-KR로 BM25 대체.
- Adaptive Chunking: 문서 구조 분석(heading, list) 기반 가변 chunk.
- Re-Ranker Distil: larger cross-encoder knowledge → Tiny-BERT distillation.
- RAG 강화: Retrieval-Aware Generation(RAG-Fusion)로 answer faithfulness 향상.
9. 결론
짧은 기간이었지만, 실험적 탐구 → 원인 분석 → 전략 수정을 일일 사이클로 빠르게 반복하며 의미 있는 성과를 냈습니다. 특히 IR에서 하이브리드 검색 + 임베딩 모델 교체가 미치는 성능 개선을 경험했고, “검색 품질은 전처리(쿼리 · 문서)와 후처리(재랭킹)” 라는 교훈을 얻었습니다. 이번 경험을 바탕으로 더 깊이 있는 RAG 시스템을 설계해 보고자 합니다.
'프로그래밍 > AI' 카테고리의 다른 글
LangChain 기반 부트캠프 RAG봇 프로젝트 수행 후기 (0) | 2025.04.10 |
---|---|
업스테이지 NLP 경진대회 (0) | 2025.03.26 |
업스테이지 CV 경진대회 정리 (0) | 2025.03.02 |
tensor: dim 이해하기 (0) | 2025.02.11 |
역전파 (0) | 2025.02.10 |