File size: 8,434 Bytes
829f184
22a5c64
829f184
22a5c64
cc9698d
2c8f446
 
f4de003
829f184
 
 
f4de003
829f184
 
f4de003
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
829f184
 
 
123222c
9447f48
 
123222c
 
9447f48
 
edf3d14
123222c
 
 
 
9447f48
 
123222c
9447f48
 
 
 
 
123222c
 
f4de003
 
829f184
 
f4de003
829f184
2c8f446
 
 
 
 
768f592
2c8f446
 
 
768f592
2c8f446
 
768f592
 
 
 
 
8cf8548
 
 
 
 
c9ff6f2
 
829f184
18f3ffb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
829f184
 
80a9119
 
18f3ffb
829f184
 
18f3ffb
c89e0f3
9114313
e2967cd
 
 
18f3ffb
 
 
 
 
 
 
78798de
 
 
18f3ffb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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('```', ''))