Spaces:
Paused
Paused
| 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("μΆλ ₯ λ΄μ©μ΄ 볡μ¬λμμ΅λλ€!") |