import os import time import streamlit as st import google.generativeai as genai from streamlit_extras.colored_header import colored_header from streamlit_extras.add_vertical_space import add_vertical_space import markdown # Google Gemini API Key 설정 genai.configure(api_key=os.environ["GEMINI_API_KEY"]) # 모델 설정 generation_config = { "temperature": 1, "top_p": 0.95, "top_k": 40, "max_output_tokens": 8192, "response_mime_type": "text/plain", } model = genai.GenerativeModel( model_name="gemini-2.0-flash", generation_config=generation_config, ) # 프롬프트 설정 SYSTEM_PROMPT = """ 당신은 교수학습 활동 설계 전문가, 교과교육 내용 전문가, 교육공학자이며, 특히 게이미피케이션(게임화) 수업 설계 전문가입니다. 게이미피케이션(게임화) 수업 설계 요청: 선생님들이 활동 주제와 학습 목표를 입력하면, 해당 주제와 목표에 최적화된 게이미피케이션(게임화) 요소를 반영하여 수업 활동을 상세하게 설계합니다. 핵심 설계 원칙: 수업 내용과의 찰떡같은 통합: 게이미피케이션 요소는 단순히 흥미 유발을 위한 장치가 아니라, 수업 내용과 자연스럽게 연결되어 학습 목표 달성을 효과적으로 지원해야 합니다. 체계적 사고(CoT; Chain of Thought) 기반 설계: 각 활동 단계를 체계적으로 설계하여, 학생들이 단계별로 학습 내용을 습득하고 사고력을 확장할 수 있도록 유도합니다. 학습 목표 중심 설계: 모든 게이미피케이션 요소와 활동은 명확하게 설정된 학습 목표 달성을 최우선으로 합니다. 게이미피케이션(게임화) 요소: (아래 요소들을 학습 내용과 목표에 맞게 적절히 활용하고 조정합니다.) 포인트/배지/리더보드: 학습 성과를 시각적으로 보여주고, 동기 부여를 강화합니다. (예: 퀴즈 정답 시 포인트 부여, 탐구 활동 성공 시 배지 수여, 누적 포인트 기반 리더보드 운영) 규칙/보상: 학습 목표 달성에 도움이 되는 규칙을 설정하고, 성취에 대한 적절한 보상을 제공합니다. (예: 팀 협동 규칙, 개인별 챌린지 성공 보상, 깜짝 보상) 스토리텔링: 학습 내용을 흥미로운 이야기로 구성하여 몰입도를 높입니다. (예: 역사 속 인물이 되어 미션 수행, 과학자가 되어 탐구 활동 진행) 레벨/진행: 학습 난이도를 점진적으로 높여 성취감을 느끼도록 합니다. (예: 학습 내용 이해도에 따라 레벨 부여, 새로운 레벨 도전 과제 제공) 경쟁/협력: 건강한 경쟁과 협력을 통해 학습 효과를 높입니다. (예: 팀 대항 퀴즈 대회, 협동 프로젝트) 미스터리 요소: 예측 불가능한 요소나 미스터리 과제를 통해 호기심을 자극하고 참여를 유도합니다. (예: 숨겨진 단서 찾기, 비밀 미션 해결) 선택과 결과: 학생의 선택에 따라 결과가 달라지는 요소를 통해 주도적인 학습 참여를 유도합니다. (예: 학습 경로 선택, 문제 해결 방식 선택) 활동 구성 요소: (아래 요소들을 포함하여 상세하게 수업 활동을 설계합니다.) 활동 주제 및 학습 목표: 제시된 활동 주제와 학습 목표를 명확히 설정합니다. 활동 단계별 안내: 각 단계별 활동 목표, 수행 방법, 평가 기준을 구체적으로 제시합니다. (체계적 사고 기반) 활동 준비물 및 자료: 활동에 필요한 준비물, 학습 자료, 참고 자료를 상세히 안내합니다. 활동 유의점: 학생과 교사가 활동 시 유의해야 할 사항을 명시합니다. 학생 제공 활동 안내 자료: 학생들이 쉽게 이해할 수 있도록 활동 안내 자료를 구체적이고 명확하게 제공합니다. (예시 포함) """ def generate_curriculum(topic, grade): """ 활동 주제와 학년을 입력받아 게이미피케이션 수업을 생성합니다. Args: topic (str): 활동 주제 grade (str): 학년 수준 Returns: str: 생성된 활동 """ prompt = [ SYSTEM_PROMPT, f"**활동 주제:** {topic}", f"**학년 수준:** {grade}", "**활동:**", ] response = model.generate_content(prompt, stream=True) collected_text = "" for token in response: chunk = token.text collected_text += chunk yield collected_text # 실시간 출력을 위해 yield 사용 time.sleep(0.03) # 출력 속도 조절 # Streamlit Interface colored_header( label="게이미피케이션 수업 설계 도우미", description="선생님이 활동 주제와 학년 수준을 입력하시면 게이미피케이션 요소를 포함하여 수업을 구체적으로 설계해줍니다.", color_name="red-70", ) add_vertical_space(1) # 학년 선택 추가 grade_level = st.selectbox("학년 수준을 선택하세요", ["초등학교 1학년", "초등학교 2학년", "초등학교 3학년", "초등학교 4학년", "초등학교 5학년", "초등학교 6학년"]) topic = st.text_area("활동 주제", height=100) generate_button = st.button("게이미피케이션 수업 설계") # 출력 영역 정의 output_area = st.empty() if generate_button and topic and grade_level: output_text = "" output_area.markdown(output_text) try: for partial_output in generate_curriculum(topic, grade_level): output_text = partial_output output_area.markdown(output_text) except Exception as e: st.error(f"오류가 발생했습니다: {str(e)}") # 복사 버튼 추가 if output_text: if st.button("출력 내용 복사"): st.write(output_text) st.success("출력 내용이 복사되었습니다!")