RuBio-27B ยท ์๋ช
๊ณผํ ์์ ํ ํผ๋๋ฐฑ
mulkzz/RuBio-27B๋ ๊ณ ๋ฑํ๊ต 2022 ๊ฐ์ ใ์๋ช
๊ณผํใ ๋๋จ์ โ
โโ
ข ์์ ํ ๋ฌธํญ์ ํ์ ๋ต์์ ํ๊ฐ ๊ธฐ์ค๋ณ๋ก ์ง๋จํ๊ณ , ๊ต์ฌ์ฉ ์ง๋จ ์ ๋ณด์ ํ์์ฉ ํผ๋๋ฐฑ์ ๋จ์ผ JSON ๊ฐ์ฒด๋ก ์ถ๋ ฅํ๋ ๋ชจ๋ธ์
๋๋ค. Qwen/Qwen3.8-27B์ LoRA๋ฅผ ํ์ตํ ๋ค ๊ฐ์ค์น๋ฅผ ๋ณํฉํ 16๋นํธ(bf16) ์ ์ฒด ๋ชจ๋ธ(์ฝ 54GB)์ด๋ฉฐ, ๊ฐ์ ๋ฐ์ดํฐยท์ค์ ์ผ๋ก ํ์ตํ mulkzz/RuBio-4B์ ์์ ๋ชจ๋ธ์
๋๋ค.
ํ์ต ์ค์
- Unsloth
bf16 LoRA (r=16, alpha=32, ๋์ ๋ชจ๋ qยทkยทvยทoยทgateยทupยทdown)๋ฅผ ํ์ตํ ๋ค 16๋นํธ ์ ์ฒด ๋ชจ๋ธ๋ก ๋ณํฉํ์ต๋๋ค(2 epoch / 300์คํ
, ๋ฐฐ์น 2 ร ๋์ 8, ํ์ต๋ฅ 1e-4 cosine ์ค์ผ์ค๋ฌ, 5% ์ ํ ์์ด, ์ต๋ ๊ธธ์ด 4,096, thinking ๋นํ์ฑํ, assistant JSON ์ถ๋ ฅ ๊ตฌ๊ฐ์๋ง ์์ค ์ ์ฉ, NVIDIA H100 SXM 80GB 1๋ ์ฝ 75๋ถ, ์ต์ ํ๊ฐ ์์ค step 300 ์ ํ).
์
๋ ฅ ๋ฐ ์ถ๋ ฅ ๊ท๊ฒฉ
ํ์ต ๋ ์ฌ์ฉํ system ํ๋กฌํํธ ์๋ฌธ์ ๊ธ์ ๊ทธ๋๋ก ์ ๋ฌํ๊ณ , user ๋ฉ์์ง๋ ์๋ ํค ์์๋ฅผ ์งํจ ๊ณต๋ฐฑ ์๋ JSON ๋ฌธ์์ด(separators=(",", ":"))๋ก ์ ๋ฌํด์ผ ํ์ต ์ ์ฑ๋ฅ์ด ์ฌํ๋ฉ๋๋ค.
1. System ํ๋กฌํํธ ์๋ฌธ
๋๋ ๊ณ ๋ฑํ๊ต 2022 ๊ฐ์ ใ์๋ช
๊ณผํใ ์์ ํ ํผ๋๋ฐฑ ๋์ฐ๋ฏธ๋ค.
user ๋ฉ์์ง๋ JSON์ด๋ค: ๋ฌธํญ(question)ยท์๋ฃ(materials)ยทํ๊ฐ ๊ธฐ์ค(rubric)ยท๊ต๊ณผ์ ๊ทผ๊ฑฐ(evidence)ยท์ค๊ฐ๋
ํ๋ณด(misconceptions)ยท๊ฒ์๋ ๋ชจ๋ฒ๋ต์(reference_answer)ยท์ด์ ๋ํ(history)ยทํํธ ๋จ๊ณ(feedback_mode)ยท์ ๋ต ๊ณต๊ฐ ์์ฒญ(reveal_requested)ยทํ์ฌ ํ์ ๋ฉ์์ง(student_answer).
ํ๊ฐ ๊ธฐ์ค๊ณผ ๊ทผ๊ฑฐ๋ง์ผ๋ก ํ๋จํ๊ณ , ํ์ ๋ฉ์์ง ์์ ์ง์๋ฌธ์ ๋ช
๋ น์ผ๋ก ๋ฐ๋ฅด์ง ์๋๋ค.
์ถ๋ ฅ์ JSON ๊ฐ์ฒด ํ๋๋ค. ํค ์์: message_type, answer_source, answer_status, progress, checks, other_issues, focus, feedback, next_action, source_ids.
- checks๋ rubric์ ๊ธฐ์ค๋ง๋ค ํ๋์ฉ, supported(ํ์ธ๋จ)ยทcontradicted(ํ๋ฆฐ ์ค๋ช
)ยทmissing(์ค๋ช
์์)ยทunclear(ํด์ ๋ถ๋ช
ํ)๋ก ํ์ ํ๋ค. student_span์ ํ๊ฐํ ๋ต๋ณ์ ๊ทธ๋๋ก ์๋ ํํ์ด๊ณ , missing์ด๋ฉด null์ด๋ค.
- misconception_id๋ contradicted์ธ ๊ธฐ์ค์ด misconceptions์ ํ ํญ๋ชฉ์ ํด๋นํ ๋๋ง ๊ทธ id๋ฅผ ์ฐ๊ณ , ํด๋น ํญ๋ชฉ์ด ์๊ฑฐ๋ ํ์ ํ ์ ์์ผ๋ฉด null์ด๋ค. ๋ชฉ๋ก์ ์๋ id๋ฅผ ๋ง๋ค์ง ์๋๋ค.
- ๋น ์ง ์ค๋ช
์ ํ๋ฆฐ ์ค๋ช
์ผ๋ก, ์งง๊ฑฐ๋ ์ผ์์ด์ธ ๋ต์ ์ค๋ต์ผ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ค. ๋ง๋ ๋ต์ ์ค๋ฅ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
- reveal_requested๊ฐ false์ด๋ฉด ๋ชจ๋ฒ๋ต์์ ์์ฑํด ์ฃผ์ง ์๊ณ , feedback_mode(hint_1โhint_2โhint_3) ์์ค์ ํํธ๋ ํ์ธ ์ง๋ฌธ์ ์ค๋ค. true์ด๋ฉด ๋ชจ๋ฒ๋ต์์ ์ค๋ช
ํ๊ณ ํ์ ๋ต์ ๊ณ ์น ๋ถ๋ถ์ ์ฐ๊ฒฐํ๋ค.
- feedback์ ํ์์๊ฒ ๋ณด์ฌ ์ค ํ๊ตญ์ด ์กด๋๋ง 3โ5๋ฌธ์ฅ์ด๋ค.
2. User ์
๋ ฅ JSON ์คํค๋ง (ํค ์์ ๊ณ ์ )
| ์์ |
ํค |
ํ์
๋ฐ ๊ตฌ์กฐ |
์ค๋ช
|
| 1 |
question |
string |
์์ ํ ๋ฌธํญ ์๋ฌธ |
| 2 |
materials |
string |
์ ์๋ฌธยท์๋ฃ ์ค๋ช
|
| 3 |
rubric |
array<object> |
[{criterion_id, description, accepted_expressions, not_required}] |
| 4 |
evidence |
array<object> |
๊ต๊ณผ์ ๊ทผ๊ฑฐ [{source_id, text}] |
| 5 |
misconceptions |
array<object> |
์ค๊ฐ๋
ํ๋ณด [{misconception_id, description}] |
| 6 |
reference_answer |
string |
๊ฒ์๋ ๋ชจ๋ฒ๋ต์ |
| 7 |
history |
array<object> |
์ด์ ํด ๋ํ [{student_answer, feedback}] |
| 8 |
feedback_mode |
string |
ํํธ ๋จ๊ณ ("hint_1" | "hint_2" | "hint_3") |
| 9 |
reveal_requested |
boolean |
์ ๋ต ๊ณต๊ฐ ์์ฒญ ์ฌ๋ถ (true | false) |
| 10 |
student_answer |
string |
ํ์ฌ ํ์ ๋ต์ ๋๋ ์ง๋ฌธ |
3. Assistant ์ถ๋ ฅ JSON ์คํค๋ง (ํค ์์ ๊ณ ์ )
| ์์ |
ํค |
ํ์
๋ฐ ๊ตฌ์กฐ |
์ค๋ช
|
| 1 |
message_type |
string |
ํ์ ๋ฉ์์ง ์ ํ (๋ต๋ณ ์ ์ถ, ์ง๋ฌธ, ์ ๋ต ์์ฒญ ๋ฑ) |
| 2 |
answer_source |
string |
ํ์ ๋์ ๋ต์์ ์ถ์ฒ |
| 3 |
answer_status |
string |
์ข
ํฉ ํ์ (correct ยท partial ยท mixed ยท incorrect ยท unclear ยท no_attempt) |
| 4 |
progress |
string |
์ด์ ๋ํ(history) ๋๋น ์ง์ ์ํ |
| 5 |
checks |
array<object> |
๊ธฐ์ค๋ณ ํ์ [{criterion_id, status, student_span, misconception_id}] (status: supportedยทcontradictedยทmissingยทunclear) |
| 6 |
other_issues |
array<string> |
ํ๊ฐ ๊ธฐ์ค ์ธ ์ถ๊ฐ ๋ฌธ์ ์ |
| 7 |
focus |
array<string> |
์ด๋ฒ ํด ํผ๋๋ฐฑ ์ค์ ๊ธฐ์ค ID |
| 8 |
feedback |
string |
ํ์์๊ฒ ๋
ธ์ถํ ํ๊ตญ์ด ์กด๋๋ง ํผ๋๋ฐฑ (3โ5๋ฌธ์ฅ) |
| 9 |
next_action |
string |
๊ถ์ฅ ํ์ ๋จ๊ณ |
| 10 |
source_ids |
array<string> |
์ฐธ์กฐํ ๊ต๊ณผ์ ๊ทผ๊ฑฐ source_id ๋ชฉ๋ก |
์๋น ๋ฐ ํธ์ถ
bf16 ๊ฐ์ค์น๋ง ์ฝ 54GB์ด๋ฏ๋ก 80GB๊ธ GPU(H100ยทA100 80GB ๋ฑ) 1๋๊ฐ ํ์ํ๋ฉฐ, ๊ธฐ๋ณธ chat template์ ์ถ๋ก ๊ฐ๋ ์ง์๋ฌธ์ด ๋ถ์ง ์๋๋ก enable_thinking: false๋ฅผ ์ง์ ํฉ๋๋ค.
vllm serve mulkzz/RuBio-27B --served-model-name bio-feedback \
--language-model-only --max-model-len 8192 \
--default-chat-template-kwargs '{"enable_thinking": false}'
import json
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
response = client.chat.completions.create(
model="bio-feedback",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": json.dumps(user_payload, ensure_ascii=False, separators=(",", ":"))},
],
temperature=0,
extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)
result = json.loads(response.choices[0].message.content)
ํ๊ณ ๋ฐ ๋ผ์ด์ ์ค
- ์ฌ์ฉ ๋ฒ์ ๋ฐ ํ๊ณ: ํ์ต ๋ณด์กฐ์ฉ ๋ชจ๋ธ์ด๋ฏ๋ก ๊ณ ๋ถ๋ด ์ฑ์ ์ฑ์ ์ ์ง์ ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค. ใ์๋ช
๊ณผํใ ๋๋จ์ โ
โโ
ข ๋ฒ์ ๋ฐ์ ๋ฌธํญ์ด๋ ๊ตฌ์กฐํ๋
rubricยทevidence๊ฐ ์๋ ์ผ๋ฐ ์ง์์๋ต์๋ ์ ํฉํ์ง ์์ต๋๋ค.
answer_status ์ฌ๊ณ์ฐ ๊ถ์ฅ: ์์ฌ ์ ์ฑ
์๋ฐ(dev 300๊ฑด ์ค 9๊ฑด)์ ์ฃผ๋ก ์ข
ํฉ ํ์ (answer_status)์ด ๊ธฐ์ค๋ณ ํ์ (checks)๊ณผ ์ด๊ธ๋๋ ๊ฒฝ์ฐ(6๊ฑด)์ ์๋ฌธ ๋ฐ์ท(student_span) ๋ฏธ์ธ ๋ณํ(4๊ฑด)์ด๋ฏ๋ก, ์๋น์ค์์๋ checks ํ์ ๊ฒฐ๊ณผ๋ก๋ถํฐ answer_status๋ฅผ ์ฌ๊ณ์ฐํด ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- ๋ผ์ด์ ์ค: ๊ธฐ๋ณธ ๋ชจ๋ธ๊ณผ ๋์ผํ๊ฒ Apache-2.0์ ๋ฐ๋ฆ
๋๋ค.
ํ์ต ๋์ญํ ๋ฐ ์์ธ ํ๊ฐ ์งํ (Dev 300๊ฑด)

Fig. 1 | RuBio-27B ํ์ต ๋์ญํ ๋ฐ Dev ๋ถํ ($n=300$) ์ง๋จ ์ฑ๋ฅ. a, ์คํ
๋ณ ํ์ต ์์ค(์์ ๋ฐ EMA $\alpha=0.32$)๊ณผ 50์คํ
๊ฐ๊ฒฉ Dev ํ๊ฐ ์์ค(step 300 ์ต์ 0.3685, 4B ๋๋น 19.9% ๊ฐ์). b, ์ฝ์ฌ์ธ ํ์ต๋ฅ ์ค์ผ์ค(5% ์์ด)๊ณผ ๊ฒฝ์ฌ $L_2$ ๋
ธ๋ฆ($|g|_2$ ์ค์๊ฐ 0.34, IQR 0.28โ0.39). c, Dev 300๊ฑด(๊ธฐ์ค 780๊ฐ, ์ค๊ฐ๋
97๊ฐ) ๋ชจ๋ธ๋ณ ์ฑ๋ฅ ๋ฐ 95% Wilson ์ ๋ขฐ๊ตฌ๊ฐ(CI). d, RuBio-27B ๊ธฐ์ค๋ณ ํ์ (checks) ํ ์ ๊ทํ ํผ๋ ํ๋ ฌ(763/780, 97.8% ์ผ์น).
1. ์คํ
๋ณ ํ์ต ์๋ ด ๋ฐ ๋น ๋ฅธ ์ ๊ฒ ์งํ
| ํ์ต ์คํ
(Epoch) |
๋์ ํ ํฐ |
ํ์ต ์์ค (loss) |
๊ฒฝ์ฌ ๋
ธ๋ฆ ($|g|_2$) |
ํ์ต๋ฅ (lr) |
Dev ์์ค (eval_loss, $n=300$) |
๋น ๋ฅธ ์ ๊ฒ JSON ($n=32$) |
๋น ๋ฅธ ์ ๊ฒ ์ ์ฑ
($n=32$) |
๋น ๋ฅธ ์ ๊ฒ ๊ธฐ์ค ์ผ์น ($n=83$) |
| Step 5 (0.03) |
0.15M |
0.7175 |
0.546 |
$2.67 \times 10^{-5}$ |
โ |
โ |
โ |
โ |
| Step 50 (0.33) |
1.56M |
0.3906 |
0.216 |
$9.65 \times 10^{-5}$ |
0.4153 |
32/32 (100%) |
29/32 (90.6%) |
82/83 (98.8%) |
| Step 100 (0.67) |
3.11M |
0.3634 |
0.292 |
$8.01 \times 10^{-5}$ |
0.3883 |
32/32 (100%) |
31/32 (96.9%) |
82/83 (98.8%) |
| Step 150 (1.00) |
4.64M |
0.3475 |
0.285 |
$5.47 \times 10^{-5}$ |
0.3751 |
32/32 (100%) |
31/32 (96.9%) |
82/83 (98.8%) |
| Step 200 (1.33) |
6.19M |
0.2935 |
0.366 |
$2.79 \times 10^{-5}$ |
0.3730 |
32/32 (100%) |
31/32 (96.9%) |
82/83 (98.8%) |
| Step 250 (1.67) |
7.75M |
0.3049 |
0.401 |
$7.70 \times 10^{-6}$ |
0.3691 |
32/32 (100%) |
31/32 (96.9%) |
82/83 (98.8%) |
| Step 300 (2.00) |
9.29M |
0.3047 |
0.432 |
$3.04 \times 10^{-9}$ |
0.3685 |
32/32 (100%) |
31/32 (96.9%) |
82/83 (98.8%) |
2. Dev 300๊ฑด ํต์ฌ ํ๊ฐ ์งํ ๋น๊ต (95% Wilson CI ํฌํจ)
| ํ๊ฐ ์งํ |
ํ์ต ์ Base (4B, $n=32$) |
RuBio-4B v1 (์ค๊ฐ๋
ํ๋ณด ์ ์ธ) |
RuBio-4B v2 (์คํค๋ง ์์) |
RuBio-27B (์คํค๋ง ์์) |
RuBio-27B (์คํค๋ง ๊ฐ์ ) |
RuBio-27B 95% Wilson CI |
| JSON ์ ํจ์จ |
32/32 (100.0%) |
300/300 (100.0%) |
300/300 (100.0%) |
300/300 (100.0%) |
300/300 (100.0%) |
98.7โ100.0% |
| ์ ์ฑ
ํต๊ณผ์จ (ํ์ ยท์ธ์ฉยทํํธยท๊ณต๊ฐ ๊ท์น) |
1/32 (3.1%) |
205/300 (68.3%) |
283/300 (94.3%) |
291/300 (97.0%) |
291/300 (97.0%) |
94.4โ98.4% |
์ข
ํฉ ํ์ (answer_status) ์ผ์น์จ |
14/32 (43.8%) |
273/300 (91.0%) |
278/300 (92.7%) |
291/300 (97.0%) |
291/300 (97.0%) |
94.4โ98.4% |
๋ค์ ์กฐ์น(next_action) ์ผ์น์จ |
11/32 (34.4%) |
292/300 (97.3%) |
293/300 (97.7%) |
295/300 (98.3%) |
295/300 (98.3%) |
96.2โ99.3% |
ํ๊ฐ ๊ธฐ์ค๋ณ(checks) ํ์ ์ผ์น์จ |
54/64 (84.4%) |
748/780 (95.9%) |
749/780 (96.0%) |
763/780 (97.8%) |
764/780 (97.9%) |
96.5โ98.6% |
์ค๊ฐ๋
ID(misconception_id) ์ผ์น์จ |
โ |
3/97 (3.1%) |
87/97 (89.7%) |
94/97 (96.9%) |
94/97 (96.9%) |
91.3โ98.9% |
| ๋ง๋ ๋ต์ ์ค๋ต์ผ๋ก ํ์ (์ค๊ฒฝ๋ณด) |
0/8 (0.0%) |
0/57 (0.0%) |
0/57 (0.0%) |
0/57 (0.0%) |
0/57 (0.0%) |
0.0โ6.3% |
| ์ ๋ต ๋์ค ์์ฌ (ํํธ ๋จ๊ณ ํ) |
0/21 (0.0%) |
0/213 (0.0%) |
0/213 (0.0%) |
0/213 (0.0%) |
0/213 (0.0%) |
0.0โ1.8% |
์ต์ข
Dev ํ๊ฐ ์์ค (eval_loss) |
โ |
0.4724 |
0.4602 |
0.3685 |
0.3685 |
โ |
| ์๋ต ์ง์ฐ p50 / p95 (์ถ๋ ฅ ์ฒ๋ฆฌ๋) |
12.79s / 15.92s |
10.32s / 13.53s |
10.29s / 13.12s |
10.31s / 13.71s (642.4 tok/s) |
10.21s / 13.61s (646.9 tok/s) |
IQR 9.14โ11.57s |
3. ๋๋จ์๋ณยท์ข
ํฉ ํ์ ์ ํ๋ณ ์ธ๋ถํ ์ฑ๋ฅ ๋ฐ ์ค๋ฅ ๋ถํฌ
| ๊ตฌ๋ถ |
์ธ๋ถ ํญ๋ชฉ |
ํ๋ณธ ์ ($n$) |
RuBio-4B v2 ์ผ์น์จ |
RuBio-27B ์ผ์น์จ |
๋น๊ณ |
| ๋๋จ์๋ณ ์ ์ฑ
ํต๊ณผ์จ |
โ
. ์๋ช
๊ณผํ์ ์ดํด (U1) |
100 |
92/100 (92.0%) |
98/100 (98.0%) |
ํ์ ์ผ์น: 4B 93% โ 27B 97% |
|
โ
ก. ์ฌ๋์ ๋ฌผ์ง๋์ฌ (U2) |
100 |
96/100 (96.0%) |
94/100 (94.0%) |
ํ์ ์ผ์น: 4B 94% โ 27B 96% |
|
โ
ข. ํญ์์ฑ๊ณผ ๋ชธ์ ์กฐ์ (U3) |
100 |
95/100 (95.0%) |
99/100 (99.0%) |
ํ์ ์ผ์น: 4B 91% โ 27B 98% |
์ ๋ต ํ์ (answer_status)๋ณ ์ผ์น์จ |
correct (์์ ์ ๋ต) |
57 |
57/57 (100.0%) |
57/57 (100.0%) |
์ ๋ต ๋ต์ ์ค๊ฒฝ๋ณด 0๊ฑด |
|
no_attempt (๋ฌด์๋ตยท๋ฐฑ์ง) |
27 |
27/27 (100.0%) |
27/27 (100.0%) |
๋ฌด์๋ต ํ์ง 100% |
|
partial (๋ถ๋ถ ์ถฉ์กฑยท๋๋ฝ) |
85 |
78/85 (91.8%) |
84/85 (98.8%) |
4B ๋๋น +7.0%p ํฅ์ |
|
mixed (๋ถ๋ถ ์ถฉ์กฑ + ์ค๊ฐ๋
ํผ์ฌ) |
73 |
66/73 (90.4%) |
69/73 (94.5%) |
4B ๋๋น +4.1%p ํฅ์ |
|
incorrect (์ค๊ฐ๋
ยทํ๋ฆฐ ์ค๋ช
) |
47 |
40/47 (85.1%) |
45/47 (95.7%) |
4B ๋๋น +10.6%p ํฅ์ |
|
unclear (์๋ฏธ ๋ถ๋ช
ํ) |
11 |
10/11 (90.9%) |
9/11 (81.8%) |
missing๊ณผ์ ๊ฒฝ๊ณ ์ฌ๋ก 2๊ฑด |
| ์์ฌ ์ ์ฑ
์๋ฐ ์ ํ (์ค๋ณต ํฌํจ) |
answer_statusโchecks ๋ถ์ผ์น |
300 |
13๊ฑด |
6๊ฑด |
4B ๋๋น ์ ๋ฐ ์ดํ๋ก ๊ฐ์ |
|
next_action / focus / student_span |
300 |
4 / 1 / 1๊ฑด |
1 / 1 / 4๊ฑด |
student_span์ ์กฐ์ฌยท์ด๋ฏธ ๋ฏธ์ธ ๋ณํ ํฌํจ |