import streamlit as st import openai import os import instructions # OpenAI API 설정 openai.api_key = os.getenv("OPENAI_API_KEY") st.set_page_config(layout="wide") def generate_living_record(data, school_level, subjects=None, major=None): if school_level == "중·고등학교": data_str = f"교과목: {', '.join(subjects) if subjects else ''}\n" data_str += f"희망전공: {major if major else ''}\n\n" data_str += data instruction_text = instructions.highschool_instruction else: data_str = data instruction_text = instructions.instruction response = openai.ChatCompletion.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": instruction_text}, {"role": "user", "content": data_str} ], temperature=0.7, max_tokens=10000, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response.choices[0].message.content # Streamlit 앱 구성 st.title("생활기록부 생성 서비스") st.write("직접 기록을 입력하거나 키워드를 선택하여 생활기록부 작성에 필요한 관찰 결과를 제공할 수 있습니다.") st.write("GPT는 실수 할 수 있습니다. 원하는 결과가 나오지 않는다면 생성 버튼을 다시 눌러보세요.") # 학교급 선택 school_level = st.radio("학교급 선택", ["초등학교", "중·고등학교"]) # 중·고등학교 선택 시 추가 입력 필드 subjects = None major = None if school_level == "중·고등학교": subject_options = ["국어", "수학", "영어", "사회", "과학", "음악", "미술", "체육", "정보", "기술가정", "제2외국어", "한문"] subjects = st.multiselect("교과목 선택", subject_options) major = st.text_input("희망전공") # 키워드 목록 attitude_keywords = [ "집중력", "과제 이해", "발표", "문제 해결력", "과제 수행", "관찰력", "탐구력", "자기 생각 표현", "논리적 사고력", "운동신경", "협동심", "리더쉽", "논리적 비판력", "교과 학습 성취도", "목표의식", "기본 학습", "도전 과제", "미적 감각", "예술적 재능", "음악적 재능", "호기심", "질문", "모둠활동" ] relationship_keywords = [ "협동성", "친절함", "공감 능력", "커뮤니케이션", "리더십", "경쟁", "협력", "인정욕구", "의사소통 문제", "신뢰", "상호존중", "공유", "이해심", "친밀함", "지지함", "도움", "배려", "거부", "비밀", "자기중심적", "외로움", "비난", "무관심", "질투", "갈등", "교류 활발함", "소통 잘함", "다정함" ] personality_keywords = [ "자신감", "책임감", "포용력", "긍정적 태도", "유연성", "감수성", "예민함", "활발함", "차분함", "적극적", "소극적", "수줍음", "겸손함", "의욕적", "무기력", "성실", "섬세함", "산만함", "조급함", "거칠다", "긍정적", "친절함", "분노", "인내심", "독립적", "상처", "온화함", "따뜻함", "미소", "재치", "유머", "억울함", "우울함", "부정적" ] # 컬럼 생성 col1, col2 = st.columns(2) with col1: for i in range(5): record_key = f"record_{i}" if record_key not in st.session_state: st.session_state[record_key] = "" with st.expander(f"입력창 {i+1}", expanded=False): user_input = st.text_area("생활기록부 내용 입력", key=record_key, height=150, value=st.session_state[record_key]) current_bytes = len(user_input.encode('utf-8')) st.caption(f"현재 입력창 바이트 수: {current_bytes}") with col2: st.write("키워드 선택") selected_attitude = st.multiselect("학습태도", attitude_keywords) selected_relationship = st.multiselect("교우관계", relationship_keywords) selected_personality = st.multiselect("성격", personality_keywords) if st.button("생성"): with st.spinner('생성중...'): input_data = "\n".join([st.session_state[f'record_{i}'] for i in range(5) if st.session_state[f'record_{i}']]) keyword_data = " ".join(selected_attitude + selected_relationship + selected_personality) full_data = input_data + "\n" + keyword_data generated_record = generate_living_record(full_data, school_level, subjects, major) st.session_state["generated_result"] = generated_record result_text = st.text_area("생성된 결과", key="generated_result", value=st.session_state.get("generated_result", ""), height=500) if "generated_result" in st.session_state: result_bytes = len(st.session_state["generated_result"].encode('utf-8')) st.caption(f"생성된 결과 바이트 수: {result_bytes}")