import gradio as gr import random import matplotlib.pyplot as plt import numpy as np from PIL import Image import io def generate_math_content(education_level, math_field, specific_topic, difficulty): # 문제 은행 (실제 구현시 더 많은 문제 추가 필요) problems = { "중학교": { "대수": { "일차방정식": [ { "basic": "x + 5 = 12 를 풀어보세요.", "medium": "2x + 7 = 15 를 풀어보세요.", "advanced": "3x + 4 = 2x - 8 을 풀어보세요." } ] }, "기하": { "삼각형": [ { "basic": "밑변이 6cm, 높이가 4cm인 삼각형의 넓이를 구하세요.", "medium": "세 변의 길이가 3, 4, 5인 삼각형의 넓이를 구하세요.", "advanced": "두 변의 길이가 5cm, 8cm이고 그 사이각이 60°인 삼각형의 넓이를 구하세요." } ] } } } # 해설 생성 def create_explanation(): explanations = { "basic": "기본 개념을 이용한 단계별 풀이:\n1. 주어진 식을 확인합니다.\n2. 기본 연산을 수행합니다.\n3. 결과를 검증합니다.", "medium": "중급 난이도 풀이 전략:\n1. 문제 분석\n2. 적용할 공식 선택\n3. 계산 수행\n4. 결과 검증", "advanced": "고급 문제 해결 방법:\n1. 문제의 조건 분석\n2. 해결 전략 수립\n3. 단계별 계산\n4. 결과의 타당성 검토" } return explanations[difficulty] # 시각화 생성 def create_visualization(): fig, ax = plt.subplots(figsize=(8, 6)) if math_field == "대수": x = np.linspace(-10, 10, 100) y = x + 5 ax.plot(x, y) ax.grid(True) ax.axhline(y=0, color='k') ax.axvline(x=0, color='k') plt.title("일차방정식의 그래프") elif math_field == "기하": points = np.array([[0, 0], [6, 0], [3, 4]]) triangle = plt.Polygon(points, fill=False) ax.add_patch(triangle) ax.set_xlim(-2, 8) ax.set_ylim(-2, 6) plt.title("삼각형") buf = io.BytesIO() plt.savefig(buf, format='png') buf.seek(0) return Image.open(buf) # 연습문제 생성 practice_problems = [ "연습문제 1: 기본 개념 확인", "연습문제 2: 응용력 테스트", "연습문제 3: 심화 문제" ] # 자가진단 체크리스트 checklist = [ "□ 핵심 개념을 이해했나요?", "□ 문제 해결 과정을 설명할 수 있나요?", "□ 비슷한 유형의 문제를 풀 수 있나요?", "□ 실생활 적용 사례를 생각할 수 있나요?" ] problem = problems.get(education_level, {}).get(math_field, {}).get(specific_topic, [{}])[0].get(difficulty, "문제를 찾을 수 없습니다.") explanation = create_explanation() visualization = create_visualization() return problem, explanation, visualization, "\n".join(practice_problems), "\n".join(checklist) def create_interface(): with gr.Blocks() as demo: with gr.Row(): with gr.Column(): education_level = gr.Dropdown( choices=["중학교", "고등학교", "대학교"], label="교육과정 단계", value="중학교" ) math_field = gr.Dropdown( choices=["대수", "기하", "해석학"], label="수학 영역", value="대수" ) specific_topic = gr.Dropdown( choices=["일차방정식", "삼각형"], label="세부 주제", value="일차방정식" ) difficulty = gr.Dropdown( choices=["basic", "medium", "advanced"], label="난이도", value="basic" ) generate_btn = gr.Button("문제 생성") with gr.Column(): problem_output = gr.Textbox(label="생성된 문제") explanation_output = gr.Textbox(label="상세 풀이") visualization_output = gr.Image(label="시각화") practice_output = gr.Textbox(label="연습문제") checklist_output = gr.Textbox(label="자가진단 체크리스트") generate_btn.click( generate_math_content, inputs=[education_level, math_field, specific_topic, difficulty], outputs=[problem_output, explanation_output, visualization_output, practice_output, checklist_output] ) return demo demo = create_interface() if __name__ == '__main__': demo = create_interface() # demo 변수 정의 demo.launch() # 실행