schoolcal / app.py
yongyeol's picture
Create app.py
bf3a943 verified
raw
history blame
3.23 kB
# app.py
import gradio as gr
import requests
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
# Load KoAlpaca model
model_id = "beomi/KoAlpaca-Polyglot-5.8B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
NEIS_KEY = "a69e08342c8947b4a52cd72789a5ecaf"
SCHOOL_INFO_URL = "https://open.neis.go.kr/hub/schoolInfo"
SCHEDULE_URL = "https://open.neis.go.kr/hub/SchoolSchedule"
REGIONS = {
"μ„œμšΈνŠΉλ³„μ‹œκ΅μœ‘μ²­": "B10",
"κ²½μƒλΆλ„κ΅μœ‘μ²­": "R10"
}
MONTH_NAMES = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]
def get_school_code(region_code, school_name):
params = {
"KEY": NEIS_KEY,
"Type": "json",
"pIndex": 1,
"pSize": 1,
"SCHUL_NM": school_name,
"ATPT_OFCDC_SC_CODE": region_code
}
res = requests.get(SCHOOL_INFO_URL, params=params)
data = res.json()
try:
return data["schoolInfo"][1]["row"][0]["SD_SCHUL_CODE"], data["schoolInfo"][1]["row"][0]["ATPT_OFCDC_SC_CODE"]
except:
return None, None
def get_schedule(region_code, school_code, year, month):
from_ymd = f"{year}{month}01"
to_ymd = f"{year}{month}31"
params = {
"KEY": NEIS_KEY,
"Type": "json",
"pIndex": 1,
"pSize": 100,
"ATPT_OFCDC_SC_CODE": region_code,
"SD_SCHUL_CODE": school_code,
"AA_FROM_YMD": from_ymd,
"AA_TO_YMD": to_ymd
}
res = requests.get(SCHEDULE_URL, params=params)
data = res.json()
try:
rows = data["SchoolSchedule"][1]["row"]
return rows
except:
return []
def generate_answer(region, school_name, year, month, question):
region_code = REGIONS.get(region)
if not region_code:
return "잘λͺ»λœ κ΅μœ‘μ²­μž…λ‹ˆλ‹€."
school_code, confirmed_region = get_school_code(region_code, school_name)
if not school_code:
return "학ꡐ 정보λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."
schedule_rows = get_schedule(confirmed_region, school_code, year, month)
if not schedule_rows:
schedule_text = "ν˜„μž¬ 일정 μ •λ³΄λŠ” μ—†μŠ΅λ‹ˆλ‹€."
else:
schedule_text = "\n".join(f"{row['AA_YMD']}: {row['EVENT_NM']}" for row in schedule_rows)
prompt = f"""일정 정보:
{schedule_text}
μ‚¬μš©μž 질문: {question}
μžμ—°μŠ€λŸ½κ²Œ λŒ€λ‹΅ν•˜μ„Έμš”."""
result = generator(prompt, max_new_tokens=200, temperature=0.7)[0]["generated_text"]
return result
def interface_fn(region, school_name, year, month, question):
return generate_answer(region, school_name, year, month, question)
with gr.Interface(
fn=interface_fn,
inputs=[
gr.Dropdown(choices=list(REGIONS.keys()), label="ꡐ윑청 선택"),
gr.Textbox(label="학ꡐλͺ… μž…λ ₯"),
gr.Textbox(label="년도 μž…λ ₯", placeholder="예: 2025"),
gr.Dropdown(choices=MONTH_NAMES, label="μ›” 선택 (예: 07)"),
gr.Textbox(label="GPT 질문 μž…λ ₯")
],
outputs=gr.Textbox(label="GPT의 응닡"),
title="학사일정 + GPT 챗봇 (KoAlpaca)"
) as app:
app.launch()