Downloads · 30 days
0
i-route-ai/iroute-writing-ai
iroute-writing-ai is a machine learning model from i-route-ai. Use it for the machine learning task on the model card, and read the license before you ship it in a product.
국어 교과 서술형 답안을 채점하고 맞춤형 피드백을 생성하는 LoRA 어댑터입니다. Meta-Llama-3.1-8B-bnb-4bit를 QLoRA(Unsloth)로 파인튜닝했습니다.
Downloads · 30 days
0
Access
Public
Updated May 26, 2026
Repo size
353 MB
Likes
0
Public
Click a slice to open those files.
.safetensors336 MB · 95%
From the Hugging Face model README
국어 교과 서술형 답안을 채점하고 맞춤형 피드백을 생성하는 LoRA 어댑터입니다. Meta-Llama-3.1-8B-bnb-4bit를 QLoRA(Unsloth)로 파인튜닝했습니다.
| 지표 | 수치 | 비고 |
|---|---|---|
| 인접 정확도 (±1점) | 87.5% | 인간 채점관 수준의 실무 합격선 |
| 1점 적중률 | 86.0% | |
| Macro F1-Score | 0.5348 |
| 항목 | 값 |
|---|---|
| 방식 | QLoRA (4-bit NF4) |
| LoRA rank | 32 |
| LoRA alpha | 32 |
| Epochs | 3 |
| Learning rate | 3e-5 |
| Optimizer | adamw_8bit |
| Max length | 1536 |
| Framework | unsloth / trl SFTTrainer |
이 어댑터는 i-Route AI 서버에서 unsloth/Meta-Llama-3.1-8B-bnb-4bit 베이스 모델 위에 PEFT 어댑터로 로드됩니다. 수학(math), 일반(general) 어댑터와 함께 단일 GPU에서 동시 서비스됩니다.
import torch
import re
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
BASE_MODEL_ID = "unsloth/Meta-Llama-3.1-8B-bnb-4bit"
WRITING_ADAPTER = "i-route-ai/iroute-writing-ai"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_ID)
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(
BASE_MODEL_ID,
quantization_config=bnb_config,
device_map="auto",
)
model.load_adapter(WRITING_ADAPTER, adapter_name="writing")
model.set_adapter("writing")
RELAXED_INSTRUCTION = """주어진 지시문과 학생의 답안을 분석하여, 부족한 점과 개선 방향을 포함한 피드백을 작성하고 맨 마지막에 1점부터 4점 사이의
최종 점수를 부여하시오.
[유연하고 관대한 채점 기준]
- 4점: 지시문의 핵심 요구사항을 잘 파악하였고 전반적인 흐름이 우수한 답안 (사소한 결함은 너그럽게 만점 처리)
- 3점: 지시문은 이해했으나 근거가 다소 평이하거나 논리의 깊이가 아쉬운 일반적인 답안
- 2점: 지시문의 키워드만 겨우 나열했거나 주장의 근거가 심각하게 부족한 답안
- 1점 (최하점): 같은 말을 무의미하게 반복하거나 꼼수가 명백한 답안"""
ALPACA_PROMPT = "Below is an instruction that describes a task, paired with an input that provides further context. Write a response that
appropriately completes the request.\n\n### Instruction:\n{}\n\n### Input:\n{}\n\n### Response:\n{}"
student_answer = "선인장은 줄기에 물을 저장해서 사막에서 살 수 있다."
safe_input = student_answer[:700] # OOM 방지용 700자 제한
prompt = ALPACA_PROMPT.format(RELAXED_INSTRUCTION, safe_input, "")
inputs = tokenizer([prompt], return_tensors="pt").to("cuda")
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.1,
top_p=0.9,
pad_token_id=tokenizer.eos_token_id,
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True).split("### Response:\n")[-1].strip()
print(response)
지시문: 주어진 지시문과 학생의 답안을 분석하여... [유연하고 관대한 채점 기준] ...
입력: {학생 답안 텍스트 - 한국어 토큰 폭발 방지를 위해 700자 제한 권장}
출력: {개선 방향 및 피드백 텍스트}
[최종 점수: 4]
i-Route AI 서버(/api/writing/evaluate)에서 이 어댑터를 활용합니다. 키워드 매칭 점수와 LLM 채점 결과를 결합하여 최종 점수를 산출합니다.
POST /api/writing/evaluate { "passage_text": "...", "question_text": "광합성 과정을 설명하시오.", "model_answer": "식물은 빛에너지를 이용해 이산화탄소와 물로 포도당을 합성한다.", "user_answer": "선인장은 줄기에 물을 저장해서 사막에서 살 수 있다.", "keywords": [{"keyword": "빛에너지", "weight": 2}, {"keyword": "포도당", "weight": 2}] }
huggingface-cli download i-route-ai/iroute-writing-ai --local-dir ./models/iroute-writing-ai