JUNGU's picture
Update app.py
18f3ffb
raw
history blame
8.43 kB
import streamlit as st
import openai
import json
from annotated_text import annotated_text
import os
import achivenment_standards 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": "์„ฑ์ทจ๊ธฐ์ค€ ๊ธฐ๋ฐ˜ ํ•™์ƒ์˜ ํŠน์„ฑ ๋ฐ ํ™œ๋™ ํ‰๊ฐ€ ์ƒ์„ฑ\n์„ฑ์ทจ๊ธฐ์ค€์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด, ํ•ด๋‹น ์„ฑ์ทจ๊ธฐ์ค€์— ๊ธฐ๋ฐ˜ํ•œ ํ•™์ƒ์˜ ํŠน์„ฑ ๋ฐ ํ™œ๋™์— ๋Œ€ํ•œ ํ‰๊ฐ€๋ฅผ annotated_text ํ˜•์‹์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„ฑ์ทจ๊ธฐ์ค€์„ ๋ณด๋ฉฐ ํ•™์ƒ์˜ ํŠน์ • ํ™œ๋™, ์„ฑ์ทจ ์ˆ˜์ค€, ๊ต์‚ฌ์˜ ์ดํ‰, ๊ทธ๋ฆฌ๊ณ  ํ•™์ƒ์˜ ์—ญ๋Ÿ‰์„ ๊ณ ๋ คํ•˜์—ฌ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์–ด๋Š” ๋ฐ˜๋“œ์‹œ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. \n\n์˜ˆ์ œ:\n์ž…๋ ฅ: ```์„ฑ์ทจ๊ธฐ์ค€: [6๊ตญ01-07]์ƒ๋Œ€๊ฐ€ ์ฒ˜ํ•œ ์ƒํ™ฉ์„ ์ดํ•ดํ•˜๊ณ  ๊ณต๊ฐํ•˜๋ฉฐ ๋“ฃ๋Š” ํƒœ๋„๋ฅผ ์ง€๋‹Œ๋‹ค, [6๊ตญ01-02] ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๊ณ  ํ•จ๊ป˜ ์กฐ์ •ํ•˜๋ฉฐ ํ† ์˜ํ•œ๋‹ค.```\n์ถœ๋ ฅ: ```annotated_text(\n (\"ํ‰์†Œ ์ž์‹ ์˜ ์ƒ๊ฐ์„ ์ผ๋ชฉ์š”์—ฐํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ์Šต๊ด€์ด ์žˆ์Œ.\", \"์—ญ๋Ÿ‰\", \"rgba(255, 0, 0, 0.3)\"),\n (\"์‚ฌํšŒ ํ˜„์•ˆ์— ๊ด€ํ•œ ์ฃผ์žฅํ•˜๋Š” ๊ธ€์“ฐ๊ธฐ๋ฅผ ์ž˜ํ•จ.\", \"์„ฑ์ทจ์ˆ˜์ค€\", \"rgba(0, 0, 255, 0.3)\"),\n (\"์นœ๊ตฌ์˜ ๊ณ ๋ฏผ์„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ๊ทน์—์„œ ์ƒ๋Œ€๋ฐฉ์„ ๋ฐฐ๋ คํ•˜์—ฌ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์•ˆ์„ ์ œ์•ˆํ•จ.\", \"์ˆ˜ํ–‰\", \"rgba(0, 128, 0, 0.3)\"),\n (\"์ƒ๋Œ€๊ฐ€ ์ฒ˜ํ•œ ์ƒํ™ฉ์„ ์ดํ•ดํ•˜๊ณ  ๊ณต๊ฐํ•˜๋Š” ํƒœ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์นœ๊ตฌ๋“ค๊ณผ ์›๋งŒํ•œ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ๊ฐˆ๋“ฑ์„ ์กฐ์ •ํ•จ.\", \"๊ต์‚ฌ์ดํ‰\", \"rgba(128, 128, 128, 0.3)\"),\n (\"์ค‘๊ฐ„ ๋†€์ด ์‹œ๊ฐ„์— ์šด๋™์žฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ •ํ•˜๊ธฐ๋ฅผ ์ฃผ์ œ๋กœ ํ•œ ํ† ์˜์—์„œ ์•Œ๋งž์€ ๊ทผ๊ฑฐ์™€ ๋’ท๋ฐ›์นจํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๋ฅผ ํ† ๋Œ€๋กœ ์ž์‹ ์˜ ์˜๊ฒฌ์„ ํƒ€๋‹นํ•˜๊ฒŒ ์ œ์‹œํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์„ ๋Šฅ๋™์ ์œผ๋กœ ์ˆ˜์šฉํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์˜๊ฒฌ์„ ์กฐ์ •ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๋ณด์ž„.\", \"์ˆ˜ํ–‰\", \"rgba(0, 128, 0, 0.3)\"),\n (\"์ƒ๋Œ€์˜ ์˜๊ฒฌ์„ ์กด์ค‘ํ•˜๊ณ  ํ˜‘๋ ฅํ•˜๋Š” ํƒœ๋„๋ฅผ ๋ณด์ž„.\", \"์—ญ๋Ÿ‰\", \"rgba(255, 0, 0, 0.3)\")\n)\n```"
},
{
"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("์„ฑ์ทจ๊ธฐ์ค€์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด, ํ•ด๋‹น ์„ฑ์ทจ๊ธฐ์ค€์— ๊ธฐ๋ฐ˜ํ•œ ํ•™์ƒ์˜ ํŠน์„ฑ ๋ฐ ํ™œ๋™์— ๋Œ€ํ•œ ํ‰๊ฐ€๋ฅผ \n\n [ํ•™์ƒ ํ™œ๋™, ์„ฑ์ทจ ์ˆ˜์ค€, ๊ต์‚ฌ์˜ ์ดํ‰, ํ•™์ƒ ์—ญ๋Ÿ‰] 4๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.")
# ์„ฑ์ทจ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
achievement_standards = data.achievement_standards
# ํ•™๋…„๊ตฐ ์„ ํƒ ๋“œ๋กญ๋‹ค์šด
grade_group = st.selectbox("ํ•™๋…„๊ตฐ์„ ์„ ํƒํ•˜์„ธ์š”:", list(achievement_standards.keys()))
# ์„ ํƒ๋œ ํ•™๋…„๊ตฐ์— ๋”ฐ๋ฅธ ๊ณผ๋ชฉ ๋ชฉ๋ก
subject_list = list(achievement_standards[grade_group].keys())
subject = st.selectbox("๊ณผ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”:", subject_list)
# ์„ ํƒ๋œ ๊ณผ๋ชฉ์— ๋”ฐ๋ฅธ ์„ฑ์ทจ๊ธฐ์ค€ ๋ชฉ๋ก
selected_standards = achievement_standards[grade_group][subject]
selected_standard = st.selectbox("์„ฑ์ทจ๊ธฐ์ค€์„ ์„ ํƒํ•˜์„ธ์š”:", selected_standards)
# ์„ ํƒ๋œ ์„ฑ์ทจ๊ธฐ์ค€์„ ํ…์ŠคํŠธ ์ž…๋ ฅ์ฐฝ์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ
achievement_standard = st.text_input("์„ฑ์ทจ๊ธฐ์ค€ ์ž…๋ ฅ:", value=selected_standard)
# ์„ธ์…˜ ์ƒํƒœ ์ดˆ๊ธฐํ™”
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 'selected_index' not in st.session_state:
st.session_state.selected_index = 0
# # "ํ‰๊ฐ€ ์ƒ์„ฑ" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ์˜ ๋™์ž‘
# if st.button("ํ‰๊ฐ€ ์ƒ์„ฑ"):
# with st.spinner('๋‹ต๋ณ€ ์ƒ์„ฑ์ค‘...'):
# result = generate_annotated_text(achievement_standard)
# # ๊ฒฐ๊ณผ ์ถœ๋ ฅ
# exec(result.replace('```', ''))
# # annotated_text ๊ฒฐ๊ณผ์—์„œ ๋ฌธ์žฅ๋งŒ ์ถ”์ถœ
# result_lines = result.split('\n')
# sentences = []
# for line in result_lines:
# # "(" ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ ๊ทธ ์ดํ›„์˜ ๋ฌธ์ž์—ด๋งŒ ์ถ”์ถœ
# start_idx = line.find('("')
# if start_idx != -1:
# end_idx = line.find('",', start_idx)
# sentence = line[start_idx + 2:end_idx].strip() # "(" ๋‹ค์Œ๋ถ€ํ„ฐ "," ์ „๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์„ ์ถ”์ถœ
# sentences.append(sentence)
# # # ๋ฌธ์žฅ์„ ๋ผ๋””์˜ค ๋ฒ„ํŠผ์œผ๋กœ ํ‘œ์‹œ ๋ฐ ์„ ํƒ๋œ ๋ฌธ์žฅ ์ €์žฅ
# # selected_index = st.radio("๋ฌธ์žฅ์„ ์„ ํƒํ•˜์„ธ์š”:", range(len(sentences)), format_func=lambda x: sentences[x])
# # st.session_state.selected_sentence = sentences[selected_index] if sentences else None
# #๋””๋ฒ„๊น…
# st.session_state.selected_index = st.radio("๋ฌธ์žฅ์„ ์„ ํƒํ•˜์„ธ์š”:", range(len(sentences)), format_func=lambda x: sentences[x], key="selected_index")
# # # ์œ ์‚ฌํ•œ ๋ฌธ์žฅ ์ƒ์„ฑ ๋ฒ„ํŠผ ์ถ”๊ฐ€
# # if st.button("์œ ์‚ฌํ•œ ๋ฌธ๊ตฌ ์ƒ์„ฑ") and st.session_state.get('selected_sentence'):
# # with st.spinner('๋ฌธ์žฅ ์ƒ์„ฑ์ค‘...'):
# # similar_sentences = generate_similar_sentences(st.session_state.selected_sentence)
# # for sentence in st.session_state.similar_sentences:
# # st.write(sentence)
# # ์œ ์‚ฌํ•œ ๋ฌธ์žฅ ์ƒ์„ฑ ๋ฒ„ํŠผ ์ถ”๊ฐ€
# if st.button("์œ ์‚ฌํ•œ ๋ฌธ๊ตฌ ์ƒ์„ฑ"):
# if st.session_state.get('generated_result'):
# # annotated_text ๊ฒฐ๊ณผ์—์„œ ๋‹ค์‹œ ๋ฌธ์žฅ ์ถ”์ถœ
# result_lines = st.session_state.generated_result.split('\n')
# sentences = [line[start_idx + 2:line.find('",', start_idx)].strip() for line in result_lines if (start_idx := line.find('("')) != -1]
# if sentences:
# selected_sentence = sentences[st.session_state.selected_index]
# with st.spinner('๋ฌธ์žฅ ์ƒ์„ฑ์ค‘...'):
# st.session_state.similar_sentences = generate_similar_sentences(selected_sentence)
# # ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ ๋ฐ ์œ ์‚ฌํ•œ ๋ฌธ์žฅ๋“ค ์ถœ๋ ฅ
# if st.session_state.get('generated_result'):
# exec(st.session_state.generated_result.replace('```', ''))
# for sentence in st.session_state.get('similar_sentences', []):
# st.write(sentence)
# "ํ‰๊ฐ€ ์ƒ์„ฑ" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ์˜ ๋™์ž‘
if st.button("ํ‰๊ฐ€ ์ƒ์„ฑ"):
with st.spinner('๋‹ต๋ณ€ ์ƒ์„ฑ์ค‘...'):
result = generate_annotated_text(achievement_standard)
st.session_state.generated_result = result
exec(result.replace('```', ''))
# annotated_text ๊ฒฐ๊ณผ์—์„œ ๋ฌธ์žฅ๋งŒ ์ถ”์ถœ ๋ฐ ๋ฒ„ํŠผ ์ถ”๊ฐ€
result_lines = result.split('\n')
for line in result_lines:
start_idx = line.find('("')
if start_idx != -1:
end_idx = line.find('",', start_idx)
sentence = line[start_idx + 2:end_idx].strip()
# ๊ฐ ๋ฌธ์žฅ ์˜†์— ๋ฒ„ํŠผ ์ถ”๊ฐ€
if st.button(f"์œ ์‚ฌํ•œ ๋ฌธ๊ตฌ ์ƒ์„ฑ - '{sentence[:30]}...'", key=sentence):
with st.spinner('๋ฌธ์žฅ ์ƒ์„ฑ์ค‘...'):
similar_sentences = generate_similar_sentences(sentence)
for generated_sentence in similar_sentences:
st.write(generated_sentence)
# ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ ๋ฐ ์œ ์‚ฌํ•œ ๋ฌธ์žฅ๋“ค ์ถœ๋ ฅ
if st.session_state.get('generated_result'):
exec(st.session_state.generated_result.replace('```', ''))