[๐บ๐ธ English](https://huggingface.co/KRX-Data/WON-Reasoning/blob/main/README.md) | **๐ฐ๐ท ํ๊ตญ์ด**
# โฉON: ํ๊ตญ ๊ธ์ต์ ์ํ LLM
## ์๊ฐ
โฉON์ ํ๊ตญ ๊ธ์ต ๋ถ์ผ์ ํนํ๋ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)๋ก, ๋ค์ํ AI ์ ํ๋ฆฌ์ผ์ด์
์์ ์ ๋ขฐ์ฑ๊ณผ ํฌ๋ช
์ฑ์ ๋์ด๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค.
โฉON ๊ฐ๋ฐ์ ํต์ฌ ๋ชฉ์ ์ ์ฐ๊ตฌ์ ๊ฐ๋ฐฉ์ฑ์ ์ด์งํ๊ณ , ์๊ฒฉํ ๊ธ์ต ์ถ๋ก ๋ฅ๋ ฅ์ ํ๊ฐํ ์ ์๋ ๊ธฐ์ค์ ๋ง๋ จํ๋ฉฐ, ํ๊ตญ ๊ธ์ต ํนํ ์ธ์ด ๋ชจ๋ธ ํ์ต์ ์์ด ์ต์ ์ ์ค์ฒ ์ฌ๋ก๋ฅผ ํ๋ฆฝํ๋ ๊ฒ์
๋๋ค.
โฉON์ 2๋จ๊ณ ์ถ๋ก ๋ฐฉ์์ ์์ฒด ์ค๋ฅ ์์ ๊ณผ์ ์ ๊ฑฐ์น ํ ๊ฒฐ๋ก ์ ์์ฝ์ ์ ๊ณตํจ์ผ๋ก์จ, ๊ธ์ต ์์ฌ๊ฒฐ์ ํ๋ก์ธ์ค์ ๋ช
ํ์ฑ๊ณผ ์ ํ์ฑ์ ๋์ด๋ ๋ฐ ํจ๊ณผ์ ์
๋๋ค.
## KRX ๊ธ์ต ์ธ์ด ๋ชจ๋ธ ๊ฒฝ์ง๋ํ
**๋ํ ๊ฐ์**
KRX ๊ธ์ต ์ธ์ด ๋ชจ๋ธ ๊ฒฝ์ง๋ํ๋ ๋ํ ์ธ์ด ๋ชจ๋ธ(LLM)์ ํ๊ตญ ๊ธ์ต ๋ถ์ผ ํ์คํฌ ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํด ์ด๋ฆฐ ๋ฆฌ๋๋ณด๋ ํ์์ ๋ํ์
๋๋ค.
๋ ๋ฌ์ ๊ธฐ๊ฐ์ ๊ฑธ์ณ ์์ ๊ณผ ๋ณธ์ ์ผ๋ก ๋ํ๊ฐ ์งํ๋์์ผ๋ฉฐ, ๋ํ ๊ธฐ๊ฐ ๋์ ์ด 233๊ฐ์ ํ์ด ์ฐธ๊ฐํ์ฌ 1,100๊ฐ ์ด์์ ๋ชจ๋ธ์ ์ ์ถํ์์ต๋๋ค.
์์ ์์๋ ๊ธ์ต์์ฅ, ์ฌ๋ฌดํ๊ณ, ๊ตญ๋ด ๊ธฐ์
๋ถ์, ๊ธ์ต ์์ด์ ํธ ์์
, ์ฃผ๊ฐ ์์ธก ๋ฑ ์ด ๋ค์ฏ ๊ฐ์ง ๋ถ์ผ์ ํ๊ฐ๋ฅผ ์ํํ์์ผ๋ฉฐ, ๋ณธ์ ์์๋ ์ฌ๋ฌดํ๊ณ, ๊ธ์ต์์ฅ, ๊ธ์ต ์ง์์๋ต(Open-Ended Finance QA) ๋ถ์ผ์ ์ค์ ์ ๋์์ต๋๋ค.
**๋ฒค์น๋งํฌ ์ค๋ช
**
๋ํ์์ ์ฌ์ฉํ ๋ฒค์น๋งํฌ๋ ๊ธ์ต ๋ถ์ผ ์ ๋ฐ์ ๊ฑธ์ณ ์ ์คํ๊ฒ ์ ์ ํ ์ฝ 5,500๊ฐ์ ๊ฐ๊ด์ ๋ฐ ์ง์๋ฌธ ๊ธฐ๋ฐ์ ์ง์์๋ต ๋ฌธ์ ๋ก ๊ตฌ์ฑํ์์ต๋๋ค:
- **์ฌ๋ฌดํ๊ณ**: ๋ํ ์์ค์ ํ๊ณ ๋ฐ ๊ธ์ต ์๋ฆฌ๋ฅผ ํ๊ฐํ๋ ๊ฐ๊ด์ ๋ฌธ์ ๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
- **๊ธ์ต์์ฅ**: ๊ธ์ต ๊ท์ ๋ฐ ํ๊ตญ ์์ฅ ์ฒด๊ณ์ ๋ํ ์ดํด๋ฅผ ํ๊ฐํ๋ ์ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ์์ต๋๋ค.
- **์ฃผ๊ฐ ์์ธก**: ์ต๊ทผ ์ฃผ๊ฐ ๋ฐ์ดํฐ ๋ฐ ๊ณ์ฐ๋ ์งํ๋ฅผ ํ์ฉํ ์ด์ง ์์ธก ๊ณผ์ ๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
- **๊ตญ๋ด ๊ธฐ์
๋ถ์**: ํ๊ตญ ๊ธฐ์
์ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋ KRX-Bench ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
- **๊ธ์ต ์์ด์ ํธ**: ๊ธ์ต ๋ฐ์ดํฐ ์กฐ์ ๋ฐ ์ฝ๋ฉ ์์
์ํ ๋ฅ๋ ฅ์ ํ๊ฐํ์์ต๋๋ค.
- **๊ธ์ต ์ง์์๋ต(Open-Ended FinQA)**: ๋ํ์ ์์ค์ ๊ณ๋ ๊ฒฝ์ ํ ๋ฐ ๋ฒ๋ฅ ์ ์ถ๋ก ์ ํฌํจํ ๋ณตํฉ์ ๊ณผ์ ๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
ํ๊ฐ ๋ฐ์ดํฐ์
์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
ํ๊ฐ ๋ฒค์น๋งํฌ ์์. ๊ฐ ์์๋ ๊ฐ ์นดํ
๊ณ ๋ฆฌ์ ๋ํ ๊ตฌ์ฒด์ ์ธ question type์ ๋ณด์ฌ์ค๋๋ค.
**๋ํ ํต๊ณ**
์ ์ฒด ๋ํ ์ฐธ๊ฐํ ์ค 52.5%๊ฐ ๊ธฐ์ ๋ฐ ๊ธ์ต ๋ถ์ผ ๋ฑ ๊ธฐ์
์ฐธ๊ฐํ์ด์์ผ๋ฉฐ, ๊ทธ ์ธ์๋ ํ๊ณ ๊ด๋ จ ์ฐธ๊ฐ์๊ฐ ๋๋ถ๋ถ์ ์ด๋ฃจ์์ต๋๋ค.
์ด๋ฌํ ์ฐธ๊ฐํ ํต๊ณ๋ ๋ค์ํ ์ดํด๊ด๊ณ์์ ํ๊ตญ ๊ธ์ต ์์ฐ์ด ์ฒ๋ฆฌ์ ๋ํ ํญ๋์ ๊ด์ฌ์ ๋ณด์ฌ์ค๋๋ค.
์ฐธ๊ฐ์ ๋ถํฌ. ํ๋์ ์์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ถ์ด ๊ธฐ์
์ฐธ๊ฐ์๋ฅผ ์๋ฏธํฉ๋๋ค.
**๋ํ ๊ฒฐ๊ณผ ๋ถ์**
์์ ๋ฐ ๋ณธ์ ์์ ์ ์ถ๋ ๋ชจ๋ธ๋ค์ ๋ํด ๋ถ์ํ ๊ฒฐ๊ณผ, ๋ค์๊ณผ ๊ฐ์ ์ธ์ฌ์ดํธ๋ฅผ ํ์ธํ ์ ์์์ต๋๋ค:
- **์์ **: ์ฃผ๋ก Supervised Fine-tuning (SFT)๋ฅผ ํ์ฉํ์์ผ๋ฉฐ, ํนํ ๊ตญ๋ด ๊ธฐ์
๋ถ์(Domestic Company Analysis) ๋ถ๋ฌธ์์ ๋๋๋ฌ์ง ์ฑ๊ณผ๋ฅผ ๋ณด์์ต๋๋ค.
์ด ๋ถ์ผ์์๋ ์๋นํ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ก์ผ๋, ์ฌ๋ฌดํ๊ณ, ๊ธ์ต์์ฅ ๋ถ๋ฌธ์์์ ์ฑ๋ฅ ํฅ์์ ์๋์ ์ผ๋ก ๋ฏธ๋ฏธํ์ต๋๋ค.
๋๋ถ๋ถ์ ๋ชจ๋ธ์ ๊ฐ๋จํ SFT ์ ๊ทผ๋ฒ์ ์ฑํํ์ผ๋, ์ผ๋ถ ํ์ ์ถ๊ฐ์ ์ธ ํ๋ จ ๊ธฐ๋ฒ์ธ Continual Pre-training (CPT)์ ์คํํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์๊ท๋ชจ์์์ CPT๋ ๊ทธ ํจ๊ณผ๊ฐ ๋ช
ํํ ์
์ฆ๋์ง ์์์ต๋๋ค.
์์ ๋ชจ๋ธ ์ฑ๋ฅ ๋ณํ ํธ๋ ๋
- **๋ณธ์ **: ์์ ๊ณผ ๋ฌ๋ฆฌ ๊ณ ๋ํ๋ ๋ค๋จ๊ณ ํ์ต ๋ฐฉ๋ฒ๋ก ์ด ๋ง์ด ์ฌ์ฉ๋์์ต๋๋ค.
ํนํ, ์ฌ๋ฌ ํ๋ค์ ์ปค๋ฆฌํ๋ผ ๊ธฐ๋ฐ์ SFT ์ ๋ต์ ์ ์ฉํ์ฌ, ๊ฐ๋จํ ํ๋กฌํํธ์์ ์์ํด ์ ์ฐจ Evolve Instruct์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ ๋ณต์กํ ์ฌ๋ก๋ก ๋ฐ์ ์์ผ ๋๊ฐ์ต๋๋ค.
์ต์์ ์ฑ๋ฅ์ ๋ณด์ธ ๋ชจ๋ธ๋ค์ ์ถ๊ฐ๋ก LLM-as-a-Judge ๊ธฐ๋ฒ์ผ๋ก ํ๊ฐ๋ ์๋ต๋ค์ ํ์ฉํ์ฌ Direct Preference Optimization (DPO) ๋ฐ Kahneman Tversky Optimization (KTO)์ ๊ฐ์ ์ ํธ๋ ์ต์ ํ ๊ธฐ์ ์ ์ด์ฉํด ์ฑ๋ฅ์ ๋์ฑ ํฅ์์์ผฐ์ต๋๋ค.
ํนํ Hi-Q ํ์ Continual Pre-training๊ณผ SFT ๋ฐ DPO๋ฅผ ๊ฒฐํฉํ ๋ฐฉ์์ ํจ๊ณผ์ฑ์ ์
์ฆํ์ฌ ๊ด๋ชฉํ ๋งํ ์ฑ๋ฅ ํฅ์์ ์ด๋ฃจ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฒด๊ณ์ ์ด๊ณ ๋ค๋จ๊ณ์ ์ธ ํ๋ จ ๊ณผ์ ์ ๊ฐ์น๋ฅผ ๋ช
ํํ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
Continual pre-trained ๋ชจ๋ธ๋ค์ ์ฑ๋ฅ ๊ฒฐ๊ณผ
## โฉON ๋ชจ๋ธ ํ์ต
### ๋ฐ์ดํฐ์
์์ง
๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํตํด ๊ณ ํ์ง Instruction ์ํ๋ก ์ด๋ฃจ์ด์ง ์ข
ํฉ์ ์ธ ๋ชจ๋ธ ํ์ต ๋ฐ์ดํฐ์
์ ๊ตฌ์ถํ์ต๋๋ค:
- **๊ฒฝ์ง๋ํ**: ๊ฒฝ์ง๋ํ ์ค HuggingFace์ ์ ์ถ๋ 200,000๊ฐ ์ด์์ ๋ฐ์ดํฐ ์ค MinHash ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ๊ท์ ํํฐ๋ง์ ํตํด ์ ์คํ๊ฒ ์ ๋ณ๋ 80,000๊ฐ์ ์ง์ํ ๋ฐ์ดํฐ์
์ ๊ตฌ์ถํ์์ต๋๋ค.
- **์ถ๋ก ์๋ต**: DeepSeek-R1 ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์๋ต์ ๋ฌผ๋ก , ๊ณต๊ฐ์ ์ผ๋ก ์ด์ฉ ๊ฐ๋ฅํ ์์ด์ ํ๊ตญ์ด ์จ๋ผ์ธ ์๋ฃ์์ ์์งํ Prompt-Response ์์ ํตํด ๋ณด์ํ์์ต๋๋ค.
- **๊ฒ์ฆ**: GPT-4o๋ฅผ LLM-as-a-Judge๋ก ํ์ฉํ ๊ฒ์ฆ ํ๋ก์ธ์ค ๋ฐ ์๋ ํ์ง ๊ฒ์ฌ๋ฅผ ํตํด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ํ์ฑ์ ๊ฐํํ์์ต๋๋ค.
### ํ์ต ๋ฐฉ๋ฒ
โฉON ๋ชจ๋ธ ํ์ต์ ์ํด ๋ค์๊ณผ ๊ฐ์ 2๋จ๊ณ ํ์ต์ ์งํํ์์ต๋๋ค:
- SFT: ์ด ๋จ๊ณ๋ ๊ธ์ต ์ถ๋ก ์์
๊ณผ ๊ด๋ จ๋ ๋ชจ๋ธ์ ์ด๊ธฐ ํ๋์ ์กฐ์ ํ๋ ๋ฐ ์ด์ ์ ๋ง์ท์ผ๋ฉฐ, DeepSeek-R1 ๋ชจ๋ธ๋ก ์์ฑํ ์์ธํ ์๋ต๊ณผ ์ธ์ฌํ๊ฒ ์ ์ ๋ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ฐ์ดํฐ์
์ ํ๊ตญ์ด์ ์์ด์์ ์ธ์ด์ ์ผ๊ด์ฑ์ ํ๋ณดํ๊ธฐ ์ํด ์ฒ ์ ํ ๊ฒํ ๋ Prompt-Response ์์ผ๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
- DPO: SFT ์งํ ํ, ๋ชจ๋ธ์ ๊ณผ๋ํ ์๊ฐ ๊ณผ์ ๋๋ ์ผ๋ถ ์ง๋ฌธ์ ๋ํ ์๋ชป๋ ํด์๊ณผ ๊ฐ์ ์์น ์๋ ํ๋์ ์ค์ด๊ธฐ ์ํด DPO๋ฅผ ํ์ฉํ์์ต๋๋ค. ์ ํธ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ธ์ ์ถ๋ ฅ๊ณผ DeepSeek-R1์ ์ถ๋ ฅ์ ๋น๊ตํจ์ผ๋ก์จ ๋ชจ๋ธ ์๋ต์ ํจ๊ณผ์ ์ผ๋ก ๊ฐ์ ํ์์ต๋๋ค.
### ๋ชจ๋ธ ์ฌ์
- Base model: Qwen2.5-Math-7B-Instruct
- Language: ํ๊ตญ์ด, ์์ด
- Model size: 7B
โฉON์ ๋ ๋จ๊ณ์ ๊ตฌ์กฐ์ ์ถ๋ก ๊ณผ์ ์ ํตํด ์ต์ข
์๋ต์ ์ถ๋ ฅํ๋๋ก ์ค๊ณํ์์ต๋๋ค:
- **์๊ฐ ๋จ๊ณ**: ๋ชจ๋ธ์ `` ๋ฐ `` ํ๊ทธ ๋ด์์ ์์ ์ ์ถ๋ก ๊ณผ์ ์ ๋ช
์์ ์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ์ด๋ ํฌ๋ช
์ฑ์ ๋์ด๊ณ , ์ฌ์ฉ์๋ค์ด โฉON์ ๊ฒฐ๋ก ๋์ถ ๋ฐฉ์์ ์ดํดํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
- **ํด๊ฒฐ ๋จ๊ณ**: ์ถ๋ก ์งํ ํ, ๋ชจ๋ธ์ ๊ฒฐ๋ก ์ `` ๋ฐ `` ํ๊ทธ ๋ด์์ ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์์ฝํ์ฌ ์ ์ํฉ๋๋ค.
## ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ
โฉON ๋ชจ๋ธ์ ํ๊ตญ์ด ๊ธ์ต ํ์คํฌ ๋ฅ๋ ฅ์ ํ๊ฐํ๊ธฐ ์ํด ๋ํ ๋ณธ์ ์์ ์ฌ์ฉ๋ ๋ฒค์น๋งํฌ๋ฅผ ํตํด ํ๊ฐํ์์ต๋๋ค.
๋ฒค์น๋งํฌ๋ ์ฌ๋ฌดํ๊ณ, ๊ธ์ต์์ฅ, ๊ธ์ต ์ง์์๋ต(Open-Ended FinQA) ํ์คํฌ๋ก ๋ถ๋ฅ๋ฉ๋๋ค:
- **์ฌ๋ฌดํ๊ณ**: ๊ธ์ต ๊ฐ๋
, ํ๊ณ ์์น ๋ฐ ๊ณ๋ ๊ฒฝ์ ์ถ๋ก ์ ๋ํ ๋ชจ๋ธ์ ์ง์๊ณผ ๋ถ์ ๋ฅ๋ ฅ์ ํ๊ฐํฉ๋๋ค.
- **๊ธ์ต์์ฅ**: ๊ธ์ต ์์ฅ, ์์คํ
, ๊ท์ ๋ฐ ๋ถ์ผ๋ณ ์ฌ์ค์ ์ง์์ ๋ํ ๋ชจ๋ธ์ ์ดํด๋ฅผ ํ๊ฐํฉ๋๋ค.
- **๊ธ์ต ์ง์์๋ต(Open-Ended FinQA)**: ์ค์ ๊ธ์ต ๋ฌธ์ ํด๊ฒฐ ์ํฉ์ ์๋ฎฌ๋ ์ด์
ํ ๋ณต์กํ๊ณ ์ธ๋ถ์ ์ธ ์ถ๋ก ๋ฌธ์ ๋ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
**๊ฒฐ๊ณผ**
โฉON์ KRX ๊ธ์ต ์ธ์ด๋ชจ๋ธ ๊ฒฝ์ง๋ํ์์ ์์ํ ๋ชจ๋ธ๋ค๊ณผ ๋น๊ตํ์ ๋ ํ๊ท ์ ์ผ๋ก ๊ฐ์ฅ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์์ต๋๋ค.
ํนํ ์ฌ๋ฌดํ๊ณ ๋ฐ ๊ธ์ต ์ง์์๋ต(Open-Ended FinQA) ์๋ธ์
์์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ด๋ฉฐ, ์ด ๋ชจ๋ธ์ด ๋ฐ์ด๋ ์ถ๋ก ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
๋ํ ์ถ๋ก ์ค์ฌ ํ์ต์ผ๋ก ์ธํด ๋๋ฉ์ธ ์ ๋ฌธ ์ง์(์์ฅ ๋ถ์ผ)์ ๋ํ ํ์ต์ด ๋ถ์กฑํ์์๋ ๋ถ๊ตฌํ๊ณ , ๊ธ์ต์์ฅ ์๋ธ์
์์ ๋๋ถ๋ถ์ ๋ชจ๋ธ๋ค์ ์์๋ฉฐ โฉON์ ๋ค๋ฐฉ๋ฉด์ผ๋ก ๋ฐ์ด๋ ๋ฅ๋ ฅ์ ์
์ฆํ์์ต๋๋ค.
## Quick Start
```python
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
model = AutoModelForCausalLM.from_pretrained("KRX-Data/WON-Reasoning", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("KRX-Data/WON-Reasoning")
messages = [
{"role": "user", "content": } # Replace `` with your query!
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
```
## Citation
```
@article{son2025won,
title={Won: Establishing Best Practices for Korean Financial NLP},
author={Son, Guijin and Ko, Hyunwoo and Jung, Haneral and Hwang, Chami},
journal={arXiv preprint arXiv:2503.17963},
year={2025}
}
```
## Contact
```
spthsrbwls123@yonsei.ac.kr, hcharm2ing@krx.co.kr
```