κ΅λ¦½κ΅μ΄μ μΈκ³΅μ§λ₯(AI)λ§ν - 2024λ μΈκ³΅μ§λ₯μ νκ΅μ΄ λ₯λ ₯ νκ° κ²½μ§ λν π κΈμ(κ΅λ¦½κ΅μ΄μμ₯μ) μμ
λ³Έ 리ν¬μ§ν 리λ κ΅λ¦½κ΅μ΄μ β2024λ μΈκ³΅μ§λ₯μ νκ΅μ΄ λ₯λ ₯ νκ°β κ²½μ§ λν κ³Όμ μ€ βλν λ§₯λ½ μΆλ‘ (λ μ ν)βμ λν μ μΆ λͺ¨λΈμ νμ΅ λ° μΆλ‘ μ μ¬ννκΈ° μν μ½λλ₯Ό ν¬ν¨νκ³ μμ΅λλ€.
βλν λ§₯λ½ μΆλ‘ β κ³Όμ λ AI λͺ¨λΈμ΄ μ£Όμ΄μ§ λν λ΄μ©μ μ΄ν΄νκ³ , μ£Όμ΄μ§ λ°νμ λν 5κ°μ§ μΆλ‘ μ ν (μμΈ, νν μ¬κ±΄, μ μ 쑰건, λ΄μ λκΈ°, κ°μ λ°μ) μ€ κ°μ₯ μ ν©ν κ²μ μ ννλ λ₯λ ₯μ νκ°ν©λλ€.
(κ° μ νμ μΈλΆ λ°μ΄ν°λ₯Ό μ¬μ©νκ±°λ λ°μ΄ν° μ¦κ°μ΄ λΆκ°λ₯ν μ νμ΄κ³ , λ μ νμ μΈλΆ λ°μ΄ν°λ₯Ό μ¬μ©νκ±°λ λ°μ΄ν°λ₯Ό μ¦κ°νμ¬ μ¬μ© κ°λ₯ν μ νμ
λλ€.)
μμΈν λ΄μ©μ λͺ¨λΈ κΈ°μ μμμ νμΈνμ€ μ μμ΅λλ€.
λν λ§₯λ½ μΆλ‘ κ³Όμ λ₯Ό μννκΈ° μν΄, λ€μν λ°©λ²μΌλ‘ λ°μ΄ν°μ μ ꡬμ±νκ³ , μ¬μ νμ΅λ LLMλ€μ λ―ΈμΈμ‘°μ νμ¬, μμλΈμ ν΅ν΄ μΌλ°ννμμ΅λλ€.
μμΈν λ΄μ©μ λͺ¨λΈ κΈ°μ μμμ νμΈνμ€ μ μμ΅λλ€.
κ΅λ¦½κ΅μ΄μ μΈκ³΅μ§λ₯(AI)λ§νμμ μ 곡λλ λν λ§₯λ½ μΆλ‘ λ§λμΉ λ°μ΄ν°μ μ μμλ μλμ κ°μ΅λλ€.
EDA (Exploratory Data Analysis) λΆμ κ²°κ³Όλ resource/EDA
λ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ.
'\n'
β ' '
, ' '
β ' '
)'γ
γ
γ
'
β 'μ'
)'.'
, '?'
λ±μ νΉμλ¬Έμ λ°λ³΅μ μΆμ½ ('.......'
β '...'
, '?????'
β '??'
)'~'
, '@'
, '_'
, '/'
, '-'
, ':'
, ';'
, '('
, ')'
, '^'
λ±)'μλ
νμΈμ'
β ''
, 'λ°κ°μ΅λλΉ'
β ''
)'name1'
β 'νμ1'
, 'name2'
β 'νμ2'
)'γ
γ
‘γ
'
β ''
, 'γ
γ±γ
γ²γ
'
β ''
)λ°μ΄ν°μ
μ μ²λ¦¬ λ° μ μ κ³Όμ κ³Ό κ΄λ ¨νμ¬ μΈλΆ ꡬν μ½λλ run/refine.py
μ°Έμ‘°ν΄μ£ΌμΈμ.
λͺ¨λΈμ μ±λ₯μ λμ΄κΈ° μν΄, λ€μν ν둬ννΈλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°μ μ ꡬμ±νμμΌλ©°, ν둬νν μ΄ μ μ©λ λ°μ΄ν°μ μ μ’ λ₯λ μλμ κ°μ΅λλ€.
CustomRefDataset
: λνμ νΉμ λ°ν(Utterance References)λ₯Ό ν둬ννΈμ μ 곡νλ κΈ°λ³Έ λ°μ΄ν°μ
CustomRefOfficialTermDataset
: CustomRefDataset
μμ μ¬μ©λ μΆμ½λ μΆλ‘ λ¬Έ μ νμ ννμ 곡μ μ©μ΄λ‘ λ체νμ¬ ν둬ννΈλ₯Ό ꡬμ±ν λ°μ΄ν°μ
CustomRefDefinitionDataset
: CustomRefDataset
μμ μ¬μ©λ μΆμ½λ μΆλ‘ λ¬Έ μ νμ νν λμ κ° μΆλ‘ λ¬Έ μ νμ μ μλ₯Ό ν둬ννΈμ μ 곡ν λ°μ΄ν°μ
CustomRefInstructionDataset
: CustomRefDefinitionDataset
μμ μ¬μ©λ Question λμ Instructionμ ν둬ννΈμ μ 곡ν λ°μ΄ν°μ
SystemRefOfficialTermDataset
: CustomRefOfficialTermDataset
μμ μ¬μ©λ λ¨μν System Prompt λμ , ν둬ννΈ μμ§λμ΄λ§μ ν΅ν΄ λ ꡬ체μ μΈ System Promptλ₯Ό μ 곡ν λ°μ΄ν°μ
λν λ§₯λ½ μΆλ‘ κ³Όμ λ₯Ό μννκΈ° μν΄ μ¬μ©λ λͺ¨λΈμ μ’ λ₯λ 4μ’ λ₯λ‘ μλμ κ°μ΅λλ€.
μ λͺ¨λΈλ€μ μλμ κ°μ κΈ°μ€λ€μ κ±°μ³ μ μ νμμ΅λλ€.
λͺ¨λΈμ Weightλ₯Ό λͺ¨λ νλ ¨μν€λ κ²μ λΉν¨μ¨μ μ΄λ―λ‘, Parameter Efficient Fine Tuning κΈ°λ²μΈ LoRAμ QLoRAλ₯Ό μ¬μ©νμ¬ λ©λͺ¨λ¦¬ μ©λκ³Ό κ³μ° 리μμ€λ₯Ό λμ± ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μλλ‘ νμμ΅λλ€. LoRAλ βLow-Rank Adaptationβμ μ½μλ‘, μ ν λ³νμ μν μ μ°¨μ λ체 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ LLMμ ν¨μ¨μ μΌλ‘ λ―ΈμΈ μ‘°μ νλ λ°©λ²μ λλ€. QLoRAλ βQuantized Low-Rank Adaptationβμ μ½μλ‘, μ΄λ LoRAμ μ μ¬νμ§λ§ μμνλ μ μ°¨μ λ체 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ νλ ¨μ λμ± ν¨μ¨μ μΌλ‘ λ§λ€μ΄ μ€λλ€.
Backbone Model | Fine-tuning Method | Learning Rate | Dataset Type | Refinement |
---|---|---|---|---|
x2bee/POLAR-14B-v0.2 | QLoRA | 2e-4 | CustomRefOfficialTermDataset | X |
x2bee/POLAR-14B-v0.5 | QLoRA | 2e-4 | SystemRefOfficialTermDataset | O |
x2bee/POLAR-14B-v0.5 | QLoRA | 2e-4 | CustomRefDefinitionDataset | X |
x2bee/POLAR-14B-v0.5 | QLoRA | 1e-4 | CustomRefInstructionDataset | X |
beomi/Solar-Ko-Recovery-11B | LoRA | 2e-4 | CustomRefDataset | O |
beomi/Solar-Ko-Recovery-11B | LoRA | 2e-4 | CustomRefDataset | X |
beomi/Solar-Ko-Recovery-11B | LoRA | 1e-4 | CustomRefDataset | X |
beomi/Solar-Ko-Recovery-11B | LoRA | 1e-4 | CustomRefInstructionDataset | X |
beomi/Solar-Ko-Recovery-11B | LoRA | 1e-4 | CustomRefDefinitionDataset | X |
beomi/Solar-Ko-Recovery-11B | LoRA | 1e-4 | SystemRefOfficialTermDataset | X |
chihoonlee10/T3Q-ko-solar-dpo-v7.0 | LoRA | 2e-4 | CustomRefInstructionDataset | X |
λͺ¨λΈμ μΆλ‘ κ²°κ³Όλ₯Ό μΌλ°ν νκΈ° μν΄, λ€μν λ°©μμΌλ‘ λ―ΈμΈμ‘°μ ν λͺ¨λΈλ€μ μΆλ‘ κ²°κ³Όλ₯Ό Hard Voting λ°©μμΌλ‘ μμλΈνμ¬ μ΅μ’ κ²°κ³Όλ₯Ό λμΆν©λλ€.
KR-Conversation-Inference_Refined
βββ resource # νμ΅μ νμν 리μμ€λ€μ 보κ΄νλ λλ ν 리
β βββ EDA # λ°μ΄ν° λΆμ κ²°κ³Όλ₯Ό 보κ΄νλ λλ ν 리
β βββ data # λ°μ΄ν°μ
μ 보κ΄νλ λλ ν 리
β β βββ λνλ§₯λ½μΆλ‘ _λ°μ΄ν°.zip
β βββ refined_data # μ μ²λ¦¬λ λ°μ΄ν°μ
μ 보κ΄νλ λλ ν 리
β βββ results # νμ΅λ λͺ¨λΈμ΄ μ μ₯λ λλ ν 리
β βββ predictions # μΆλ‘ κ²°κ³Όλ₯Ό 보κ΄νλ λλ ν 리
βββ run # μ€ν κ°λ₯ν python μ€ν¬λ¦½νΈλ₯Ό 보κ΄νλ λλ ν 리
β βββ refine.py
β βββ EDA.py
β βββ train.py
β βββ test.py
βββ scripts # νμ΅ λ° μΆλ‘ μ μ€ννκΈ° μν bash μ€ν¬λ¦½νΈλ₯Ό 보κ΄νλ λλ ν 리
β βββ train_model_1.sh
β βββ ...
β βββ train_model_11.sh
β βββ train.sh # νμ΅μ μ€ννκΈ° μν bash μ€ν¬λ¦½νΈ
β βββ test_model_1.sh
β βββ ...
β βββ test_model_11.sh
β βββ hard_voting.sh # μμλΈμ μν bash μ€ν¬λ¦½νΈ
β βββ test.sh # μΆλ‘ μ μ€ννκΈ° μν bash μ€ν¬λ¦½νΈ
βββ src # νμ΅μ μ¬μ©λ ν¨μλ€μ 보κ΄νλ λλ ν 리
βββ data.py
μ½λ μ€νμ μν΄ μλμ κ°μ νκ²½μ΄ νμν©λλ€.
condaκ° μ€μΉλμ΄ μμ§ μμ κ²½μ° μλλ₯Ό μ°Έκ³ νμ¬ μ€μΉν΄μ£ΌμΈμ.
$ cd ~ # μ€μΉ νμΌμ λ€μ΄λ‘λν κ²½λ‘λ‘ μ΄λ (to home directory)
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # Miniconda μ€μΉ νμΌ λ€μ΄λ‘λ
$ bashΒ Miniconda3-latest-Linux-x86_64.sh # μ€μΉ νμΌ μ€ν
$ export PATH=~/miniconda3/bin:$PATH # νκ²½ λ³μ μ€μ
$ source ~/.bashrc # Anaconda μ€μΉ ν bash shell νκ²½ μ¬μ€μ
$ conda init # conda μ΄κΈ°ν
$ conda --version # conda λ²μ νμΈ
$ git clone https://github.com/oneonlee/KR-Conversation-Inference_Refined.git
$ cd KR-Conversation-Inference_Refined
$ conda create -n KR-Conversation-Inference python=3.9.19 # κ°,λ μ ν λͺ¨λ λμΌ
$ conda activate KR-Conversation-Inference # κ°,λ μ ν λͺ¨λ λμΌ
$ pip install -r requirements.txt # κ°,λ μ ν λͺ¨λ λμΌ
$ curl -o nanumfont.zip http://cdn.naver.com/naver/NanumFont/fontfiles/NanumFont_TTF_ALL.zip
$ sudo unzip -d /usr/share/fonts/nanum nanumfont.zip
$ sudo fc-cache -f -v
$ fc-list | grep Nanum
$ rm ~/.cache/matplotlib/fontlist*
μΈκ³΅μ§λ₯(AI)λ§ν κ³Όμ νμ΄μ§μμ λν λ§₯λ½ μΆλ‘ λ§λμΉλ₯Ό λ€μ΄λ‘λ λ°μ resource/data
λλ ν 리μ μμΉμν΅λλ€.
# λ°μ΄ν°μ
μμΆ ν΄μ
$ cd resource/data
$ unzip λνλ§₯λ½μΆλ‘ _λ°μ΄ν°.zip
$ mv λνλ§₯λ½μΆλ‘ _λ°μ΄ν°/λνλ§₯λ½μΆλ‘ _train.json train.json
$ mv λνλ§₯λ½μΆλ‘ _λ°μ΄ν°/λνλ§₯λ½μΆλ‘ _dev.json dev.json
$ mv λνλ§₯λ½μΆλ‘ _λ°μ΄ν°/λνλ§₯λ½μΆλ‘ _test.json test.json
$ rm -r λνλ§₯λ½μΆλ‘ _λ°μ΄ν°
# train.jsonκ³Ό dev.jsonμ ν©μ³ train+dev.json νμΌ μμ±
$ head -n -1 train.json > temp.json
$ truncate -s -2 temp.json
$ echo "," >> temp.json
$ tail -n +2 dev.json >> temp.json
$ mv temp.json train+dev.json
$ cd ../../
# λ°μ΄ν°μ
μ μ²λ¦¬ λ° μ μ
$ python run/refine.py
λ°μ΄ν°μ μ λΆμνκΈ° μν΄ μλ λͺ λ Ήμ΄λ₯Ό μ€νν©λλ€.
$ python run/EDA.py
$ python run/EDA.py --refined
λΆμ κ²°κ³Όλ resource/EDA
λλ ν 리μ μ μ₯λλ©°, μλμ κ°μ νμΌλ€μ΄ μμ±λ©λλ€.
category_distribution.png
: μΆλ‘ λ¬Έ μ νλ³ λΆν¬conversation_length_distribution.png
: λν ν΄ μ λΆν¬output_distribution.png
: μ λ΅ μΆλ‘ λ¬Έ μ νμ λΆν¬total_utterance_length_distribution.png
: λν μ 체 κΈΈμ΄ λΆν¬total_utterance_lengths.csv
: λν λ³ μ 체 κΈΈμ΄ λ°μ΄ν°wordcloud.png
: λν λ΄μ© μλν΄λΌμ°λνμ΅μλ A100-PCIe-40GB GPU 1λκ° μ¬μ©λμμ΅λλ€. λͺ¨λΈμ νμ΅νλ €λ©΄ μλμ κ°μ΄ μ€νν©λλ€.
$ sh scripts/train.sh
μΆλ‘ μλ RTX 4090 (24GB) GPU 1λκ° μ¬μ©λμμ΅λλ€. λͺ¨λΈμ μΆλ‘ νλ €λ©΄ μλμ κ°μ΄ μ€νν©λλ€.
$ sh scripts/test.sh
μ΅μ’
κ²°κ³Όλ resource/results/predictions
λλ ν 리μ final-result.json
νμΌμ μ μ₯λ©λλ€.
μ΅μ’ κ²°κ³Όλ μ½ 98.01%μ μ νλλ‘ λ¦¬λ보λ 1μλ₯Ό λ¬μ±νμμ΅λλ€.
λ³Έ 리ν¬μ§ν 리λ Apache License 2.0μ λ°λ¦ λλ€.