Spaces:
Paused
Paused
File size: 5,902 Bytes
1d355ad fabb74d 56cd9ca 22032f3 56cd9ca 1d355ad 56cd9ca 22032f3 fabb74d 56cd9ca ea3eb7a 56cd9ca fabb74d ae8ada4 fabb74d 90424bc fabb74d 8af7eda 115bf3e 8af7eda 115bf3e fabb74d 39688bd a941647 fabb74d a941647 90424bc fabb74d 07a1af3 a941647 fabb74d 4c541d4 fabb74d 217a78d fabb74d 3b978dd a941647 4c541d4 fabb74d feb03cf 3b4323a fabb74d 3b4323a fabb74d 3b4323a 940b028 56cd9ca a941647 56cd9ca 39688bd 03d0703 56cd9ca a941647 f84d704 a941647 a4fd186 56cd9ca a941647 56cd9ca a941647 56cd9ca | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 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("μΆλ ₯ λ΄μ©μ΄ 볡μ¬λμμ΅λλ€!") |