import streamlit as st import openai import json import os import record_examples as data # OpenAI API 설정 (환경 변수에서 읽어옴) openai.api_key = os.getenv("OPENAI_API_KEY") #gpt이용해서 추론함수 만들기 def generate_annotated_text(text): response = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=[ { "role": "system", "content": "사용자의 입력은 학생의 창의적 체험활동에 대한 누가기록입니다. 이 누가기록을 바탕으로 학생의 개별적 특성과 성취를 강조하는 특기사항 기록을 생성하십시오. 사용자 입력을 특기사항으로 변환할 때, 반드시 문장의 끝은 '~임', '~함', '~음'과 같이 종결형 어미로 마무리합니다. 다음 입력과 출력 예제를 참고하세요. 예제: 입력: 누가기록1: '과학 실험 대회에 참여함', 누가기록2: '실험에서 독창적인 접근 방식을 사용함' 출력: '과학 실험 대회에 적극적으로 참여함. 실험에서 독창적인 접근 방식을 사용하며 문제 해결 능력을 보임. 실험 과정에서의 창의성과 주도적인 태도가 인상적임. 과학에 대한 깊은 이해와 호기심을 바탕으로 실험에 기여함.'" }, { "role": "user", "content": text } ], temperature=1, max_tokens=10000, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response['choices'][0]['message']['content'] # 유사한 문장 생성 함수 def generate_similar_sentences(base_sentence): response = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=[ { "role": "system", "content": f"다음은 '{base_sentence}'와 유사한 학생 특기사항 예시 문항 10개를 만들어주세요. 문장의 끝은 '~임,~함,~음'과 같이 종결형 어미로 마무리합니다." }, { "role": "user", "content": base_sentence } ], temperature=0.7, max_tokens=10000, top_p=1, frequency_penalty=0, presence_penalty=0 ) generated_sentences = response.choices[0].message['content'].split('\n') return [sentence.strip() for sentence in generated_sentences if sentence.strip()] # Streamlit 앱의 제목 및 설명 st.title("누가기록 기반 창체 특기사항 생성") st.write("창체 누가기록을 입력하시면, 해당 누가기록에 기반한 창체 특기사항 문구를 제안합니다.") # 창의적 체험활동 데이터 가져오기 creative_activities = data.creative_activities # 창의적 체험활동 영역 드롭다운 activity_area = st.selectbox("창의적 체험활동 영역을 선택하세요:", list(creative_activities.keys())) # 선택된 영역에 따른 누가기록 목록 selected_records = creative_activities[activity_area] selected_record = st.multiselect("누가기록을 선택하세요:", selected_records, default=[]) # 선택된 누가기록 연결 concatenated_record = ", ".join(selected_record) st.text_area("선택된 누가기록:", concatenated_record, height=100) # 세션 상태 초기화 if 'generated_result' not in st.session_state: st.session_state.generated_result = None if 'selected_sentence' not in st.session_state: st.session_state.selected_sentence = None if 'similar_sentences' not in st.session_state: st.session_state.similar_sentences = [] # "평가 생성" 버튼 클릭 시의 동작 if st.button("문구 생성"): with st.spinner('답변 생성중...'): result = generate_annotated_text(concatenated_record) st.session_state.generated_result = result st.session_state.selected_sentence = None # 새로운 평가 생성시 선택된 문장 초기화 st.session_state.similar_sentences = [] # 이전 유사한 문장들 초기화 # 셀렉트 박스 및 유사한 문장 생성 버튼 추가 if st.session_state.generated_result: sentences = st.session_state.generated_result.split('\n') if sentences: selected_sentence = st.selectbox("문장을 선택하세요:", sentences, key="sentence_select") st.session_state.selected_sentence = selected_sentence # 유사한 문장 생성 버튼 if st.button("유사한 문구 생성") and st.session_state.selected_sentence: with st.spinner('문장 생성중...'): st.session_state.similar_sentences = generate_similar_sentences(st.session_state.selected_sentence) # 유사한 문장들 출력 for sentence in st.session_state.similar_sentences: st.write(sentence)