import gradio as gr import openai import json import os import pandas as pd # 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()] # 성취기준 데이터 가져오기 import achievement_standards as data achievement_standards = data.achievement_standards def get_subjects(grade_group): return list(achievement_standards[grade_group].keys()) def get_standards(grade_group, subject): return achievement_standards[grade_group][subject] def generate_and_save_evaluation(grade_group, subject, standard): result = generate_annotated_text(standard) result_lines = result.split('\n') sentences = [line[start_idx + 2:line.find('",', start_idx)].strip() for line in result_lines if (start_idx := line.find('("')) != -1] df = pd.DataFrame(sentences, columns=["Evaluation"]) file_path = "/mnt/data/evaluations.csv" df.to_csv(file_path, index=False) return result, file_path # Gradio 인터페이스 정의 with gr.Blocks() as demo: gr.Markdown("### 성취기준 기반 학생의 특성 및 활동 평가 생성") grade_group = gr.Dropdown(label="학년군을 선택하세요:", choices=list(achievement_standards.keys())) subject = gr.Dropdown(label="과목을 선택하세요:") standard = gr.Dropdown(label="성취기준을 선택하세요:") grade_group.change(fn=get_subjects, inputs=grade_group, outputs=subject) subject.change(fn=get_standards, inputs=[grade_group, subject], outputs=standard) with gr.Row(): generate_button = gr.Button("평가 생성") result_output = gr.HTML() similar_sentence_button = gr.Button("유사한 문구 생성") similar_sentences_output = gr.HTML() save_button = gr.Button("CSV로 저장") download_link = gr.File() def update_similar_sentences(selected_sentence): similar_sentences = generate_similar_sentences(selected_sentence) return '
'.join(similar_sentences) def save_evaluations_to_csv(evaluations): df = pd.DataFrame(evaluations, columns=["Evaluation"]) file_path = "/mnt/data/evaluations.csv" df.to_csv(file_path, index=False) return file_path selected_sentence = gr.Textbox(visible=False) generate_button.click(fn=generate_and_save_evaluation, inputs=[grade_group, subject, standard], outputs=[result_output, download_link]) similar_sentence_button.click(fn=update_similar_sentences, inputs=selected_sentence, outputs=similar_sentences_output) save_button.click(fn=save_evaluations_to_csv, inputs=result_output, outputs=download_link) demo.launch()