File size: 5,862 Bytes
ba30c97 3d3c68d ba30c97 7fbccf5 7a656d6 3d3c68d 53ea038 7fbccf5 3d3c68d 7fbccf5 fd17318 7fbccf5 591d161 7fbccf5 591d161 1be716f 591d161 7a656d6 591d161 34845b4 591d161 7a656d6 591d161 34845b4 591d161 34845b4 591d161 34845b4 d4cbbde 591d161 7fbccf5 1be716f 1f5e75c 7fbccf5 be9c54c 1be716f 7fbccf5 34845b4 591d161 7fbccf5 591d161 7fbccf5 591d161 7a656d6 7fbccf5 591d161 7fbccf5 591d161 7fbccf5 591d161 0596baf 591d161 7fbccf5 ba30c97 7fbccf5 ad6df1d 7fbccf5 3d3c68d ba30c97 ad6df1d 7fbccf5 |
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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import os
import time
import google.generativeai as genai
import streamlit as st
from streamlit_extras.colored_header import colored_header
from streamlit_extras.add_vertical_space import add_vertical_space
import markdown
# Google Gemini API 값 설정
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# 모델 설정
generation_config = {
"temperature": 0.7,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8000,
"response_mime_type": "text/plain",
}
model = genai.GenerativeModel(
model_name="gemini-2.5-flash",
generation_config=generation_config,
)
def generate_text(grade, num_paragraphs, sentences_per_paragraph, structure, topic):
"""
주어진 조건에 따라 설명문 텍스트, 어휘 목록, 독해 문제를 생성하고 스트리밍으로 출력합니다.
"""
# 상세화된 프롬프트: 설명문 작성 + 어휘 목록 + 독해 문제 출제 요청 추가
prompt = f"""
# 지시사항
## 1. 설명문 작성
- **대상 독자:** 초등학교 {grade} 학생
- **주제:** '{topic}'
- **글의 구조:** '{structure}' 구조를 명확히 따를 것
- **분량:** 전체 {num_paragraphs}개 문단 내외, 문단 당 {sentences_per_paragraph}개 문장 내외
- **스타일:**
- 초등학생이 이해하기 쉬운 단어와 문장 사용
- 줄글 형식으로 작성, 문단 구분 명확히 (빈 줄 사용)
- 각 문단의 첫 문장 또는 마지막 문장이 중심 문장이 되도록 작성
- **제목:** 글의 맨 처음에 내용을 잘 나타내는 제목을 **크고 굵은 글씨**로 작성 (Markdown 형식: '** 제목 **')
## 2. 어휘 목록 작성
- **선정 기준:** 본문 내용 중 초등학교 {grade}에게 어려울 수 있는 단어, 한자어, 학습 용어
- **설명 방식:** 해당 학년 수준에 맞는 쉬운 유의어 또는 풀이 제공
- **형식:** 설명문 본문 뒤에 '### 어휘 목록' 제목 아래 글머리 기호 목록으로 작성
```markdown
### 어휘 목록
* 단어1: 쉬운 설명/유의어
* 단어2: 쉬운 설명/유의어
...
```
## 3. 독해 문제 및 정답 출제
- **출제 기반:** **반드시 위에서 생성된 설명문 내용만을 바탕으로** 출제
- **문제 수:** 총 7~8개
- **문제 유형 (균형 있게 포함):**
- **사실적 이해:** 글에 명시된 정보 확인 (누가, 무엇을, 언제, 어디서 등)
- **추론적 이해:** 글에 명시되지 않았지만 내용을 바탕으로 논리적으로 판단 가능한 내용 (왜, 그래서 어떻게 될까 등)
- **어휘:** 본문 또는 어휘 목록에 나온 단어의 문맥상 의미 파악
- **글의 구조:** 글 전체의 짜임, 문단 간 관계, 사용된 설명 방식 등 파악
- **문제 형식 (혼합 사용):**
- **단답형:** 간단한 단어, 구, 짧은 문장으로 답하는 문제
- **5지 선다형:** 5개의 선택지(①, ②, ③, ④, ⑤) 중 정답을 고르는 문제 (오답 선택지도 그럴듯하게 구성)
- **형식:**
- '### 독해 문제' 제목 아래 문제 번호(1., 2., ...)와 함께 문제 제시
- 모든 문제 출제 후, '### 정답' 제목 아래 문제 번호와 정답 명확히 제시
```markdown
### 독해 문제
1. [문제 내용 - 단답형 또는 5지 선다형]
① 선택지1 ② 선택지2 ③ 선택지3 ④ 선택지4 ⑤ 선택지5 (선다형의 경우)
2. [문제 내용 - 단답형 또는 5지 선다형]
... (총 7~8개)
### 정답
1. [정답 내용 또는 번호]
2. [정답 내용 또는 번호]
...
```
## # 출력 요구사항
- 위의 모든 지시사항(설명문, 어휘 목록, 독해 문제, 정답)을 **하나의 응답**으로 이어서 생성해주세요.
- 각 섹션(제목, 본문, 어휘 목록, 독해 문제, 정답) 구분을 Markdown 제목(##, ###)과 빈 줄로 명확히 해주세요.
- 모든 내용은 초등학교 {grade} 눈높이에 맞춰 작성해주세요."""
full_text = "" # 전체 텍스트 저장 변수 초기화
try:
response = model.generate_content(prompt, stream=True)
for chunk in response:
full_text += chunk.text
# Markdown to HTML 변환
html_text = markdown.markdown(full_text, extensions=['tables'])
output_area.markdown(html_text, unsafe_allow_html=True)
time.sleep(0.1) # 지연 추가 (필요에 따라 조절)
except Exception as e:
st.error(f"에러 발생: {str(e)}")
return ""
# 출력 및 복사 기능 추가
copy_button = st.button("출력 내용 복사")
if copy_button:
pyperclip.copy(full_text)
st.success("클립보드에 복사되었습니다!")
return full_text
# Streamlit 인터페이스 설정
colored_header(
label="📜 초등학생을 위한 읽기 자료 생성기",
description="주제를 입력하면 초등학생이 이해하기 쉬운 읽기 자료를 만들어줍니다.",
color_name="red-70",
)
add_vertical_space(1)
with st.sidebar:
st.header("옵션 설정")
grade = st.selectbox("학년", [f"초등학교 {i}학년" for i in range(1, 7)]) # 드롭다운 수정
num_paragraphs = st.number_input("문단 수", min_value=1, value=3)
sentences_per_paragraph = st.number_input("문단 당 문장 수", min_value=1, value=3) # 드롭다운 수정
structure = st.selectbox("설명문 구조", ["정의와 예시", "비교와 대조", "분류", "분석", "인과", "순서"], index=0)
topic = st.text_area("✏️ 주제 및 내용을 입력하세요 ", height=200)
generate_button = st.button("읽기 자료 생성")
# 출력 영역을 함수 외부에 정의
output_area = st.empty()
if generate_button:
generate_text(grade, num_paragraphs, sentences_per_paragraph, structure, topic) |