EduTechTeam commited on
Commit
f336bd7
·
verified ·
1 Parent(s): 495d7c9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +176 -0
app.py ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import plotly.express as px
2
+ import pandas as pd
3
+ import gradio as gr
4
+ import openai
5
+
6
+ # 課程資料
7
+ course_dict = {
8
+ "基礎必修": [
9
+ {"科目": "統計學", "學分": 3, "課程": ["統計學", "初級統計", "教育統計", "體育統計學", "生物統計學", "數理統計", "機率與統計"]},
10
+ {"科目": "資料庫系統", "學分": 3, "課程": ["資料庫系統", "資料庫管理系統", "資料庫"]},
11
+ {"科目": "資料探勘", "學分": 3, "課程": ["資料探勘", "人工智慧", "資料結構", "教育資料科學概論", "大數據分析", "深度學習", "機器學習", "演算法", "資料視覺化"]}
12
+ ],
13
+ "核心選修": [
14
+ {"科目": "研究方法", "學分": 3, "課程": ["研究方法", "教育研究法", "社會科學研究法", "科學教育研究法", "量化研究"]},
15
+ {"科目": "高等統計學", "學分": 3, "課程": ["高等教育統計", "高等體育統計學"]},
16
+ {"科目": "多變量分析", "學分": 3, "課程": ["多變量分析"]},
17
+ {"科目": "程式設計", "學分": 3, "課程": ["程式設計", "基礎程式設計", "計算機程式設計", "網路程式設計", "物件導向程式設計", "視窗程式設計", "行動程式設計", "網頁程式設計", "遊戲程式設計", "資料科學程式設計", "視覺化程式設計語言"]},
18
+ {"科目": "前端工程設計", "學分": 3, "課程": ["前端工程設計", "網頁設計與製作", "網頁設計", "網站建置與管理", "跨平台前端工程設計"]},
19
+ {"科目": "使用者經驗設計", "學分": 3, "課程": ["使用者經驗設計", "設計方法", "視覺傳達設計", "電腦多媒體理論與實務", "混合實境科技", "人機介面設計與製作"]},
20
+ {"科目": "專題研究", "學分": 2, "課程": ["智慧型科技專題", "資訊科技專題", "資料探勘專題研究", "人工智慧案例討論", "大數據分析案例討論"]}
21
+ ]
22
+ }
23
+
24
+ # 將資料轉換為平坦的 DataFrame
25
+ def create_dataframe(course_dict):
26
+ data = []
27
+ for category, subjects in course_dict.items():
28
+ for subject in subjects:
29
+ for course in subject["課程"]:
30
+ data.append({
31
+ "類別": category,
32
+ "科目": subject["科目"],
33
+ "課程": course
34
+ })
35
+ return pd.DataFrame(data)
36
+
37
+
38
+ df = create_dataframe(course_dict)
39
+
40
+ # 創建樹狀圖函數
41
+ def create_sunburst_chart(df):
42
+ fig = px.sunburst(
43
+ df,
44
+ path=['類別', '科目', '課程'],
45
+ title="課程結構互動圖",
46
+ color='類別',
47
+ color_discrete_sequence=px.colors.qualitative.Pastel
48
+ )
49
+
50
+ # 自訂 hovertemplate,不顯示學分
51
+ fig.update_traces(
52
+ hovertemplate="<b>%{label}</b><br><extra></extra>"
53
+ )
54
+
55
+ # 更新圖表佈局
56
+ fig.update_layout(
57
+ margin=dict(t=50, l=25, r=25, b=25)
58
+ )
59
+ return fig
60
+
61
+
62
+ # 生成初始樹狀圖
63
+ initial_fig = create_sunburst_chart(df)
64
+
65
+ # 課程推薦函數
66
+ def recommend_courses(learning_background, difficulty, preferred_course, question_type, possible_career_paths, api_key):
67
+ openai.api_key = api_key
68
+
69
+ try:
70
+ # 使用 OpenAI API 生成建議,符合新版 API 介面
71
+ completion = openai.chat.completions.create(
72
+ model="gpt-4o",
73
+ messages=[
74
+ {"role": "system", "content": "你是一位資深的教育顧問,負責為學生提供個性化的學習建議,請以純文字格式回答,不要包含 Markdown 語法。"},
75
+ {
76
+ "role": "user",
77
+ "content": f"""請確保不要以Markdown語法回覆,
78
+ 根據以下課程資料:{course_dict},
79
+ 學習背景為{learning_background},
80
+ 難度為{difficulty},
81
+ 最感興趣的課程名稱為{preferred_course},
82
+ 偏好教學方式為{question_type},
83
+ 未來可能從事的職業或研究方向為{possible_career_paths},
84
+ 請根據課程資料、學習背景、難度、最感興趣的課程、偏好教學方式、未來可能從事的職業或研究方向推薦所需修的科目,
85
+ 請推薦至少9學分的基礎必修科目和至少8學分的核心選修科目,
86
+ 並依照科目推薦對應的2-3個課程,
87
+ 請確保至少9學分的基礎必修科目,
88
+ 並確保至少8學分的核心選修科目與總科目學分不少於17學分,
89
+ 並顯示目前所選科目的學分,
90
+ 並顯示所選科目的學分的加總(包含詳細選擇課程學分的加總過程),
91
+ 並依照推薦課程提供對應多個學習資源(如��站名稱,不要連結)建議。
92
+ 請輸出推薦課程的學習路徑,範例:科目→科目→科目,
93
+ 詳細分析此學習路徑原因,
94
+ 請以純文字格式回答,不要包含 Markdown 語法。"""
95
+ }
96
+
97
+ ]
98
+ )
99
+ recommendation = completion.choices[0].message.content
100
+
101
+ # 返回推薦結果,不更新圖表
102
+ return recommendation
103
+
104
+ except Exception as e:
105
+ return f"錯誤發生:{str(e)}。請檢查 API Key 是否正確或稍後再試。"
106
+
107
+ # Gradio 表單設計
108
+ with gr.Blocks() as demo:
109
+ gr.Markdown("# 個人化課程學習建議")
110
+
111
+ with gr.Row():
112
+ # 左側欄:課程結構與學分分佈樹狀圖
113
+ with gr.Column(scale=1):
114
+ sunburst_output = gr.Plot(value=initial_fig, label="課程結構互動圖")
115
+
116
+ # 中間欄:課程推薦表單
117
+ with gr.Column(scale=1):
118
+
119
+ with gr.Row():
120
+ # 學習背景(複選)
121
+ learning_background = gr.CheckboxGroup(
122
+ choices=[
123
+ "無資訊技術背景",
124
+ "相關資訊課經驗",
125
+ "資訊本科生",
126
+ "軟體開發經驗",
127
+ "網頁設計經驗",
128
+ "數據分析經驗"
129
+ ],
130
+ label="學習背景"
131
+ )
132
+ with gr.Row():
133
+ # 難度區
134
+ difficulty = gr.Dropdown(["基礎", "進階", "專業"], label="偏好難度")
135
+ # 偏好教學方式
136
+ question_type = gr.Dropdown(
137
+ ["理論講解", "案例分析", "實作練習", "專題研究"],
138
+ label="偏好教學方式"
139
+ )
140
+
141
+ with gr.Row():
142
+ # 課程
143
+ preferred_course = gr.Dropdown(
144
+ ["程式設計", "統計", "資料庫", "專題研究", "人機介面設計與製作", "網頁設計"],
145
+ label="最感興趣的課程名稱"
146
+ )
147
+ # 未來可能從事的職業或研究方向
148
+ possible_career_paths = gr.Dropdown(
149
+ ["資料科學家",
150
+ "機器學習工程師",
151
+ "前端設計師",
152
+ "後端軟體工程師"],
153
+ label="可能從事的職業或研究方向"
154
+ )
155
+
156
+ with gr.Row():
157
+ # API Key 輸入
158
+ api_key = gr.Textbox(label="生成金鑰(API Key)", type="password")
159
+
160
+ # 提交按鈕
161
+ submit = gr.Button("提交")
162
+
163
+ # 右側欄:課程推薦輸出
164
+ with gr.Column(scale=1):
165
+ # 課程推薦輸出
166
+ output = gr.Textbox(label="課程推薦", lines=24)
167
+
168
+ # 將提交按鈕與輸出連接
169
+ submit.click(
170
+ recommend_courses,
171
+ inputs=[learning_background, difficulty, preferred_course, question_type, possible_career_paths, api_key],
172
+ outputs=output
173
+ )
174
+
175
+ # 啟動 Gradio 的應用
176
+ demo.launch()