from annotated_text import annotated_text
import streamlit as st
import openai
import os
# OpenAI API 설정 (환경 변수에서 읽어옴)
openai.api_key = os.getenv("OPENAI_API_KEY") # 실제 코드에서 주석 해제
st.set_page_config(layout="wide")
## 포인트 부분 추가
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(col):
st.header("지문")
global text_container
text_container = st.container() # 추가된 코드
# 미리 공간 확보
global text_placeholder
text_placeholder = text_container.empty()
global user_text
user_text = """민주주의 사회는 국민이 정치에 참여할 권리를 보장한다. 그러한 권리를 참정권이라 하는데, 이는 기본적으로 ‘선거’로 실현된다. 선거는 사회 집단의 대표자나 공직자를 선출하여 그들에게 대표성을 부여하는 행위이다. 그러므로 높은 투표율은 민주주의의 정당성 확보와 깊은 관련이 있다.
선거 투표 제도에는 투표권 행사를 투표자의 자유의사에 맡기는 ‘자유 투표제’와 투표권 행사를 국민의 의무로 간주하고 정당한 사유 없이 기권하면 법적 제재를 가하는 ‘의무 투표제’가 있다. 우리나라는 자유 투표제를 채택하고 있는데, 최근 치른 선거의 평균 투표율이 50퍼센트대로 나타났다. 경제 개발 협력 기구(OECD) 회원국 평균이 70퍼센트대인 것을 생각하면 매우 낮은 수치라 할 수 있다. 이러한 상황이 지속되자 의무 투표제를 도입해야 한다는 의견이 제시되었고, 자유 투표제가 민주주의의 원칙에 맞으므로 이를 유지해야 한다는 의견과 대립하고 있다.
의무 투표제를 도입하자는 측은 낮은 투표율로 투표 결과의 정당성을 확보하지 못하는 문제가 매우 심각하다고 주장한다. 또 의무 투표제의 강제성과 법적 제재가 투표율을 높이므로 투표율이 낮아서 발생하는 문제를 해결할 수 있다고 본다. 그리고 국민 대부분이 투표에 참여하게 되면 정치인들이 모든 계층의 지지를 받기 위해 정책 경쟁력을 높이려 할 것이므로 정치 소외 계층에 더욱 관심을 쏟는 효과가 있을 것이라고 이야기한다.
반면 의무 투표제에 반대하는 측은 현재 우리나라의 투표율이 정치 지도자들의 대표성을 훼손할 만큼 심각한 상황은 아니라고 주장한다. 또 투표율을 높이는 것보다 국민의 신뢰를 회복하는 것이 더 중요하고, 시민 교육이나 모의 투표 교육 프로그램으로도 투표율 상승을 기대할 수 있다며 의무 투표제의 도입만이 투표율이나 정치적 관심을 높이는 해결 방안은 아니라고 이야기한다. 그리고 의무 투표제를 도입하면, 선출된 정치인들이 높은 투표율을 핑계로 안하무인의 태도를 갖는 부작용이 생긴다든가 후보자를 잘 모르는 상태에서 투표하는 일이 발생하여 국민의 뜻이 오히려 왜곡될 수 있다며 우려의 목소리를 내고 있다.
"""
text_placeholder.write(user_text, unsafe_allow_html=True)
#선언한 변수 다른 함수에서 사용가능하게 하기 위해 return
return text_placeholder, text_container, user_text
def display_summary(col):
st.header("요약 결과")
global user_summary
user_summary = st.text_area("요약결과를 제출하세요.")
cols = st.columns(2)
with cols[0]:
btn_submit = st.button("제출")
if btn_submit:
#구글 드라이브 api 이용하여 업로드
st.write("제출 되었습니다.")
pass
with cols[1]:
btn_score = st.button("채점하기")
if btn_score and st.session_state.points > 0: # 포인트 체크
update_points(1) # 포인트 증가
st.session_state.history.append(["채점하기", -1, st.session_state.points])
#루브릭에 의한 채점
lubric = """채점 기준 상: 문장의 주제를 파악하고, 주요 내용을 파악할 수 있다. 중: 문장의 주제를 파악할 수 있다. 하: 문장의 주제를 파악할 수 없다."""
#루브릭 기준을 이용해서 입력칸에 입력한 내용을 채점하는 영어로 프롬프트
explanation_task = f"{lubric}을 기준으로 {user_summary}의 내용을 채점해주세요. 채점 기준은 공개하지 말고 상, 중,하로 나누고 간단한 이유를 알려주세요."
messages = [
{"role": "system", "content": "You are a helpful assistant. use only korean"},
{"role": "user", "content": explanation_task}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-16k",
messages=messages,
temperature=0.1,
max_tokens=2500
)
explanation = response['choices'][0]['message']['content']
st.write(f"채점 하기: {explanation}")
pass
else:
if st.session_state.points == 0:
#포인트가 없어서 사용할수 없다는 문구 추가
st.write("포인트가 없어서 채점하기를 할 수 없습니다.")
pass
def display_input_btns(col):
st.header("인공지능 사용하기")
global user_input
user_input = st.text_area("내용을 넣고 버튼을 눌러주세요:", "추가 설명이 필요하거나 다시 쓰고 싶은 내용을 입력하세요.")
# 버튼 row
cols = st.columns(4)
with cols[0]:
btn_keyword = st.button("키워드 찾기")
if btn_keyword and st.session_state.points > 0: # 포인트 체크
update_points(-1) # 포인트 감소
st.session_state.history.append(["키워드 찾기", -1, st.session_state.points])
#다른 지문 넣기
highlighted_text = """**민주주의 사회**는 국민이 정치에 참여할 권리를 보장한다. 그러한 권리를 **참정권**이라 하는데, 이는 기본적으로 ‘선거’로 실현된다. 선거는 사회 집단의 대표자나 공직자를 선출하여 그들에게 대표성을 부여하는 행위이다. 그러므로 **높은 투표율**은 민주주의의 **정당성 확보**와 깊은 관련이 있다.
**선거 투표 제도**에는 투표권 행사를 투표자의 자유의사에 맡기는 ‘**자유 투표제**’와 투표권 행사를 국민의 의무로 간주하고 정당한 사유 없이 기권하면 법적 제재를 가하는 ‘**의무 투표제**’가 있다. 우리나라는 자유 투표제를 채택하고 있는데, 최근 치른 선거의 평균 투표율이 50퍼센트대로 나타났다. 경제 개발 협력 기구(**OECD**) 회원국 평균이 70퍼센트대인 것을 생각하면 매우 낮은 수치라 할 수 있다. 이러한 상황이 지속되자 의무 투표제를 도입해야 한다는 의견이 제시되었고, 자유 투표제가 민주주의의 원칙에 맞으므로 이를 유지해야 한다는 의견과 대립하고 있다.
**의무 투표제를 도입하자는 측**은 낮은 투표율로 투표 결과의 **정당성을 확보**하지 못하는 문제가 매우 심각하다고 주장한다. 또 의무 투표제의 강제성과 법적 제재가 투표율을 높이므로 투표율이 낮아서 발생하는 문제를 해결할 수 있다고 본다. 그리고 국민 대부분이 투표에 참여하게 되면 정치인들이 모든 계층의 지지를 받기 위해 정책 경쟁력을 높이려 할 것이므로 **정치 소외 계층**에 더욱 관심을 쏟는 효과가 있을 것이라고 이야기한다.
반면 **의무 투표제에 반대하는 측**은 현재 우리나라의 투표율이 정치 지도자들의 대표성을 훼손할 만큼 심각한 상황은 아니라고 주장한다. 또 투표율을 높이는 것보다 **국민의 신뢰를 회복**하는 것이 더 중요하고, 시민 교육이나 모의 투표 교육 프로그램으로도 투표율 상승을 기대할 수 있다며 의무 투표제의 도입만이 투표율이나 정치적 관심을 높이는 해결 방안은 아니라고 이야기한다. 그리고 의무 투표제를 도입하면, 선출된 정치인들이 높은 투표율을 핑계로 **안하무인의 태도**를 갖는 부작용이 생긴다든가 후보자를 잘 모르는 상태에서 투표하는 일이 발생하여 **국민의 뜻이 오히려 왜곡**될 수 있다며 우려의 목소리를 내고 있다.
"""
# highlighted_text = annotated_text(
# ("민주주의 사회", ""), "는 국민이 정치에 참여할 권리를 보장한다. 그러한 권리를 ", ("참정권", ""), "이라 하는데, 이는 기본적으로 ‘선거’로 실현된다. 선거는 사회 집단의 대표자나 공직자를 선출하여 그들에게 대표성을 부여하는 행위이다. 그러므로 ", ("높은 투표율", ""), "은 민주주의의 ", ("정당성 확보", ""), "와 깊은 관련이 있다.\n\n", ("선거 투표 제도", ""), "에는 투표권 행사를 투표자의 자유의사에 맡기는 ‘", ("자유 투표제", ""), "’와 투표권 행사를 국민의 의무로 간주하고 정당한 사유 없이 기권하면 법적 제재를 가하는 ‘", ("의무 투표제", ""), "’가 있다. 우리나라는 자유 투표제를 채택하고 있는데, 최근 치른 선거의 평균 투표율이 50퍼센트대로 나타났다. 경제 개발 협력 기구(", ("OECD", ""), ") 회원국 평균이 70퍼센트대인 것을 생각하면 매우 낮은 수치라 할 수 있다. 이러한 상황이 지속되자 의무 투표제를 도입해야 한다는 의견이 제시되었고, 자유 투표제가 민주주의의 원칙에 맞으므로 이를 유지해야 한다는 의견과 대립하고 있다.\n\n", ("의무 투표제를 도입하자는 측", ""), "은 낮은 투표율로 투표 결과의 ", ("정당성을 확보", ""), "하지 못하는 문제가 매우 심각하다고 주장한다. 또 의무 투표제의 강제성과 법적 제재가 투표율을 높이므로 투표율이 낮아서 발생하는 문제를 해결할 수 있다고 본다. 그리고 국민 대부분이 투표에 참여하게 되면 정치인들이 모든 계층의 지지를 받기 위해 정책 경쟁력을 높이려 할 것이므로 ", ("정치 소외 계층", ""), "에 더욱 관심을 쏟는 효과가 있을 것이라고 이야기한다.\n\n반면 ", ("의무 투표제에 반대하는 측", ""), "은 현재 우리나라의 투표율이 정치 지도자들의 대표성을 훼손할 만큼 심각한 상황은 아니라고 주장한다. 또 투표율을 높이는 것보다 ", ("국민의 신뢰를 회복", ""), "하는 것이 더 중요하고, 시민 교육이나 모의 투표 교육 프로그램으로도 투표율 상승을 기대할 수 있다며 의무 투표제의 도입만이 투표율이나 정치적 관심을 높이는 해결 방안은 아니라고 이야기한다. 그리고 의무 투표제를 도입하면, 선출된 정치인들이 높은 투표율을 핑계로 ", ("안하무인의 태도", ""), "를 갖는 부작용이 생긴다든가 후보자를 잘 모르는 상태에서 투표하는 일이 발생하여 ", ("국민의 뜻이 오히려 왜곡", ""), "될 수 있다며 우려의 목소리를 내고 있다."
# )
# 기존 지문 지우기
text_placeholder.empty()
#text_container에 highlight된 텍스트를 출력
with text_container:
st.markdown(highlighted_text, unsafe_allow_html=True)
else:
if st.session_state.points == 0:
#포인트가 없어서 사용할수 없다는 문구 추가
st.write("포인트가 없어서 키워드를 찾을 수 없습니다.")
pass
with cols[1]:
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])
with cols[2]:
global btn_simple
btn_simple = st.button("쉬운 표현")
if btn_simple and st.session_state.points > 0: # 포인트 체크
update_points(-1) # 포인트 감소
st.session_state.history.append(["쉬운 표현", -1, st.session_state.points])
with cols[3]:
global btn_rewrite
btn_rewrite = st.button("다시 쓰기")
if btn_rewrite and st.session_state.points > 0: # 포인트 체크
update_points(-1) # 포인트 감소
st.session_state.history.append(["다시 쓰기", -1, st.session_state.points])
return btn_keyword, btn_explanation, btn_simple, btn_rewrite
def display_output():
with st.container():
st.header("결과")
if btn_explanation and st.session_state.points > 0:
explanation_task = f"Explain the term '{user_input}' in a simple manner, based on the context of the following passage: {user_text}"
messages = [
{"role": "system", "content": "You are a helpful assistant that explains complex topics in a way that an elementary school student can understand. use only korean"},
{"role": "user", "content": explanation_task}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-16k",
messages=messages,
temperature=0.1,
max_tokens=200
)
explanation = response['choices'][0]['message']['content']
# 추가 설명
st.write(f"추가 설명: {explanation}")
pass
else:
if st.session_state.points == 0:
#포인트가 없어서 사용할수 없다는 문구 추가
st.write("포인트가 없어서 추가 설명 기능을 사용할 수 없습니다.")
pass
if btn_simple and st.session_state.points > 0:
explanation_task = f"Describe the fingerprint of '{user_text}' in a way that an elementary school student could understand."
messages = [
{"role": "system", "content": "You are a helpful assistant that explains complex topics in a way that an elementary school student can understand. use only korean"},
{"role": "user", "content": explanation_task}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-16k",
messages=messages,
temperature=0.11,
max_tokens=2500
)
explanation = response['choices'][0]['message']['content']
# 쉬운 표현으로 결과 출력
st.write(f"쉬운 글: {explanation}")
pass
else:
if st.session_state.points == 0:
st.write("포인트가 없어서 쉬운 표현 기능을 사용할 수 없습니다.")
pass
if btn_rewrite and st.session_state.points > 0:
explanation_task = f"Rewrite the contents of '{user_input}' so that it will pass the writing test."
messages = [
{"role": "system", "content": "You are a helpful assistant. use only korean"},
{"role": "user", "content": explanation_task}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-16k",
messages=messages,
temperature=0.1,
max_tokens=2500
)
explanation = response['choices'][0]['message']['content']
st.write(f"다시 쓰기: {explanation}")
pass
else:
if st.session_state.points == 0:
st.write("포인트가 없어서 다시 쓰기 기능을 사용할 수 없습니다.")
pass
def main():
st.title("HCI TextMinder")
#포인트 시스템 설명 추가
st.sidebar.markdown("포인트는 3점부터 시작해서, **키워드 찾기**, **쉬운 표현**, **다시 쓰기**를 할 때 1점씩 감소합니다. **추가 설명**과 **채점하기**를 할 때 1점씩 증가합니다. 포인트가 0점이 되면 더 이상 작업을 할 수 없습니다. ")
col1, col2 = st.columns(2)
with col1:
display_passage(col1)
display_summary(col1)
with col2:
btn_keyword, btn_explanation, btn_simple, btn_rewrite = display_input_btns(col2)
display_output()
#포인트 표시
display_points()
#포인트 변화 표시
display_markdown_table()
if __name__ == "__main__":
main()