import streamlit as st import pandas as pd import openai import os import instructions # OpenAI API 설정 openai.api_key = os.getenv("OPENAI_API_KEY") st.set_page_config(layout="wide") # 파일 업로드 및 데이터 처리 함수 def upload_and_process_file(): uploaded_file = st.file_uploader("이전 생활기록부 파일 업로드", type=['csv', 'json']) if uploaded_file is not None: if uploaded_file.type == 'text/csv': data = pd.read_csv(uploaded_file) elif uploaded_file.type == 'application/json': data = pd.read_json(uploaded_file) return data return None # 생활기록부 문구 생성 함수 def generate_living_record(data, selected_instruction, subjects=None, major=None): data_str = str(data) if selected_instruction == "중·고등학교" and subjects and major: # 선택된 교과목들을 문자열로 변환 subjects_str = ", ".join(subjects) # instruction 문자열 포매팅 instruction_text = instructions.highschool_instruction.format( subjects=subjects_str, major=major ) else: 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("기록 자료가 담긴 CSV파일 업로드, 직접 기록을 입력, 키워드를 선택하여 생활기록부 작성에 필요한 관찰 결과를 제공할 수 있습니다.") 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("희망전공") uploaded_data = upload_and_process_file() # 나머지 코드는 동일하게 유지... attitude_keywords = [ "집중력", "과제 이해", "발표", "문제 해결력", "과제 수행", "관찰력", "탐구력", "자기 생각 표현", "논리적 사고력", "운동신경", "협동심", "리더쉽", "논리적 비판력", "교과 학습 성취도", "목표의식", "기본 학습", "도전 과제", "미적 감각", "예술적 재능", "음악적 재능", "호기심", "질문", "모둠활동" ] relationship_keywords = [ "협동성", "친절함", "공감 능력", "커뮤니케이션", "리더십", "경쟁", "협력", "인정욕구", "의사소통 문제", "신뢰", "상호존중", "공유", "이해심", "친밀함", "지지함", "도움", "배려", "거부", "비밀", "자기중심적", "외로움", "비난", "무관심", "질투", "갈등", "교류 활발함", "소통 잘함", "다정함" ] personality_keywords = [ "자신감", "책임감", "포용력", "긍정적 태도", "유연성", "감수성", "예민함", "활발함", "차분함", "적극적", "소극적", "수줍음", "겸손함", "자신감", "의욕적", "무기력", "성실", "섬세함", "산만함", "조급함", "거칠다", "긍정적", "친절함", "분노", "인내심", "독립적", "상처", "온화함", "따뜻함", "미소", "재치", "유머", "억울함", "우울함", "부정적" ] # 컬럼 생성 col1, col2 = st.columns(2) with col1: for i in range(5): record_key = f"record_{i}" if uploaded_data is not None and i < len(uploaded_data): data_value = uploaded_data.iloc[i, 0] if pd.isna(data_value): st.session_state[record_key] = "" else: st.session_state[record_key] = str(data_value) elif 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) # 생성된 결과를 세션 상태에 저장 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}")