๐Ÿ‡ฐ๐Ÿ‡ท Korean Stock News Analysis Model

GPT-4o์™€ ๋™๋“ฑํ•œ 80% ์ ์ค‘๋ฅ ์„ ๋‹ฌ์„ฑํ•œ ํ•œ๊ตญ ์ฃผ์‹ ๋‰ด์Šค ๋ถ„์„ ๋ชจ๋ธ

Qwen2.5-7B-Instruct๋ฅผ Knowledge Distillation์œผ๋กœ ํŒŒ์ธํŠœ๋‹ํ•˜์—ฌ ํ•œ๊ตญ ์ฃผ์‹์‹œ์žฅ ๋‰ด์Šค ๋ถ„์„ ๋ฐ ํˆฌ์ž ์ถ”์ฒœ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Š Performance Highlights

Metric Score ๋น„๊ต
์ „์ฒด ์ ์ค‘๋ฅ  80.0% GPT-4o์™€ ๋™๋“ฑ
BUY ์‹ ํ˜ธ ์ ์ค‘๋ฅ  85.7% 7๊ฑด ์ค‘ 6๊ฑด ์ ์ค‘
๊ฐ์ • ๋ถ„์„ ์ •ํ™•๋„ 95.0% 20๊ฑด ์ค‘ 19๊ฑด ์ •ํ™•
๊ธฐ์—…๋ช… ์ถ”์ถœ F1 79.69 Precision 72.2, Recall 88.8
๋น„์šฉ ์ ˆ๊ฐ 95%+ vs GPT-4o API

๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ๋‰ด์Šค ๊ฐ์ • ๋ถ„์„

์ž…๋ ฅ: "์‚ผ์„ฑ์ „์ž 3๋ถ„๊ธฐ ์˜์—…์ด์ต 10์กฐ์› ๋ŒํŒŒ, ์‹œ์žฅ ์˜ˆ์ƒ ํฌ๊ฒŒ ์ƒํšŒ"
์ถœ๋ ฅ: "๊ธ์ •"

2. ํ•œ๊ตญ ๊ธฐ์—…๋ช… ์ถ”์ถœ

์ž…๋ ฅ: "์‚ผ์„ฑ์ „์ž์™€ SKํ•˜์ด๋‹‰์Šค๊ฐ€ ๋ฐ˜๋„์ฒด ํ˜‘๋ ฅ MOU ์ฒด๊ฒฐ"
์ถœ๋ ฅ: "์‚ผ์„ฑ์ „์ž, SKํ•˜์ด๋‹‰์Šค"

3. ํˆฌ์ž ์—ฐ๊ด€๋„ ๋ถ„์„

์ž…๋ ฅ: ์ฃผ์‹ ๊ด€๋ จ ๋‰ด์Šค
์ถœ๋ ฅ: "๋†’์Œ" / "๋ณดํ†ต" / "๋‚ฎ์Œ"

4. ํˆฌ์ž ์ถ”์ฒœ ์ƒ์„ฑ

์ถœ๋ ฅ: 
1. ์‚ผ์„ฑ์ „์ž - ๋งค์ˆ˜ - AI ๋ฐ˜๋„์ฒด ์ˆ˜์š” ์ฆ๊ฐ€๋กœ ์‹ค์  ๊ฐœ์„  ์ „๋ง
2. ํ˜„๋Œ€์ฐจ - ๋งค์ˆ˜ - ์ „๊ธฐ์ฐจ ํŒ๋งค๋Ÿ‰ ๊ธ‰์ฆ์œผ๋กœ ์„ฑ์žฅ ๊ฐ€์†ํ™”
3. ํฌ์Šค์ฝ” - ๋ณด์œ  - ์ฒ ๊ฐ• ๊ฐ€๊ฒฉ ์ƒ์Šน์„ธ์ด๋‚˜ ์›์ž์žฌ ๋น„์šฉ ๋ถ€๋‹ด

๐Ÿ›  Usage

LoRA ์–ด๋Œ‘ํ„ฐ ์‚ฌ์šฉ๋ฒ• (Oracle/์„œ๋ฒ„ ํ™˜๊ฒฝ ์ตœ์ ํ™”)

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel

# 1. 4bit ์–‘์žํ™” ์„ค์ • (๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ)
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.float16
)

# 2. ๋ฒ ์ด์Šค ๋ชจ๋ธ ๋กœ๋“œ (4bit ์–‘์žํ™”)
base_model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B-Instruct",
    quantization_config=bnb_config,
    device_map="auto",
    torch_dtype=torch.float16
)

# 3. LoRA ์–ด๋Œ‘ํ„ฐ ์ ์šฉ
model = PeftModel.from_pretrained(
    base_model,
    "jsjung00/korean-stock-news-qwen-lora"
)

# 4. ํ† ํฌ๋‚˜์ด์ € ๋กœ๋“œ
tokenizer = AutoTokenizer.from_pretrained("jsjung00/korean-stock-news-qwen-lora")

# ๊ฐ์ • ๋ถ„์„ ์˜ˆ์‹œ
def analyze_sentiment(news_title, news_content):
    system_prompt = "๋‹น์‹ ์€ ํ•œ๊ตญ ์ฃผ์‹์‹œ์žฅ ์ „๋ฌธ ์• ๋„๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค."
    user_prompt = f'''๋‹ค์Œ ๋‰ด์Šค์˜ ํˆฌ์ž ๊ฐ์ •์„ ๋ถ„์„ํ•ด์ฃผ์„ธ์š”. [๊ธ์ •/์ค‘๋ฆฝ/๋ถ€์ •] ์ค‘ ํ•˜๋‚˜๋กœ๋งŒ ๋‹ต๋ณ€ํ•˜์„ธ์š”.
์ œ๋ชฉ: {news_title}
๋‚ด์šฉ: {news_content}'''
    
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt}
    ]
    
    text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    inputs = tokenizer([text], return_tensors="pt")
    
    with torch.no_grad():
        outputs = model.generate(
            inputs.input_ids,
            max_new_tokens=10,
            do_sample=False,
            temperature=0.1
        )
    
    response = tokenizer.decode(outputs[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
    return response.strip()

๐Ÿ”ฌ Training Details

Model Architecture

  • Base Model: Qwen/Qwen2.5-7B-Instruct
  • Fine-tuning: LoRA + 4bit Quantization
  • Method: Supervised Fine-Tuning (SFT)
  • Knowledge Source: GPT-4o responses

Hyperparameters

  • Learning Rate: 2e-4
  • Batch Size: 1 (gradient_accumulation_steps=4)
  • Epochs: 5
  • LoRA Rank: 64
  • Chat Template: chat_template.jinja
  • Assistant Only Loss: False

Training Data

  • Source: ํ•œ๊ตญ ์ฃผ์‹ ๊ด€๋ จ ๋‰ด์Šค (๋„ค์ด๋ฒ„, RSS ๋“ฑ)
  • Size: ์•ฝ 1000+ ๋‰ด์Šค ๊ธฐ์‚ฌ
  • Tasks: ๊ฐ์ •๋ถ„์„, ๊ธฐ์—…์ถ”์ถœ, ์—ฐ๊ด€๋„๋ถ„์„, ํˆฌ์ž์ถ”์ฒœ
  • Annotation: GPT-4o Knowledge Distillation

๐Ÿ“ˆ Evaluation Results

ํˆฌ์ž ์‹ ํ˜ธ ์„ฑ๊ณผ (2024.09.17-09.24)

  • ๋งค์ˆ˜ ์‹ ํ˜ธ: 7๊ฑด ์ค‘ 6๊ฑด ์ ์ค‘ (85.7%)
  • ๋ณด์œ  ์‹ ํ˜ธ: 3๊ฑด ์ค‘ 2๊ฑด ์ ์ค‘ (66.7%)
  • ์ „์ฒด ์‹ ํ˜ธ: 10๊ฑด ์ค‘ 8๊ฑด ์ ์ค‘ (80.0%)

Task๋ณ„ ์„ฑ๋Šฅ

Task Metric Score
๊ฐ์ • ๋ถ„์„ Accuracy 95.0%
๊ธฐ์—…๋ช… ์ถ”์ถœ F1 Score 79.69
์—ฐ๊ด€๋„ ๋ถ„์„ Accuracy 35.0%*

*์—ฐ๊ด€๋„ ๋ถ„์„์€ "๋ณดํ†ต" ์ˆ˜์ค€ ๋‰ด์Šค๋„ ํฌํ•จํ•˜๋„๋ก ๊ธฐ์ค€ ์™„ํ™”ํ•˜์—ฌ ์‹ค์šฉ์„ฑ ๊ฐœ์„ 

๐Ÿ— System Architecture

์ด ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ์‹œ์Šคํ…œ์—์„œ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค:

  • n8n: ๋‰ด์Šค ์ˆ˜์ง‘ ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
  • LangGraph: ๋‹ค๋‹จ๊ณ„ ๋‰ด์Šค ๋ถ„์„ ํŒŒ์ดํ”„๋ผ์ธ
  • vLLM: ๊ณ ์„ฑ๋Šฅ ๋ชจ๋ธ ์„œ๋น™
  • ์‹ค์‹œ๊ฐ„ ๋ฐฐํฌ: ๋งค์ผ ์ž๋™์œผ๋กœ ํˆฌ์ž ๋ฆฌํฌํŠธ ์ƒ์„ฑ

๐ŸŽ“ Lessons Learned

  1. Chat Template ์ค‘์š”์„ฑ: qwen.jinja vs chat_template.jinja ์„ ํƒ์ด ์„ฑ๋Šฅ์— ๊ฒฐ์ •์  ์˜ํ–ฅ
  2. ๊ณผ์ ํ•ฉ ์ฃผ์˜: Epoch 5โ†’8๋กœ ์ฆ๊ฐ€์‹œ ์„ฑ๋Šฅ์ด 80%โ†’60%๋กœ ํ•˜๋ฝ
  3. ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ: 4096 ํ† ํฐ ์ œํ•œ์œผ๋กœ ๊ณ„์ธต์  ์š”์•ฝ ์ „๋žต ํ•„์š”
  4. Task๋ณ„ ํ‰๊ฐ€: ์ „์ฒด ์ •ํ™•๋„๋งŒ์œผ๋ก  ๋ณ‘๋ชฉ ์ง€์  ํŒŒ์•… ์–ด๋ ค์›€

๐Ÿ“„ License

Apache 2.0

๐Ÿ™ Acknowledgments

  • Base Model: Qwen Team
  • Knowledge Distillation: OpenAI GPT-4o
  • Training Infrastructure: Colab Pro+
  • Stock Data: pykrx library

Contact: ํˆฌ์ž๋Š” ๋ณธ์ธ ์ฑ…์ž„ํ•˜์— ์ง„ํ–‰ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ์ฐธ๊ณ ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.

Downloads last month
1
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for 3kd1000/korean-stock-news-qwen-lora

Base model

Qwen/Qwen2.5-7B
Finetuned
(2830)
this model