JUNGU commited on
Commit
71bfdcb
Β·
verified Β·
1 Parent(s): 86f45ae

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -75
app.py CHANGED
@@ -1,39 +1,35 @@
1
- import gradio as gr
2
  import openai
3
  import json
4
  import os
5
  import pandas as pd
6
 
7
- # ν˜„μž¬ 디렉토리λ₯Ό Python κ²½λ‘œμ— μΆ”κ°€
8
- current_dir = os.path.dirname(os.path.abspath(__file__))
9
- sys.path.append(current_dir)
10
 
11
  # μ„±μ·¨κΈ°μ€€ 데이터 κ°€μ Έμ˜€κΈ°
12
  import achievement_standards as data
13
  achievement_standards = data.achievement_standards
14
 
15
- # OpenAI API μ„€μ • (ν™˜κ²½ λ³€μˆ˜μ—μ„œ μ½μ–΄μ˜΄)
16
- openai.api_key = os.getenv("OPENAI_API_KEY")
17
-
18
  # gptμ΄μš©ν•΄μ„œ μΆ”λ‘ ν•¨μˆ˜ λ§Œλ“€κΈ°
19
  def generate_annotated_text(text):
20
  response = openai.ChatCompletion.create(
21
- model="gpt-3.5-turbo-16k",
22
- messages=[
23
- {
24
- "role": "system",
25
- "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```"
26
- },
27
- {
28
- "role": "user",
29
- "content": text
30
- }
31
- ],
32
- temperature=1,
33
- max_tokens=10000,
34
- top_p=1,
35
- frequency_penalty=0,
36
- presence_penalty=0
37
  )
38
  return response['choices'][0]['message']['content']
39
 
@@ -60,59 +56,70 @@ def generate_similar_sentences(base_sentence):
60
  generated_sentences = response.choices[0].message['content'].split('\n')
61
  return [sentence.strip() for sentence in generated_sentences if sentence.strip()]
62
 
63
- # μ„±μ·¨κΈ°μ€€ 데이터 κ°€μ Έμ˜€κΈ°
64
- import achievement_standards as data
65
- achievement_standards = data.achievement_standards
 
 
 
 
 
 
 
66
 
67
- def get_subjects(grade_group):
68
- return list(achievement_standards[grade_group].keys())
 
69
 
70
- def get_standards(grade_group, subject):
71
- return achievement_standards[grade_group][subject]
72
 
73
- def generate_and_save_evaluation(grade_group, subject, standard):
74
- result = generate_annotated_text(standard)
75
- result_lines = result.split('\n')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  sentences = [line[start_idx + 2:line.find('",', start_idx)].strip() for line in result_lines if (start_idx := line.find('("')) != -1]
77
- df = pd.DataFrame(sentences, columns=["Evaluation"])
78
- file_path = "/mnt/data/evaluations.csv"
79
- df.to_csv(file_path, index=False)
80
- return result, file_path
81
-
82
- # Gradio μΈν„°νŽ˜μ΄μŠ€ μ •μ˜
83
- with gr.Blocks() as demo:
84
- gr.Markdown("### μ„±μ·¨κΈ°μ€€ 기반 ν•™μƒμ˜ νŠΉμ„± 및 ν™œλ™ 평가 생성")
85
-
86
- grade_group = gr.Dropdown(label="학년ꡰ을 μ„ νƒν•˜μ„Έμš”:", choices=list(achievement_standards.keys()))
87
- subject = gr.Dropdown(label="κ³Όλͺ©μ„ μ„ νƒν•˜μ„Έμš”:")
88
- standard = gr.Dropdown(label="성취기쀀을 μ„ νƒν•˜μ„Έμš”:")
89
-
90
- grade_group.change(fn=get_subjects, inputs=grade_group, outputs=subject)
91
- subject.change(fn=get_standards, inputs=[grade_group, subject], outputs=standard)
92
-
93
- with gr.Row():
94
- generate_button = gr.Button("평가 생성")
95
- result_output = gr.HTML()
96
-
97
- similar_sentence_button = gr.Button("μœ μ‚¬ν•œ 문ꡬ 생성")
98
- similar_sentences_output = gr.HTML()
99
- save_button = gr.Button("CSV둜 μ €μž₯")
100
- download_link = gr.File()
101
-
102
- def update_similar_sentences(selected_sentence):
103
- similar_sentences = generate_similar_sentences(selected_sentence)
104
- return '<br>'.join(similar_sentences)
105
-
106
- def save_evaluations_to_csv(evaluations):
107
- df = pd.DataFrame(evaluations, columns=["Evaluation"])
108
- file_path = "/mnt/data/evaluations.csv"
109
- df.to_csv(file_path, index=False)
110
- return file_path
111
-
112
- selected_sentence = gr.Textbox(visible=False)
113
-
114
- generate_button.click(fn=generate_and_save_evaluation, inputs=[grade_group, subject, standard], outputs=[result_output, download_link])
115
- similar_sentence_button.click(fn=update_similar_sentences, inputs=selected_sentence, outputs=similar_sentences_output)
116
- save_button.click(fn=save_evaluations_to_csv, inputs=result_output, outputs=download_link)
117
-
118
- demo.launch()
 
1
+ import streamlit as st
2
  import openai
3
  import json
4
  import os
5
  import pandas as pd
6
 
7
+ # OpenAI API μ„€μ • (ν™˜κ²½ λ³€μˆ˜μ—μ„œ μ½μ–΄μ˜΄)
8
+ openai.api_key = os.getenv("OPENAI_API_KEY")
 
9
 
10
  # μ„±μ·¨κΈ°μ€€ 데이터 κ°€μ Έμ˜€κΈ°
11
  import achievement_standards as data
12
  achievement_standards = data.achievement_standards
13
 
 
 
 
14
  # gptμ΄μš©ν•΄μ„œ μΆ”λ‘ ν•¨μˆ˜ λ§Œλ“€κΈ°
15
  def generate_annotated_text(text):
16
  response = openai.ChatCompletion.create(
17
+ model="gpt-3.5-turbo-16k",
18
+ messages=[
19
+ {
20
+ "role": "system",
21
+ "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```"
22
+ },
23
+ {
24
+ "role": "user",
25
+ "content": text
26
+ }
27
+ ],
28
+ temperature=1,
29
+ max_tokens=10000,
30
+ top_p=1,
31
+ frequency_penalty=0,
32
+ presence_penalty=0
33
  )
34
  return response['choices'][0]['message']['content']
35
 
 
56
  generated_sentences = response.choices[0].message['content'].split('\n')
57
  return [sentence.strip() for sentence in generated_sentences if sentence.strip()]
58
 
59
+ # Streamlit μ•±μ˜ 제λͺ© 및 μ„€λͺ…
60
+ st.title("μ„±μ·¨κΈ°μ€€ 기반 ν•™μƒμ˜ νŠΉμ„± 및 ν™œλ™ 평가 생성")
61
+ st.write("성취기쀀을 μž…λ ₯ν•˜μ‹œλ©΄, ν•΄λ‹Ή 성취기쀀에 κΈ°λ°˜ν•œ ν•™μƒμ˜ νŠΉμ„± 및 ν™œλ™μ— λŒ€ν•œ 평가λ₯Ό [학생 ν™œλ™, μ„±μ·¨ μˆ˜μ€€, κ΅μ‚¬μ˜ 총평, 학생 μ—­λŸ‰] 4가지 μš”μ†Œλ₯Ό μ‘°ν•©ν•˜μ—¬ μ œκ³΅ν•©λ‹ˆλ‹€.")
62
+
63
+ # ν•™λ…„κ΅° 선택 λ“œλ‘­λ‹€μš΄
64
+ grade_group = st.selectbox("학년ꡰ을 μ„ νƒν•˜μ„Έμš”:", list(achievement_standards.keys()))
65
+
66
+ # μ„ νƒλœ 학년ꡰ에 λ”°λ₯Έ κ³Όλͺ© λͺ©λ‘
67
+ subject_list = list(achievement_standards[grade_group].keys())
68
+ subject = st.selectbox("κ³Όλͺ©μ„ μ„ νƒν•˜μ„Έμš”:", subject_list)
69
 
70
+ # μ„ νƒλœ κ³Όλͺ©μ— λ”°λ₯Έ μ„±μ·¨κΈ°μ€€ λͺ©λ‘
71
+ selected_standards = achievement_standards[grade_group][subject]
72
+ selected_standard = st.selectbox("성취기쀀을 μ„ νƒν•˜μ„Έμš”:", selected_standards)
73
 
74
+ # μ„ νƒλœ 성취기쀀을 ν…μŠ€νŠΈ μž…λ ₯창의 κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©
75
+ achievement_standard = st.text_input("μ„±μ·¨κΈ°μ€€ μž…λ ₯:", value=selected_standard)
76
 
77
+ # μ„Έμ…˜ μƒνƒœ μ΄ˆκΈ°ν™”
78
+ if 'generated_result' not in st.session_state:
79
+ st.session_state.generated_result = None
80
+ if 'selected_sentence' not in st.session_state:
81
+ st.session_state.selected_sentence = None
82
+ if 'similar_sentences' not in st.session_state:
83
+ st.session_state.similar_sentences = []
84
+
85
+ # "평가 생성" λ²„νŠΌ 클릭 μ‹œμ˜ λ™μž‘
86
+ if st.button("평가 생성"):
87
+ with st.spinner('λ‹΅λ³€ 생성쀑...'):
88
+ result = generate_annotated_text(achievement_standard)
89
+ st.session_state.generated_result = result
90
+ st.session_state.selected_sentence = None # μƒˆλ‘œμš΄ 평가 μƒμ„±μ‹œ μ„ νƒλœ λ¬Έμž₯ μ΄ˆκΈ°ν™”
91
+ st.session_state.similar_sentences = [] # 이전 μœ μ‚¬ν•œ λ¬Έμž₯λ“€ μ΄ˆκΈ°ν™”
92
+ exec(result.replace('```', ''))
93
+
94
+ # μ…€λ ‰νŠΈ λ°•μŠ€ 및 μœ μ‚¬ν•œ λ¬Έμž₯ 생성 λ²„νŠΌ μΆ”κ°€
95
+ if st.session_state.generated_result:
96
+ # annotated_text κ²°κ³Όμ—μ„œ λ¬Έμž₯만 μΆ”μΆœ
97
+ result_lines = st.session_state.generated_result.split('\n')
98
  sentences = [line[start_idx + 2:line.find('",', start_idx)].strip() for line in result_lines if (start_idx := line.find('("')) != -1]
99
+
100
+ if sentences:
101
+ selected_sentence = st.selectbox("λ¬Έμž₯을 μ„ νƒν•˜μ„Έμš”:", sentences, key="sentence_select")
102
+ st.session_state.selected_sentence = selected_sentence
103
+
104
+ # μœ μ‚¬ν•œ λ¬Έμž₯ 생성 λ²„νŠΌ
105
+ if st.button("μœ μ‚¬ν•œ 문ꡬ 생성") and st.session_state.selected_sentence:
106
+ with st.spinner('λ¬Έμž₯ 생성쀑...'):
107
+ st.session_state.similar_sentences = generate_similar_sentences(st.session_state.selected_sentence)
108
+
109
+ # μœ μ‚¬ν•œ λ¬Έμž₯λ“€ 좜λ ₯
110
+ for sentence in st.session_state.similar_sentences:
111
+ st.write(sentence)
112
+
113
+ # CSV μ €μž₯ λ²„νŠΌ μΆ”κ°€
114
+ if st.session_state.similar_sentences:
115
+ if st.button("CSV둜 μ €μž₯"):
116
+ df = pd.DataFrame(st.session_state.similar_sentences, columns=["Evaluation"])
117
+ df.to_csv("evaluations.csv", index=False)
118
+ st.success("CSV 파일이 μ €μž₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
119
+ with open("evaluations.csv", "rb") as file:
120
+ btn = st.download_button(
121
+ label="CSV λ‹€μš΄λ‘œλ“œ",
122
+ data=file,
123
+ file_name="evaluations.csv",
124
+ mime="text/csv"
125
+ )