File size: 3,711 Bytes
6b8a81e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0bf1330
6b8a81e
0bf1330
6b8a81e
 
 
 
 
 
 
0bf1330
 
 
f0d4888
6b8a81e
f0d4888
6b8a81e
f0d4888
 
 
6b8a81e
f0d4888
6b8a81e
 
f0d4888
0bf1330
f0d4888
0bf1330
 
f0d4888
 
 
 
 
 
 
 
 
0bf1330
f0d4888
0bf1330
 
f0d4888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0bf1330
f0d4888
0bf1330
 
 
f0d4888
 
 
 
 
 
 
 
 
0bf1330
f0d4888
 
 
 
0bf1330
 
f0d4888
 
0bf1330
 
 
 
 
 
 
 
 
 
 
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
---
license: apache-2.0
base_model: Qwen/Qwen3-1.7B
tags:
- text-generation
- korean
- news
- event-extraction
- fine-tuned
- qwen
language:
- ko
library_name: transformers
pipeline_tag: text-generation
---

# Qwen3-1.7B News Event Extraction Model

์ด ๋ชจ๋ธ์€ **Qwen/Qwen3-1.7B**๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๊ตญ์–ด ๋‰ด์Šค ํ…์ŠคํŠธ ๋ถ„์„ ๋ฐ ์ด๋ฒคํŠธ ์ถ”์ถœ์„ ์œ„ํ•ด **LoRA** ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ธํŠœ๋‹๋œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

## โœจ ๋ชจ๋ธ ๊ธฐ๋Šฅ

- **๋‰ด์Šค ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜**: ๋ถ€๋™์‚ฐ, ์‚ฐ์—…, ์˜คํ”ผ๋‹ˆ์–ธ, ์ฆ๊ถŒ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜
- **ํ•ต์‹ฌ ์ด๋ฒคํŠธ ์ถ”์ถœ**: ๋‰ด์Šค ํ…์ŠคํŠธ์—์„œ ์ฃผ์š” ์ด๋ฒคํŠธ๋“ค์„ ์ถ”์ถœ
- **๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ**: Python dictionary ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ ์ œ๊ณต

## ์‚ฌ์šฉ๋ฒ•

### ๊ธฐ๋ณธ ์„ค์ •

```python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import json

# ๋ชจ๋ธ ๋ฐ ํ† ํฌ๋‚˜์ด์ € ๋กœ๋“œ
repo_id = "sogm1/qwen3-1.7b-news-event-merged"
tokenizer = AutoTokenizer.from_pretrained(repo_id)
model = AutoModelForCausalLM.from_pretrained(
    repo_id,
    torch_dtype="auto",
    device_map="auto"
).eval()
```

### ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ 
```python
system_prompt = """๋‹น์‹ ์€ ๋‰ด์Šค ํ…์ŠคํŠธ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์ฃผ์š” ํ•ต์‹ฌ ์ด๋ฒคํŠธ๋“ค์„ ์ถ”์ถœํ•˜๋Š” ์ „๋ฌธ ๋ถ„์„ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.
์ฃผ์–ด์ง„ ํ…์ŠคํŠธ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ฐ˜๋“œ์‹œ ํŒŒ์ด์ฌ์˜ dictionary ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

๋ถ„์„ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค:

๋‹ต๋ณ€:
{"category": "['๋ถ€๋™์‚ฐ', '์‚ฐ์—…', '์˜คํ”ผ๋‹ˆ์–ธ', '์ฆ๊ถŒ'] ์ค‘ ํ•˜๋‚˜",
"event_count": "ํ•ต์‹ฌ ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜(์ •์ˆ˜)",
"events": ["์ด๋ฒคํŠธ1", "์ด๋ฒคํŠธ2", ...]}"""
```

### ineference 
```python
def generate_analysis(model, tokenizer, text, system_prompt):
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": f"๋‹ค์Œ ๋‰ด์Šค ํ…์ŠคํŠธ๋ฅผ ๋ถ„์„ํ•ด์ฃผ์„ธ์š”:\n\n{text}"}
    ]
    
    prompt_text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True,
        enable_thinking=False
    )
    
    inputs = tokenizer([prompt_text], return_tensors="pt").to(model.device)
    
    with torch.no_grad():
        generated_ids = model.generate(
            **inputs,
            max_length=8192,
            temperature=0.5,
            top_p=1.0,
            do_sample=False
        )
    
    output_ids = generated_ids[0][len(inputs.input_ids[0]):]
    decoded_output = tokenizer.decode(output_ids, skip_special_tokens=True).strip()
    
    return decoded_output
```

## ์‚ฌ์šฉ์˜ˆ์‹œ 
```python
# ์ƒ˜ํ”Œ ๋‰ด์Šค ํ…์ŠคํŠธ
news_text = """
์‚ผ์„ฑ์ „์ž๊ฐ€ 3๋ถ„๊ธฐ ์‹ค์  ๋ฐœํ‘œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜๋„์ฒด ๋ถ€๋ฌธ์˜ ํšŒ๋ณต์„ธ๋ฅผ ๋ณด๊ณ ํ–ˆ๋‹ค. 
ํšŒ์‚ฌ๋Š” D๋žจ ๊ฐ€๊ฒฉ์ด ์ „๋ถ„๊ธฐ ๋Œ€๋น„ 15% ์ƒ์Šนํ–ˆ์œผ๋ฉฐ, ๋‚ธ๋“œํ”Œ๋ž˜์‹œ ์ถœํ•˜๋Ÿ‰๋„ 20% ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ณ  ๋ฐํ˜”๋‹ค.
ํŠนํžˆ AI ์„œ๋ฒ„์šฉ ๊ณ ๋Œ€์—ญํญ๋ฉ”๋ชจ๋ฆฌ(HBM) ๋งค์ถœ์ด ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 300% ๊ธ‰์ฆํ•˜๋ฉด์„œ ์‹ค์  ๊ฐœ์„ ์„ ๊ฒฌ์ธํ–ˆ๋‹ค.
"""

# ๋ถ„์„ ์‹คํ–‰
result = generate_analysis(model, tokenizer, news_text, system_prompt)

# ๊ฒฐ๊ณผ ํŒŒ์‹ฑ ๋ฐ ์ถœ๋ ฅ
if "๋‹ต๋ณ€:" in result:
    json_part = result.split("๋‹ต๋ณ€:")[-1].strip()
    parsed_result = json.loads(json_part)
    
    print(f" ์นดํ…Œ๊ณ ๋ฆฌ: {parsed_result['category']}")
    print(f" ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜: {parsed_result['event_count']}")
    print("์ด๋ฒคํŠธ ๋ชฉ๋ก:")
    for i, event in enumerate(parsed_result['events'], 1):
        print(f"   {i}. {event}")
```
## ์ถœ๋ ฅ์˜ˆ์‹œ 
```python
 ์นดํ…Œ๊ณ ๋ฆฌ: ์‚ฐ์—…
 ์ด๋ฒคํŠธ ๊ฐœ์ˆ˜: 3
 ์ด๋ฒคํŠธ ๋ชฉ๋ก:
   1. D๋žจ ๊ฐ€๊ฒฉ์ด ์ „๋ถ„๊ธฐ ๋Œ€๋น„ 15% ์ƒ์Šน
   2. ๋‚ธ๋“œํ”Œ๋ž˜์‹œ ์ถœํ•˜๋Ÿ‰์ด 20% ์ฆ๊ฐ€
   3. HBM ๋งค์ถœ์ด ์ „๋…„ ๋™๊ธฐ ๋Œ€๋น„ 300% ๊ธ‰์ฆ
```