from annotated_text import annotated_text import ast import streamlit as st import openai import os import sys from gpt_based_function import gpt_summary_generator, gpt_keyword_highlighter, gpt_text_naturalizer, gpt_explanation_generator, gpt_easier_text_generator, gpt_rater import concurrent.futures from tqdm import tqdm # current_path = '/Users/kintch/PycharmProjects/jungu_sgi/summary_with_gpt' # os.chdir(current_path) # sys.path.append(current_path) openai.api_key = os.getenv("OPENAI_API_KEY") st.set_page_config(layout="wide") user_text = """민주주의 사회는 국민이 정치에 참여할 권리를 보장한다. 그러한 권리를 참정권이라 하는데, 이는 기본적으로 ‘선거’로 실현된다. 선거는 사회 집단의 대표자나 공직자를 선출하여 그들에게 대표성을 부여하는 행위이다. 그러므로 높은 투표율은 민주주의의 정당성 확보와 깊은 관련이 있다. 선거 투표 제도에는 투표권 행사를 투표자의 자유의사에 맡기는 ‘자유 투표제’와 투표권 행사를 국민의 의무로 간주하고 정당한 사유 없이 기권하면 법적 제재를 가하는 ‘의무 투표제’가 있다. 우리나라는 자유 투표제를 채택하고 있는데, 최근 치른 선거의 평균 투표율이 50퍼센트대로 나타났다. 경제 개발 협력 기구(OECD) 회원국 평균이 70퍼센트대인 것을 생각하면 매우 낮은 수치라 할 수 있다. 이러한 상황이 지속되자 의무 투표제를 도입해야 한다는 의견이 제시되었고, 자유 투표제가 민주주의의 원칙에 맞으므로 이를 유지해야 한다는 의견과 대립하고 있다. 의무 투표제를 도입하자는 측은 낮은 투표율로 투표 결과의 정당성을 확보하지 못하는 문제가 매우 심각하다고 주장한다. 또 의무 투표제의 강제성과 법적 제재가 투표율을 높이므로 투표율이 낮아서 발생하는 문제를 해결할 수 있다고 본다. 그리고 국민 대부분이 투표에 참여하게 되면 정치인들이 모든 계층의 지지를 받기 위해 정책 경쟁력을 높이려 할 것이므로 정치 소외 계층에 더욱 관심을 쏟는 효과가 있을 것이라고 이야기한다. 반면 의무 투표제에 반대하는 측은 현재 우리나라의 투표율이 정치 지도자들의 대표성을 훼손할 만큼 심각한 상황은 아니라고 주장한다. 또 투표율을 높이는 것보다 국민의 신뢰를 회복하는 것이 더 중요하고, 시민 교육이나 모의 투표 교육 프로그램으로도 투표율 상승을 기대할 수 있다며 의무 투표제의 도입만이 투표율이나 정치적 관심을 높이는 해결 방안은 아니라고 이야기한다. 그리고 의무 투표제를 도입하면, 선출된 정치인들이 높은 투표율을 핑계로 안하무인의 태도를 갖는 부작용이 생긴다든가 후보자를 잘 모르는 상태에서 투표하는 일이 발생하여 국민의 뜻이 오히려 왜곡될 수 있다며 우려의 목소리를 내고 있다.""" # gpt_summary = gpt_summary_generator(user_text) user_text_paragraphs = user_text.split("\n") #문단별로 쪼개기 is_easier_button_pressed = [False]*len(user_text_paragraphs) def run(list_sum): with concurrent.futures.ThreadPoolExecutor() as executor: results = list(tqdm(executor.map(gpt_keyword_highlighter, list_sum), total=len(list_sum))) return results # SHOUD BE 활성화 # highlighted_texts_list = run(user_text_paragraphs) ## 포인트 부분 추가 if 'points' not in st.session_state: st.session_state.points = 3 if 'history' not in st.session_state: st.session_state.history = [] def update_points(value): """ 포인트 업데이트 """ st.session_state.points += value # display_points() # 포인트를 실시간으로 업데이트 하기 위해 def display_points(): """ 포인트 표시 """ st.sidebar.header(f"Current Points: {st.session_state.points}") def display_markdown_table(): """지금까지 사용한 기능과 포인트를 표시하는 히스토리 함수, 기능을 누른 순서와 포인트 변화와 현재 포인트를 표로 정리""" markdown_table = """| 순서 | 선택한 기능 | 포인트 변화 | 현재 포인트 | | --- | --- | --- | --- | """ for i, step in enumerate(st.session_state.history): markdown_table += f"| {i+1} | {step[0]} | {step[1]} | {step[2]} |\n" st.sidebar.markdown(markdown_table) ##기능을 함수로 나누어서 구현 col, _ = st.columns(2) def display_passage(user_text): # st.header("지문") global text_container text_container = st.container() # 추가된 코드 # 미리 공간 확보 global text_placeholder text_placeholder = text_container.empty() text_placeholder.write(user_text, unsafe_allow_html=True) #선언한 변수 다른 함수에서 사용가능하게 하기 위해 return return text_placeholder, text_container, user_text def display_preset_func_btns(col): # st.header("인공지능 사용하기") # 버튼 row cols = st.columns(2) with cols[0]: btn_gpt_keyword_func = st.button("키워드 찾아줘") if btn_gpt_keyword_func and st.session_state.points > 0: # 포인트 체크 update_points(-1) # 포인트 감소 st.session_state.history.append(["키워드 찾아줘", -1, st.session_state.points]) global is_easier_button_pressed is_easier_button_pressed = [True]*len(user_text_paragraphs) # 다른 로직 고려 #다른 지문 넣기 # global highlighted_texts_list # highlighted_text = highlighted_texts_list[-1] # # # 기존 지문 지우기 # text_placeholder.empty() # # #text_container에 highlight된 텍스트를 출력 # with text_container: # exec(highlighted_text) # st.markdown(highlighted_text, unsafe_allow_html=True) else: if st.session_state.points == 0: #포인트가 없어서 사용할수 없다는 문구 추가 st.write("포인트가 없어서 키워드를 찾을 수 없습니다.") pass with cols[1]: global btn_gpt_easier_text_func btn_gpt_easier_text_func = st.button("쉽게 다시 알려줘") if btn_gpt_easier_text_func and st.session_state.points > 0: # 포인트 체크 update_points(-1) # 포인트 감소 st.session_state.history.append(["쉽게 다시 알려줘", -1, st.session_state.points]) # return btn_gpt_keyword_func, btn_gpt_easier_text_func def display_users_summarization(col): # st.header("요약 결과") global user_summary user_summary = st.text_area("한 문단씩 읽고 전체 글을 요약해보세요.", key='user_summary') cols = st.columns(2) with cols[0]: global btn_gpt_naturalize_func btn_gpt_naturalize_func = st.button("글 다듬기") if btn_gpt_naturalize_func and st.session_state.points > 0: # 포인트 체크 update_points(-1) # 포인트 감소 st.session_state.history.append(["글 다듬기", -1, st.session_state.points]) with cols[1]: btn_gpt_rating_func = st.button("채점하기") if btn_gpt_rating_func and st.session_state.points > 0: # 포인트 체크 update_points(1) # 포인트 증가 st.session_state.history.append(["채점하기", +1, st.session_state.points]) #fix from -1 to +1 gpt_rated_result = gpt_rater(user_summary) st.write(f"채점하기: {gpt_rated_result}") # https://discuss.streamlit.io/t/streamlit-button-disable-enable/31293 # 버튼 비활성화 관련 참고 (아직은 안됨) pass else: if st.session_state.points == 0: # 포인트가 없어서 사용할수 없다는 문구 추가 st.write("포인트가 없어서 채점하기를 할 수 없습니다.") pass if btn_gpt_naturalize_func and st.session_state.points > 0: naturalized_text = gpt_text_naturalizer(user_summary) # 다시쓰기 함수 st.write(f"글 다듬기: {naturalized_text}") pass else: if st.session_state.points == 0: st.write("포인트가 없어서 글 다듬기 기능을 사용할 수 없습니다.") pass btn_submit_summarized_text = st.button("제출하기") if btn_submit_summarized_text: # 구글 드라이브 api 이용하여 업로드 st.write("제출 되었습니다.") pass def display_qna_with_gpt(): with st.container(): cols = st.columns(2) # st.header("결과") with cols[0]: global btn_explanation btn_explanation = st.button("추가 설명") if btn_explanation and st.session_state.points > 0: # 포인트 체크 update_points(1) # 포인트 증가 st.session_state.history.append(["추가 설명", 1, st.session_state.points]) user_input = st.text_area("추가 설명이 필요하거나 다시 쓰고 싶은 내용을 입력하세요.", key='user_input') if btn_explanation and st.session_state.points > 0: explanation = gpt_explanation_generator(user_input, user_text) # 추가 설명 st.write(f"추가 설명: {explanation}") pass else: if st.session_state.points == 0: #포인트가 없어서 사용할수 없다는 문구 추가 st.write("포인트가 없어서 추가 설명 기능을 사용할 수 없습니다.") pass if btn_gpt_easier_text_func and st.session_state.points > 0: easier_text = gpt_easier_text_generator(user_input) # 쉽게 다시 알려줘으로 결과 출력 st.write(f"쉬운 글: {easier_text}") pass else: if st.session_state.points == 0: st.write("포인트가 없어서 쉽게 다시 알려줘 기능을 사용할 수 없습니다.") pass def main(): st.title("챗GPT와 함께 요약하기") #포인트 시스템 설명 추가 st.sidebar.markdown("포인트는 3점부터 시작해서, **키워드 찾아줘**, **쉽게 다시 알려줘**, **글 다듬기**를 할 때 1점씩 감소합니다. **추가 설명**과 **채점하기**를 할 때 1점씩 증가합니다. 포인트가 0점이 되면 더 이상 작업을 할 수 없습니다. ") # col1, col2 = st.columns(2) display_preset_func_btns(col) # Paragraph Tabs paragraph_tab1, paragraph_tab2, paragraph_tab3, paragraph_tab4 = st.tabs(["단락1", "단락2", "단락3", "단락4"]) with paragraph_tab1: if is_easier_button_pressed[0]: text = ast.literal_eval(highlighted_texts_list[0][15:-1]) annotated_text(*text) #exec 대신 인자로 바로 전달 else: display_passage(user_text_paragraphs[0]) with paragraph_tab2: display_passage(user_text_paragraphs[1]) with paragraph_tab3: display_passage(user_text_paragraphs[2]) with paragraph_tab4: display_passage(user_text_paragraphs[3]) # User Input Tabs user_input_tab1, user_input_tab2 = st.tabs(["요약하기", "챗GPT에게 질문하기"]) with user_input_tab1: display_users_summarization(col) with user_input_tab2: display_qna_with_gpt() #포인트 표시 display_points() #포인트 변화 표시 display_markdown_table() if __name__ == "__main__": main()