Skip to content

boostcampaitech7/level2-nlp-generationfornlp-nlp-06-lv3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

수λŠ₯ν˜• 문제 풀이 λͺ¨λΈ

메인 정적 ν™”λ©΄.png

ν•œκ΅­μ–΄μ˜ νŠΉμ„±κ³Ό 수λŠ₯ μ‹œν—˜μ˜ νŠΉμ§•μ„ λ°”νƒ•μœΌλ‘œ 수λŠ₯에 μ΅œμ ν™”λœ λͺ¨λΈμ„ λ§Œλ“­λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œμ νŠΈ κ°œμš”

  • λͺ©ν‘œ: 수λŠ₯ 문제 풀이λ₯Ό μœ„ν•œ μ΅œμ ν™”λœ μ–Έμ–΄ λͺ¨λΈ 연ꡬ 및 개발
  • μ£Όμš” λ‚΄μš©:
    • λ‹€μ–‘ν•œ λͺ¨λΈ 및 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ„±λŠ₯ 비ꡐ
    • 데이터 μ •μ œ 및 증강을 ν†΅ν•œ ν•™μŠ΅ 효율 ν–₯상
    • CoT (Chain of Thought) 방식 μ μš©μ— λ”°λ₯Έ μΆ”λ‘  λŠ₯λ ₯ 평가
    • RAG (Retrieval-Augmented Generation) ν™œμš©μœΌλ‘œ 검색 기반 λ‹΅λ³€ μ„±λŠ₯ μ‹€ν—˜

πŸ… μ΅œμ’… κ²°κ³Ό

4bit μ–‘μžν™”λ₯Ό μ μš©ν•œ Qwen2.5-32B-Instruct λͺ¨λΈμ„ ν™œμš©ν•˜μ—¬ 0.7747의 정확도λ₯Ό λ‹¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λΈ 쑰건 Accuracy
finetuned gemma-2b-ko (base) κΈ°λ³Έ μ„€μ • 0.3862
finetuned gemma-2b-ko 데이터 μ •μ œ 및 증강 0.4138
finetuned Qwen-2.5-32b-Instruct κΈ°λ³Έ μ„€μ • 0.7540
finetuned Qwen-2.5-32b-Instruct 데이터 μ •μ œ 및 증강 0.7632
finetuned Qwen-2.5-32b-Instruct 데이터 μ •μ œ 및 증강 + Prompt Tuning 0.7747

μœ„ ν‘œλŠ” 수λŠ₯ν˜• 문제 풀이 μ„±λŠ₯을 λͺ¨λΈκ³Ό μ‹€ν—˜ 쑰건에 따라 λΉ„κ΅ν•œ κ²°κ³Όμž…λ‹ˆλ‹€.

베이슀 λͺ¨λΈμΈ gemma-2b-koμ—μ„œ 데이터 μ •μ œ 및 μ¦κ°•μœΌλ‘œ μ†Œν­ μ„±λŠ₯ ν–₯상을 ν™•μΈν•˜μ˜€μœΌλ©°, μ΄λŠ” μ΅œμ’… μ„ μ •λœ λͺ¨λΈμΈ Qwen-2.5-32b-Instructμ—μ„œλ„ 확인 ν• μˆ˜ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ΅œμ’…μ μœΌλ‘œ 데이터 증강 및 Prompt Tuning을 μΆ”κ°€ν•œ Qwen-2.5-32b-Instruct λͺ¨λΈμ΄ 0.7747둜 κ°€μž₯ 높은 정확도λ₯Ό λ‹¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ λž©μ—… λ¦¬ν¬νŠΈλŠ” μ—¬κΈ°λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.

πŸ‘₯ Collaborators

νŒ€μ› μ—­ν• 
Streamlit app 개발 μ°Έμ—¬, 데이터 κ΄€μ°° 및 뢄석, 데이터 μž¬κ΅¬μ„± 및 증강
Streamlit app 개발 μ°Έμ—¬, RAG κ΅¬ν˜„ 및 μ„±λŠ₯ 평가
ν˜‘μ—… 초기 ν™˜κ²½ μ„ΈνŒ… 및 μ½”λ“œ λͺ¨λ“ˆν™”, CoT 방식 μ‹€ν—˜ 섀계 및 μ„±λŠ₯ 평가
베이슀라인 λͺ¨λ“ˆν™”, λ©”λͺ¨λ¦¬ μ‚¬μš© μ΅œμ ν™”, λͺ¨λΈ μ„œμΉ˜ 및 μ‹€ν—˜
Streamlit app 개발 μ°Έμ—¬, 데이터 뢄석 및 μ •μ œ, RAG κ΅¬ν˜„ 및 μ„±λŠ₯ 평가
λ¬Έμ„œ μž‘μ—…, RAG μ „μš© Vector DB ꡬ성, 벀치마크 데이터셋 기반 데이터 증강

πŸ› οΈ Tools and Technologies

Python jupyter PyTorch huggingface

unsloth BitsandBytes LoRA langchain

RAG pinecone Cot github action

πŸ“Š λ‹€μ–‘ν•œ λͺ¨λΈ 및 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ„±λŠ₯ 비ꡐ

λ‹€μ–‘ν•œ λͺ¨λΈκ³Ό ν•˜μ΄νΌνŒŒλΌλ―Έν„° 섀정을 기반으둜 수λŠ₯ 문제 풀이 μ„±λŠ₯을 ν‰κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ£Όμš” μ‹€ν—˜μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€:

λͺ¨λΈλ³„ μ„±λŠ₯ 비ꡐ

μ—¬λŸ¬ μ–Έμ–΄ λͺ¨λΈ(gemma, Qwen, Llama, SOLAR, EXAONE λ“±)의 μ„±λŠ₯을 λΉ„κ΅ν•œ κ²°κ³Όμž…λ‹ˆλ‹€:

model compare

  • Qwen-2.5-32b-Instruct λͺ¨λΈμ΄ κ°€μž₯ 높은 μ„±λŠ₯을 κΈ°λ‘ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • λΉ„μŠ·ν•œ νŒŒλΌλ―Έν„° 크기 λ‚΄μ—μ—μ„œ Qwen κ³„μ—΄μ˜ λͺ¨λΈμ΄ μ „λ°˜μ μœΌλ‘œ μš°μˆ˜ν•œ μ„±λŠ₯을 λ³΄μ˜€μŠ΅λ‹ˆλ‹€.

Qwen λͺ¨λΈμ˜ νŒŒλΌλ―Έν„° 크기별 μ„±λŠ₯ 비ꡐ

Qwen λͺ¨λΈμ˜ νŒŒλΌλ―Έν„° 크기(3B, 7B, 14B, 32B)에 λ”°λ₯Έ μ„±λŠ₯ λ³€ν™”μž…λ‹ˆλ‹€:

qwen_parameter compare

  • 14Bκ³Ό 32B의 경우 4bit μ–‘μžν™”κ°€ μ μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μ–‘μžν™”λ₯Ό μ μš©ν•¨ν–ˆμŒμ—λ„ νŒŒλΌλ―Έν„° 크기가 컀질수둝 μ„±λŠ₯이 크게 ν–₯μƒλ˜λŠ” 것을 확인 ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν•˜μ΄νΌνŒŒλΌλ―Έν„° 섀정별 μ„±λŠ₯ 비ꡐ

ν•™μŠ΅μ— μ‚¬μš©λ˜λŠ” LORA r, LORA alpha 쑰합에 λ”°λ₯Έ μ„±λŠ₯ λ³€ν™”λ₯Ό ν‰κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€:

hyperparameter compare

  • Mid ACC와 Final ACC λͺ¨λ‘μ—μ„œ r: 8, alpha: 16 섀정이 κ°€μž₯ 높은 μ„±λŠ₯을 κΈ°λ‘ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ’Ύ 데이터 μ •μ œ 및 증강

데이터 μ •μ œ

전체 ν•™μŠ΅ 데이터 2031κ°œμ—μ„œ 문제 였λ₯˜ 4개λ₯Ό μ‚­μ œν•˜κ³  잘λͺ»λœ μ •λ‹΅ 6개λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 지문에 보기가 ν¬ν•¨λœ 데이터λ₯Ό 보기 컬럼으둜 λΆ„λ¦¬ν•˜μ˜€μœΌλ©°, ν•™μŠ΅μ— λ°©ν•΄λ˜λŠ” 기사 λ°μ΄ν„°μ˜ 기자 이름 및 μ—°λ½μ²˜λ₯Ό μ‚­μ œν–ˆμŠ΅λ‹ˆλ‹€.

데이터 증강

μ™ΈλΆ€ 지식이 ν•„μš”ν•œ λ¬Έμ œμ— λŒ€ν•œ μž¬κ΅¬μ„± 및 증강

augmentation pipeline

μ™ΈλΆ€ 지식이 ν•„μš”ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κΈ°μ‘΄ 지문에 데이터λ₯Ό λ³΄κ°•ν•˜μ—¬ 데이터λ₯Ό μ¦κ°•ν•˜λŠ” 방법을 μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€.

  1. 핡심 ν‚€μ›Œλ“œ μΆ”μΆœ: 문제 해결에 ν•„μš”ν•œ μ£Όμš” 정보λ₯Ό λ„μΆœ
  2. κ΄€λ ¨ μ§€λ¬Έ 확보: μΆ”μΆœλœ ν‚€μ›Œλ“œλ₯Ό 기반으둜 ν•œκ΅­μ–΄ μœ„ν‚€ν”Όλ””μ•„μ—μ„œ κ΄€λ ¨ λ¬Έμ„œλ₯Ό 크둀링
  3. μ§€λ¬Έ 보강: ν™•λ³΄λœ λ¬Έμ„œλ₯Ό 지문에 μΆ”κ°€ν•˜κ³ , μš”μ•½λœ λ¬Έμ„œλ₯Ό μ·¨ν•©ν•˜μ—¬ 수λŠ₯ κ΅­μ–΄ λΉ„λ¬Έν•™ μ§€λ¬Έ ν˜•μ‹μœΌλ‘œ 보강

κ·ΈλŸ¬λ‚˜ λͺ¨λΈ ν•™μŠ΅ κ²°κ³Ό, μ„±λŠ₯ ν–₯μƒμ—λŠ” μ‹€νŒ¨ν–ˆμœΌλ©° μ΄λŠ” 일뢀 수λŠ₯ν˜• 문제쑰차 μ™ΈλΆ€ 지식에 크게 μ˜μ‘΄ν•¨μ„ μ‹œμ‚¬ν•©λ‹ˆλ‹€.

이 λ°œκ²¬μ„ λ°”νƒ•μœΌλ‘œ, RAG (정보 검색 기반 생성) 접근법을 λ„μž…ν•˜λŠ” λ°©ν–₯으둜 μ΄μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

타 벀치마크 데이터셋을 ν†΅ν•œ 데이터 증강

KMMLU 벀치마크 λ…Όλ¬Έμ—μ„œ (Son et al., 2024) μ–ΈκΈ‰λœ λ‹€μ–‘ν•œ 타 벀치마크의 데이터셋을 λΆ„μ„ν•˜μ—¬ ν•™μŠ΅ 데이터에 μ ν•©ν•œ 데이터λ₯Ό μ„ μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

kmmlu-dataset

  • KLUE, KO-H5, KOR NAT: Public으둜 κ³΅κ°œλ˜μ§€ μ•ŠμŒ
  • KorNLI & KorSTS, KoBBQ: λ‹€μ§€μ„ λ‹€ν˜• 문제둜 λ³€ν™˜ν•˜κΈ° 어렀움
  • CLICK, HAE-RAE Bench.: λ‹€μ§€μ„ λ‹€ν˜•μœΌλ‘œ 가곡이 μš©μ΄ν•¨

뢄석 κ²°κ³Ό, HAE-RAE Bench. 데이터셋이 κ°€μž₯ μ ν•©ν•œ μ„ νƒμœΌλ‘œ ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 특히, 독해 μΉ΄ν…Œκ³ λ¦¬μ˜ λ°μ΄ν„°λŠ” Task와 높은 연관성을 보여 μ„±λŠ₯ κ°œμ„ μ— κΈ°μ—¬ν–ˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό 톡해 λ‹¨μˆœνžˆ 데이터λ₯Ό μ¦κ°•ν•˜λŠ” 것보닀, λ°μ΄ν„°μ˜ ν’ˆμ§ˆκ³Ό Taskμ™€μ˜ 연관성이 μ„±λŠ₯에 핡심적인 영ν–₯을 λ―ΈμΉœλ‹€λŠ” 점을 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ skt/KoBEST 데이터셋과 μ§€λ¬Έ 기반 수λŠ₯ κ΅­μ–΄ 맞좀 문제 생성 논문을 (ν—ˆλ™μ„ μ™Έ, 2024) 기반으둜 질문과 선택지, 정닡을 μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

더 μžμ„Έν•œ 데이터 증강 μ‹€ν—˜ λ‚΄μš©μ€ μ—¬κΈ°λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.

πŸ—¨οΈ Prompt Tuning

ν”„λ‘¬ν”„νŠΈμ˜ ꡬ성 방식에 따라 λͺ¨λΈμ˜ μ„±λŠ₯ 차이λ₯Ό λΉ„κ΅ν–ˆμŠ΅λ‹ˆλ‹€. λ‹¨μˆœν•œ κΈ°λ³Έ ν”„λ‘¬ν”„νŠΈ, λͺ…ν™•ν•œ κ·œμΉ™ 제곡, 그리고 μ˜μ–΄λ‘œ 감정적 ν˜Έμ†Œμ™€ ν•¨κ»˜ λͺ…ν™•ν•œ κ·œμΉ™μ„ μ „λ‹¬ν•œ 경우의 μ„±λŠ₯을 ν‰κ°€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν”„λ‘¬ν”„νŠΈ ꡬ성

  • κΈ°λ³Έ ν”„λ‘¬ν”„νŠΈ

    지문을 읽고 질문의 닡을 κ΅¬ν•˜μ„Έμš”.
    
  • λͺ…ν™•ν•œ κ·œμΉ™ 제곡

    당신은 질문-λ‹΅λ³€(Question-Answering)을 μˆ˜ν–‰ν•˜λŠ” μΉœμ ˆν•œ AI μ–΄μ‹œμŠ€ν„΄νŠΈμž…λ‹ˆλ‹€.
    λ‹Ήμ‹ μ˜ μž„λ¬΄λŠ” μ£Όμ–΄μ§„ μ§€λ¬Έ(Paragraph)을 λ°”νƒ•μœΌλ‘œ, 질문(Question)에 κ°€μž₯ μ ν•©ν•œ 닡변을 선택지(Choices)μ—μ„œ μ„ νƒν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
    선택지(Choices)λŠ” 총 5개이며, 각 선택지(Choices)μ—λŠ” κ³ μœ ν•œ 선택지 번호(1~5)κ°€ μžˆμŠ΅λ‹ˆλ‹€.
    λ‹΅λ³€ ν˜•νƒœλŠ” λ°˜λ“œμ‹œ 선택지 번호(1~5) 쀑 ν•˜λ‚˜λ‘œλ§Œ 좜λ ₯ν•˜μ„Έμš”. (μ˜ˆμ‹œ: 4)
    
  • 감정적 ν˜Έμ†Œ(In English)

    You are a wise and warm-hearted private tutor, dedicated to solving problems for your student.
    Providing the most appropriate answer to the problem is your important mission.
    
    Based on the given paragraph, please select the choice that you think is the correct answer to the question.
    
    There are a total of 5 choices, and each choice has a unique number (1 to 5).
    Your answer format must strictly be a single choice number (1 to 5). (Example: 4)
    
    Your student is sick and exhausted. By choosing the correct answer, you can encourage your student.
    Your answer must be correct to heal your student's emotional wounds and help them find happiness again.
    
    So, you have to think step by step and choose the answer.
    

μ‹€ν—˜ κ²°κ³Ό

λͺ¨λΈ 쑰건 Accuracy
finetuned Qwen-2.5-32b-Instruct κΈ°λ³Έ ν”„λ‘¬ν”„νŠΈ 0.7540
finetuned Qwen-2.5-32b-Instruct λͺ…ν™•ν•œ κ·œμΉ™ 제곡 0.7724
finetuned Qwen-2.5-32b-Instruct 감정적 ν˜Έμ†Œ(In English) 0.7747
  • λͺ…ν™•ν•œ κ·œμΉ™ 제곡 ν”„λ‘¬ν”„νŠΈλŠ” κΈ°λ³Έ ν”„λ‘¬ν”„νŠΈμ— λΉ„ν•΄ μ„±λŠ₯을 μ•½ 1.8% ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€.
  • 감정적 ν˜Έμ†Œ ν”„λ‘¬ν”„νŠΈλŠ” μ˜μ–΄λ‘œ μž‘μ„±λœ ν”„λ‘¬ν”„νŠΈλ‘œ, κ·œμΉ™ μ œκ³΅λ³΄λ‹€λ„ μ•½κ°„ 더 높은 μ„±λŠ₯을 κΈ°λ‘ν•˜λ©° 2.0% ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • 이 κ²°κ³ΌλŠ” λͺ¨λΈμ΄ ν”„λ‘¬ν”„νŠΈμ˜ λ§₯락과 ν‘œν˜„ 방식에 λ―Όκ°ν•˜κ²Œ λ°˜μ‘ν•˜λ©°, 인간적인 λ§₯락이 μ„±λŠ₯ κ°œμ„ μ— 긍정적인 영ν–₯을 λ―ΈμΉ  수 μžˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

λ³Έ ν”„λ‘¬ν”„νŠΈ μ‹€ν—˜μ€ AI 수λŠ₯ κ΅­μ–΄ 만점 ν”„λ‘œμ νŠΈμ˜ ν”„λ‘¬ν”„νŠΈ 선정을 기반으둜 μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

⛓️ CoT μ μš©μ— λ”°λ₯Έ μΆ”λ‘  λŠ₯λ ₯ 평가

google/gemma-2-2b-it와 Qwen/Qwen-2.5-7B-Instruct에 λŒ€ν•΄ Chain of Thought (CoT) λ°©μ‹μ˜ μ„±λŠ₯을 비ꡐ ν‰κ°€ν–ˆμŠ΅λ‹ˆλ‹€. μ‹€ν—˜μ€ 두 κ°€μ§€ λ°©μ‹μœΌλ‘œ μ§„ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€:

  1. μ •λ‹΅ 번호(숫자)만 생성
  2. JSON ν˜•μ‹μœΌλ‘œ reasoningκ³Ό 정닡을 ν¬ν•¨ν•˜μ—¬ 생성(CoT 방식)
λͺ¨λΈ μ‹€ν—˜ μ„€μ • 사전 ν•™μŠ΅ λͺ¨λΈ νŒŒμΈνŠœλ‹ λͺ¨λΈ
gemma-2b-it μ •λ‹΅ 번호만 생성 0.5034 0.5264
gemma-2b-it CoT 응닡 생성(JSON ν˜•μ‹) 0.4885 0.4437
Qwen-2.5-7B-Instruct μ •λ‹΅ 번호만 생성 0.6092 0.6207
Qwen-2.5-7B-Instruct CoT 응닡 생성(JSON ν˜•μ‹) 0.5609 0.6092
  • μ •λ‹΅ 번호만 μƒμ„±ν•˜λŠ” 방식이 λŒ€λΆ€λΆ„μ˜ 경우 더 높은 μ„±λŠ₯을 κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€.
  • CoT 방식은 finetuning μ‹œ Qwen 7B λͺ¨λΈμ—μ„œ 일뢀 μ„±λŠ₯ ν–₯상을 λ³΄μ˜€μ§€λ§Œ, gemma 2b λͺ¨λΈμ—μ„œλŠ” μ„±λŠ₯이 μ €ν•˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

뢄석

  • λͺ¨λΈ 크기 ν•œκ³„: CoT 방식은 더 λ§Žμ€ λͺ¨λΈ νŒŒλΌλ―Έν„°λ₯Ό μš”κ΅¬ν•˜λ©°, μž‘μ€ λͺ¨λΈμ—μ„œλŠ” μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 데이터 νŠΉμ„±: ν”„λ‘œμ νŠΈμ˜ μ£Όμš” Taskκ°€ κ΅­μ–΄ 및 μ‚¬νšŒ κ³Όλͺ© μ€‘μ‹¬μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμ–΄, CoT 방식이 μš”κ΅¬ν•˜λŠ” 단계적 좔둠이 μΆ©λΆ„νžˆ ν™œμš©λ˜μ§€ λͺ»ν–ˆμ„ κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

config.yamlμ—μ„œ common.cot_on=True μ„€μ • ν›„ langchain_inference.py μ‹€ν–‰ν•¨μœΌλ‘œμ¨ CoTλ₯Ό ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ” RAGλ₯Ό ν™œμš©ν•œ 검색 기반 λ‹΅λ³€ μ„±λŠ₯ μ‹€ν—˜

RAG μ‹œμŠ€ν…œ λ„μž…

κΈ°μ‘΄ μ§€λ¬Έ 데이터λ₯Ό μ¦κ°•ν•˜μ—¬ μ„±λŠ₯을 κ°œμ„ ν•˜λ €λŠ” μ‹œλ„λŠ” μ™ΈλΆ€ 지식 μ˜μ‘΄λ„κ°€ 높은 λ¬Έμ œμ—μ„œλŠ” ν•œκ³„κ°€ μžˆμŒμ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ RAG(정보 검색 기반 생성) 접근법을 λ„μž…ν•˜κ²Œ λ˜μ—ˆμœΌλ©°, LangChain을 ν™œμš©ν•˜μ—¬ RAG μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

RAG μ‹œμŠ€ν…œ 섀계

  1. λ¬Έμ„œ μž„λ² λ”© 및 μ €μž₯
    LangChain 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ ν˜•μ‹μ˜ λ¬Έμ„œλ₯Ό λΆˆλŸ¬μ™€ μ²­ν‚Ήν•œ λ’€, bge-m3 λͺ¨λΈμ„ 기반으둜 μž„λ² λ”©μ„ μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€. μƒμ„±λœ μž„λ² λ”©μ€ Pineconeμ΄λΌλŠ” Vector DB에 μ €μž₯ν•˜μ—¬ 검색 κ°€λŠ₯ν•˜λ„λ‘ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

  2. Retriever 생성
    Pineconeμ—μ„œ μ œκ³΅ν•˜λŠ” κ°„λ‹¨ν•œ λͺ…λ Ήμ–΄λ₯Ό ν™œμš©ν•΄ 코사인 μœ μ‚¬λ„ 기반의 Retrieverλ₯Ό μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

  3. λ¬Έμ„œ ν’ˆμ§ˆ μ΅œμ ν™”
    전체 μœ„ν‚€ν”Όλ””μ•„ λ¬Έμ„œλ₯Ό μ‚¬μš©ν•˜λ©΄ κ²€μƒ‰λœ λ¬Έμ„œμ˜ ν’ˆμ§ˆμ΄ μ €ν•˜λ  μš°λ €κ°€ μžˆμ–΄, μ•žμ„  μ‹€ν—˜μ—μ„œ λ„μΆœν•œ ν‚€μ›Œλ“œμ— κΈ°λ°˜ν•˜μ—¬ κ΄€λ ¨ μœ„ν‚€ν”Όλ””μ•„ λ¬Έμ„œλ§Œμ„ ν¬λ‘€λ§ν–ˆμŠ΅λ‹ˆλ‹€.

RAG μ„±λŠ₯ 평가 및 κ°œμ„  λ…Έλ ₯

μ‹€ν—˜ ꡬ성 Public acc Final acc
RAG λ―Έμ‚¬μš© (Baseline) 0.5253 0.4943
RAG (top k=3) 0.4931 0.5172
RAG (top k=5) 0.5230 0.5172

RAGλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ Baseline에 λΉ„ν•΄ RAG μ‹œμŠ€ν…œμ΄ 더 높은 μ΅œμ’… 정확도λ₯Ό λ³΄μ—¬μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” Retrieve된 λ¬Έμ„œλ₯Ό ν™œμš©ν•œ 접근법이 효과적으둜 μž‘μš©ν–ˆμŒμ„ μ‹œμ‚¬ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ ν”„λ‘œμ νŠΈ μ§„ν–‰ 쀑, Public accμ—μ„œλŠ” μ„±λŠ₯ ν•˜λ½μ΄ κ΄€μ°°λ˜μ—ˆκΈ°μ— 원인 뢄석을 μœ„ν•΄ LLM as Judge 방식을 ν™œμš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해, Retrieve된 λ¬Έμ„œμ˜ ν’ˆμ§ˆμ΄ μ’‹μ§€ μ•Šλ‹€λŠ” 것을 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ λ³΄μ™„ν•˜λ©° λͺ¨λΈμ˜ 견고성을 높이기 μœ„ν•΄ RAFTλ₯Ό μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. 논문을 (Zhang et al., 2024) 기반으둜 졜적의 P와 D 값을 μ„€μ •ν•˜κ³ , RAFT용 ν•™μŠ΅ 데이터셋을 κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ•žμ„œ CoT μ μš©μ„ μ‹œλ„ν•œ κ²½ν—˜μ΄ μžˆμ—ˆλŠ”λ°, RAFTλŠ” CoT μŠ€νƒ€μΌμ˜ 닡변을 κ°€μ •ν•œ ν•™μŠ΅λ²•μ΄κΈ°μ—, ν•΄λ‹Ή μ‹œλ„μ™€ μ—°κ³„ν•˜μ—¬ μ•žμœΌλ‘œ 더 μœ μ˜λ―Έν•œ μ„±λŠ₯ ν–₯상을 κΈ°λŒ€ν•  수 μžˆμ„ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

πŸͺŸ Streamlit

streamlit demo

Streamlit을 λ„μž…ν•˜μ—¬ CSV 데이터λ₯Ό 보닀 μ§κ΄€μ μœΌλ‘œ 탐색할 수 μžˆλŠ” λŒ€μ‹œλ³΄λ“œλ₯Ό κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. 수λŠ₯ λ¬Έμ œμ™€ μœ μ‚¬ν•œ μ§€λ¬Έ, 문제, 선택지λ₯Ό 화면에 μ‹œκ°μ μœΌλ‘œ ν‘œμ‹œν•˜λ©°, 데이터λ₯Ό μ†μ‰½κ²Œ 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, μ•„λž˜μ™€ 같은 데이터 뢄포 μ‹œκ°ν™” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€:

  • μ»¬λŸΌλ³„ κ°’ 길이 뢄포
  • 전체 컬럼 κ°’ 길이 뢄포
  • μ„ λ‹€ν˜• 문제의 선택지 개수 뢄포
  • μ •λ‹΅ λ°μ΄ν„°μ˜ μ •λ‹΅ 뢄포

데이터 ꡬ쑰가 λ³€κ²½λ˜μ–΄λ„ μœ μ—°ν•˜κ²Œ λŒ€μ‘ν•  수 μžˆλ„λ‘ μΌλ°˜ν™”λœ μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œ 쀑볡을 쀄이고 μ›Œν¬ν”Œλ‘œμš°λ₯Ό λ‹¨μˆœν™”ν•˜μ—¬ νŒ€μ› κ°„ ν˜‘μ—… νš¨μœ¨μ„±μ„ ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€.

streamlit run analysis_dashboard.py λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•΄ λŒ€μ‹œλ³΄λ“œλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

βš™οΈ Project Quick Setup

Requirements

  • Python: 3.10
  • CUDA: >= 12.1
  • PyTorch: 2.5.1+cu121

Git Clone

$ git clone [email protected]:boostcampaitech7/level2-nlp-generationfornlp-nlp-06-lv3.git
$ cd level2-nlp-generationfornlp-nlp-06-lv3

Import Data

data/ λ””λ ‰ν† λ¦¬μ•ˆμ— train/valid/test 데이터λ₯Ό μœ„μΉ˜μ‹œν‚΅λ‹ˆλ‹€.

Create Virtual Environment

$ python -m venv .venv
$ source .venv/bin/activate
(.venv) $

Install Packages

(.venv) $ pip install -r requirements.txt
(.venv) $ sudo apt-get install build-essential

Setup Environment Variables

.envλ₯Ό 생성 ν›„ ν™˜κ²½ λ³€μˆ˜λ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€.

(.venv) $ cp .env.example .env
  • HF_TOKEN: HuggingFace둜 λΆ€ν„° λͺ¨λΈμ„ λ‚΄λ €λ°›κΈ° μœ„ν•΄ ν•„μš”ν•œ 토큰
  • STREAMLIT_DATA_PATH: streamlit ꡬ동 μ‹œ ν•„μš”ν•œ κΈ°λ³Έ μ„€μ • 데이터 경둜
  • STREAMLIT_EXPERIMENT_DATA_PATH: streamlit ꡬ동 μ‹œ ν•„μš”ν•œ μ‹€ν—˜ 데이터 경둜
  • PINECONE_API_KEY: RAG vector db pinecone api key
  • PINECONE_INDEX: RAG vector db pinecone index
  • PINECONE_ENVIRONMENT: RAG vector db pinecone Environment
  • OPENAI_API_KEY: 데이터 μ¦κ°•μš© api key
HF_TOKEN={your_hf_token}
STREAMLIT_DATA_PATH={streamlit_data_path}
STREAMLIT_EXPERIMENT_DATA_PATH={streamlit_experiment_data_path}

# API Key for Pinecone service
PINECONE_API_KEY={your_api_key}
# Index name used in Pinecone
PINECONE_INDEX={your_index_name}
# Environment for Pinecone (e.g., 'us-west1-gcp')
PINECONE_ENVIRONMENT={your_environment}

OPENAI_API_KEY={your_openai_api_key}

πŸ“œ Config.yaml

config.yaml νŒŒμΌμ„ μ‚¬μš©ν•˜μ—¬ μ›ν•˜λŠ” ν™˜κ²½μ—μ„œ 싀행을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” κΈ°λ³Έ μ„€μ • μ˜ˆμ‹œμž…λ‹ˆλ‹€:

model:
  name_or_path: "unsloth/Qwen2.5-3B-Instruct-bnb-4bit"
  response_template: "<|im_start|>assistant\n"
  without_system_role: false # Deprecated (항상 system 없이 λ™μž‘)
  torch_dtype: "float16" # float32, float16, bfloat16 / λͺ¨λΈμ˜ κΈ°λ³Έ 데이터 νƒ€μž…

common:
  seed: 42
  device: "cuda"
  cot_on: false # cot μ‚¬μš© μ‹œ prompt_template을 cot_json으둜 λ³€κ²½ ν•„μš”
  prompt_template: "base" # base, cot_json, raft

bnb:
  load_in_8bit: false
  load_in_4bit: false
  bnb_4bit_compute_dtype: "float16" # float16, float32, bfloat16 / 4 bit μ–‘μžν™” λ°μ΄ν„°μ˜ 계산 데이터 νƒ€μž…
  bnb_4bit_use_double_quant: false # true μ‹œ 더블 μ–‘μžν™”(λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ κ°μ†Œ, μ‹œκ°„ 더 κ±Έλ¦Ό)
  bnb_4bit_quant_type: "nf4" # nf4, fp4

earlystop:
  metric_for_best_model: "eval_loss" # λͺ¨λ‹ˆν„°λ§ν•  μ§€ν‘œ 이름
  early_stopping_patience: 1 # κ°œμ„ λ˜μ§€ μ•ŠλŠ” 에폭 수
  early_stopping_threshold: 0.0 # κ°œμ„ μœΌλ‘œ κ°„μ£Όν•  μ΅œμ†Œ λ³€ν™”λŸ‰
  greater_is_better: false # μ§€ν‘œκ°€ λ†’μ„μˆ˜λ‘ 쒋은 경우 True

peft:
  r: 6
  lora_alpha: 8
  lora_dropout: 0.05
  target_modules: ["q_proj", "k_proj"]
  bias: "none"
  task_type: "CAUSAL_LM"

sft:
  do_train: true
  do_eval: true
  lr_scheduler_type: "cosine"
  max_seq_length: 1024
  per_device_train_batch_size: 1
  per_device_eval_batch_size: 1
  num_train_epochs: 3
  learning_rate: 2.0e-5 # μ§€μˆ˜ 자릿수 μ•žλΆ€λΆ„μ„ μ‹€μˆ˜ ν˜•νƒœλ‘œ μž‘μ„± ('2'-> x, '2.0'-> o)
  weight_decay: 0.01
  logging_strategy: "steps" # epoch or steps, epoch의 경우 logging_steps λ¬΄μ‹œ
  logging_steps: 100
  save_strategy: "epoch"
  eval_strategy: "epoch"
  load_best_model_at_end: true
  save_total_limit: 1
  save_only_model: true
  report_to: "wandb" # none or wandb, wandb둜 λ³€κ²½ν•˜μ—¬ 둜그λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€.
  gradient_checkpointing: false
  gradient_accumulation_steps: 4

wandb:
  project: "MMLU"

train:
  data_path: "data/train_v2.0.1.csv" # wandb λ‘œκΉ… μ‚¬μš©μ‹œ 파일λͺ… λ³€κ²… κΈˆμ§€(데이터 버전 정보 μ‚¬μš©)
  valid_data_path: "data/valid_v2.0.1.csv"
  valid_output_path: "data/valid_output.csv"

inference:
  model_path: "outputs/Qwen2.5-3B-Instruct-bnb-4bit" # ν•™μŠ΅λœ λͺ¨λΈλ‘œ λ³€κ²½ ν•„μš”
  data_path: "data/test_v1.0.2.csv"
  output_path: "data/output.csv"
  raw_output_path: "data/raw_output.csv"
  default_answer: 1

rag:
  query_builder_type: CombinedKeyQueryBuilder_pqc
  raft_on: false # RAFT μ‹œ prompt_template을 raft둜 λ³€κ²½ ν•„μš”

Custom Config

κΈ°λ³Έ μ„€μ • 외에 μ‚¬μš©μž μ •μ˜ 섀정을 μ‚¬μš©ν•˜λ €λ©΄ configs/config.yaml νŒŒμΌμ„ λ³΅μ‚¬ν•œ λ’€ μˆ˜μ •ν•˜μ„Έμš”:

(.venv) $ cp configs/config.yaml configs/config_custom.yaml
(.venv) $ vi configs/config_custom.yaml

πŸƒβ€β™‚οΈβ€βž‘οΈ Train 및 Inference μ‹€ν–‰

Train

ν•™μŠ΅μ„ μ‹€ν–‰ν•˜λ €λ©΄ κΈ°λ³Έ train.py νŒŒμΌμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€:

(.venv) $ python train.py

μ»€μŠ€ν…€ 섀정을 μ μš©ν•˜λ €λ©΄ -c λ˜λŠ” --config μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ„Έμš”:

(.venv) $ python train.py -c config_custom.yaml
  • -c μ˜΅μ…˜μ—λŠ” configs 디렉토리 λ‚΄λΆ€μ˜ YAML 파일 μ΄λ¦„λ§Œ μž…λ ₯ν•©λ‹ˆλ‹€.

Inference

ν•™μŠ΅λœ λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ 좔둠을 μ§„ν–‰ν•©λ‹ˆλ‹€:

(.venv) $ python inference.py

μ»€μŠ€ν…€ 섀정을 μ‚¬μš©ν•˜λ €λ©΄ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”:

(.venv) $ python inference.py -c config_custom.yaml

valid 데이터에 λŒ€ν•œ 좔둠을 μ§„ν–‰ν•˜λ €λ©΄ -v μ˜΅μ…˜μ„ μΆ”κ°€ν•©λ‹ˆλ‹€:

valid에 λŒ€ν•œ λͺ¨λΈμ˜ μ„±λŠ₯을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€

(.venv) $ python inference.py -v

# or

(.venv) $ python inference.py -c config_custom.yaml -v

πŸ“– Contribution Guide

ν”„λ‘œμ νŠΈμ— κΈ°μ—¬ν•˜λŠ” 방법에 λŒ€ν•œ κ°€μ΄λ“œμž…λ‹ˆλ‹€.

컀밋 ν…œν”Œλ¦Ώ μ‚¬μš©λ²•

ν”„λ‘œμ νŠΈμ—μ„œ 컀밋 λ©”μ‹œμ§€ ν˜•μ‹μ„ ν†΅μΌν•˜κΈ° μœ„ν•΄ 컀밋 ν…œν”Œλ¦Ώμ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ ν…œν”Œλ¦Ώμ„ μ μš©ν•˜μ„Έμš”:

$ git config commit.template .gitcommit_template
  • .gitcommit_template νŒŒμΌμ€ ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— μžˆλŠ” 컀밋 ν…œν”Œλ¦Ώ νŒŒμΌμž…λ‹ˆλ‹€.
  • μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ 컀밋 μ‹œ ν…œν”Œλ¦Ώμ΄ μžλ™μœΌλ‘œ λΆˆλŸ¬μ™€μ§‘λ‹ˆλ‹€.

πŸ”¬ References

  • Son Guijin, Hanwool Lee, Sungdong Kim, Seungone Kim, Niklas Muennighoff, Taekyoon Choi, Cheonbok Park, Kang Min Yoo & Stella Biderman. "KMMLU: Measuring Massive Multitask Language Understanding in Korean." arXiv, June 6, 2024. https://doi.org/10.48550/arXiv.2402.11548.
  • Zhang Tianjun, Shishir G. Patil, Naman Jain, Sheng Shen, Matei Zaharia, Ion Stoica & Joseph E. Gonzalez. β€œRAFT: Adapting Language Model to Domain Specific RAG”. arXiv, June 6, 2024. https://doi.org/10.48550/arXiv.2403.10131.
  • ν—ˆλ™μ„, κΉ€κΈ°νƒœ, μ†‘ν˜•μš°, μ„œλ΄‰μ›. (2024-01-24). ν”„λ‘¬ν”„νŠΈ κ°œλ°œμ„ ν†΅ν•œ 수λŠ₯ κ΅­μ–΄ λ§žμΆ€ν˜• 문제 생성 μ‹œμŠ€ν…œ μ œμ•ˆ. ν•œκ΅­HCIν•™νšŒ ν•™μˆ λŒ€νšŒ, 강원. https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE11714641.
  • skt/kobest 데이터셋 https://huggingface.co/datasets/skt/kobest_v1

About

level2-nlp-generationfornlp-nlp-06-lv3 created by GitHub Classroom

Resources

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 6