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): data_str = str(data) response = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=[ {"role": "system", "content": instructions.instruction }, {"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는 실수 할 수 있습니다. 원하는 결과가 나오지 않는다면 생성 버튼을 다시 눌러보세요.") # 파일 업로드 기능 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] = "" # 위젯 생성 for i in range(5): record_key = f"record_{i}" with st.expander(f"입력창 {i+1}", expanded=False): st.text_area("생활기록부 내용 입력", key=record_key, height=150, value=st.session_state[record_key]) 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) st.write("생성된 생활기록부:", generated_record)