Spaces:
Runtime error
Runtime error
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") | |
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) | |
#์ ์ธํ ๋ณ์ ๋ค๋ฅธ ํจ์์์ ์ฌ์ฉ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด 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: | |
#๋ฃจ๋ธ๋ฆญ์ ์ํ ์ฑ์ | |
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}") | |
def display_input_btns(col): | |
st.header("์ธ๊ณต์ง๋ฅ ์ฌ์ฉํ๊ธฐ") | |
global user_input | |
user_input = st.text_area("๋ด์ฉ์ ๋ฃ๊ณ ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์:", "") | |
st.write(user_input) | |
# ๋ฒํผ row | |
cols = st.columns(4) | |
with cols[0]: | |
btn_keyword = st.button("ํค์๋ ์ฐพ๊ธฐ") | |
if btn_keyword: | |
# ํค์๋ ์ฐพ๊ธฐ ๋ก์ง | |
task_description ="""You are a useful helper that generates annotated text for Python's st-annotated-text library. Your task is to identify the topic of the passage and highlight the key words needed to convey the meaning. You should be able to identify the main points. Also, please mark keywords based on the different paragraphs and headings provided in the text. The output should be formatted in the following way: | |
annotated_text( | |
"This ", | |
("is", ""), | |
" some ", | |
("annotated", ""), | |
("text", ""), | |
" for those of ", | |
("you", ""), | |
" who ", | |
("like", ""), | |
" this sort of ", | |
("thing", ""), | |
". " | |
)""" | |
user_prompt = f"First, extract key words for the topic st-annotated-text format.: {user_text}" | |
messages = [{"role": "system", "content": task_description}, {"role": "user", "content": user_prompt}] | |
response = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo-16k", | |
messages=messages, | |
temperature=0.1, | |
max_tokens=2500, | |
top_p=0.2, | |
frequency_penalty=0, | |
presence_penalty=0 | |
) | |
highlighted_text = response['choices'][0]['message']['content'] | |
# ๊ธฐ์กด ์ง๋ฌธ ์ง์ฐ๊ธฐ | |
text_placeholder.empty() | |
# ์๋ก์ด ๋ด์ฉ ๋ฃ๊ธฐ | |
with text_container: | |
exec(highlighted_text) | |
with cols[1]: | |
global btn_explanation | |
btn_explanation= st.button("์ถ๊ฐ ์ค๋ช ") | |
with cols[2]: | |
global btn_simple | |
btn_simple = st.button("์ฌ์ด ํํ") | |
with cols[3]: | |
global btn_rewrite | |
btn_rewrite = st.button("๋ค์ ์ฐ๊ธฐ") | |
return btn_keyword, btn_explanation, btn_simple, btn_rewrite | |
def display_output(): | |
with st.container(): | |
st.header("๊ฒฐ๊ณผ") | |
if btn_explanation: | |
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 | |
if btn_simple: | |
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.1, | |
max_tokens=2500 | |
) | |
explanation = response['choices'][0]['message']['content'] | |
# ์ฌ์ด ํํ์ผ๋ก ๊ฒฐ๊ณผ ์ถ๋ ฅ | |
st.write(f"์ฌ์ด ๊ธ: {explanation}") | |
pass | |
if btn_rewrite: | |
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}") | |
#๊ฒฐ๊ณผ ๋ถ๋ถ์ ๋ฒํผ ์ถ๋ ฅ ์ถ๊ฐ | |
def main(): | |
st.title("ํ๊ตญ์ด ํ์ต์๋ฅผ ์ํ HCI tools") | |
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() | |
# # ํ๋จ ์ปจํ ์ด๋ | |
# with st.container(): | |
# st.header("๊ฒฐ๊ณผ") | |
if __name__ == "__main__": | |
main() |