YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Korean Reading Comprehension QA (μ¨μ )
κ΅μ΄ κ΅κ³Ό μ§λ¬Έν μ£Όκ΄μ λ¬Έμ λ₯Ό μ±μ νκ³ ν΄μ€μ μμ±νλ LoRA μ΄λν°μ
λλ€.
Qwen2.5-3B-Instructλ₯Ό QLoRAλ‘ νμΈνλνμ΅λλ€.
νμ΅ λ°μ΄ν°
- AI Hub κ΅μ΄ κ΅κ³Ό μ§λ¬Έν λ¬Έμ λ°μ΄ν° (μ€1 ~ κ³ 3)
- μ§λ¬Έ + μ£Όκ΄μ λ¬Έμ + μ νμ§ + λͺ¨λ²λ΅μ + ν΄μ€ νμμΌλ‘ κ°κ³΅
- v1 λλΉ μ νμ§ ν¬ν¨ μ¬κ°κ³΅ (v2)
μ±λ₯
| λ²μ | μ λ΅λ₯ | λΉκ³ |
|---|---|---|
| λλ€ κΈ°μ€μ | 20% | 5μ§μ λ€ |
| v1 | 41% | μ νμ§ μμ΄ νμ΅ |
| v2 (νμ¬) | 95% | μ νμ§ ν¬ν¨ μ¬νμ΅ |
νμ΅ μ€μ
| νλͺ© | κ° |
|---|---|
| λ°©μ | QLoRA (4-bit NF4) |
| LoRA rank | 16 |
| LoRA alpha | 32 |
| Epochs | 2 |
| Learning rate | 1e-4 |
| Optimizer | paged_adamw_8bit |
| Max length | 1024 |
| Framework | trl SFTTrainer / peft 0.17.1 |
μ¬μ© λ°©λ²
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
BASE_MODEL = "Qwen/Qwen2.5-3B-Instruct"
ADAPTER_PATH = "Onjeom/korean_qa"
tokenizer = AutoTokenizer.from_pretrained(ADAPTER_PATH, trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(
BASE_MODEL,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True,
)
model = PeftModel.from_pretrained(base_model, ADAPTER_PATH)
model.eval()
messages = [
{"role": "system", "content": "λ€μ μ§λ¬Έμ μ½κ³ λ¬Ένμ λ΅νμμ€."},
{"role": "user", "content": "[μ§λ¬Έ]\n...\n\n[λ¬Έν]\n...\nβ ...\nβ‘ ...\nβ’ ...\nβ£ ...\nβ€ ..."},
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
output_ids = model.generate(
**inputs,
max_new_tokens=256,
do_sample=False,
repetition_penalty=1.1,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.eos_token_id,
)
new_ids = output_ids[0][inputs["input_ids"].shape[1]:]
print(tokenizer.decode(new_ids, skip_special_tokens=True))
ν둬ννΈ νμ
μμ€ν
: λ€μ μ§λ¬Έμ μ½κ³ λ¬Ένμ λ΅νμμ€.
μ λ ₯:
[μ§λ¬Έ]
{μ§λ¬Έ ν
μ€νΈ}
[λ¬Έν]
{λ¬Έμ }
β ...
β‘ ...
β’ ...
β£ ...
β€ ...
μΆλ ₯:
μ λ΅: β£ ...
ν΄μ€: ...
API ν μ€νΈ λ°©λ²
1. μλ² μ€ν
cd onjeom/api
pip install -r requirements.txt
cp .env.example .env
# HuggingFace λ‘κ·ΈμΈ (μ΅μ΄ 1ν)
huggingface-cli login
# λͺ¨λΈ ν¬ν¨ μ μ μ€ν
uvicorn app.main:app --reload
# λΉ λ₯Έ μ¬μμ (λΌμ°ν°/μ€ν€λ§ μμ μ, λͺ¨λΈ λ‘λ© μλ΅)
SKIP_MODEL_LOAD=1 uvicorn app.main:app --reload
μ²μ μ€ν μ λͺ¨λΈ μλ λ€μ΄λ‘λ (μ½ 5~10λΆ μμ).
λͺ¨λΈ λ‘λ© μλ£!λ©μμ§κ° λ¨λ©΄ μ€λΉλ κ±°μμ.
2. Swagger UI ν μ€νΈ
- λΈλΌμ°μ μμ
http://localhost:8000/docsμ μ - ν μ€νΈν μλν¬μΈνΈ ν΄λ¦
- Try it out λ²νΌ ν΄λ¦
- μμ λ°μ΄ν° λΆμ¬λ£κ³ Execute ν΄λ¦
3. μ£Όμ μλν¬μΈνΈ μμ
μ£Όκ΄μ μλ μ±μ POST /api/grading/grade
{
"passage": "μ¬λ§μ κ°μλμ΄ λ§€μ° μ μ μ§μμΌλ‘, μΌκ΅μ°¨κ° ν¬κ³ μλ¬Όμ΄ κ±°μ μλΌμ§ μλλ€. μ μΈμ₯μ λκΊΌμ΄ μ€κΈ°μ μλΆμ μ μ₯νμ¬ μ΄λ° νκ²½μ μ μνλ€.",
"question": "μ μΈμ₯μ΄ μ¬λ§ νκ²½μμ μ΄μλ¨μ μ μλ μ΄μ λ₯Ό μμ νμμ€.",
"model_answer": "μ μΈμ₯μ λκΊΌμ΄ μ€κΈ°μ μλΆμ μ μ₯νλ ꡬ쑰λ₯Ό κ°μ§κ³ μμ΄ κ°μλμ΄ μ μ μ¬λ§μμλ μμ‘΄ν μ μλ€.",
"keywords": [
{"keyword": "μλΆ μ μ₯", "weight": 50},
{"keyword": "λκΊΌμ΄ μ€κΈ°", "weight": 30},
{"keyword": "μ¬λ§", "weight": 20}
],
"student_answer": "μ μΈμ₯μ μ€κΈ°μ λ¬Όμ μ μ₯ν΄μ μ¬λ§μμ μ΄ μ μλ€."
}
AI νν° μ§λ¬Έ POST /api/tutor/ask
{
"question": "μΆλ‘ μ λ
ν΄λ 무μμΈκ°μ?",
"context": null
}
μ©μ΄ μ€λͺ
POST /api/tutor/explain
{
"term": "μμ€λ²",
"context": "κΈμ΄μ΄λ μμ€λ²μ μ¬μ©νμ¬ μ£Όμ λ₯Ό κ°μ‘°νλ€."
}
컀리νλΌ μμ± POST /api/curriculum/generate
{
"theta": -0.5,
"daily_goal": 10,
"weak_areas": ["μΆλ‘ μ μ΄ν΄", "λΉνμ λ
ν΄"]
}
ν¬μ€ μ²΄ν¬ GET /health β {"status": "ok"}
νμ μ΄λν° λ€μ΄λ‘λ
huggingface-cli download Onjeom/korean_qa --local-dir ./models/korean_qa
Inference Providers NEW
This model isn't deployed by any Inference Provider. π Ask for provider support