Spaces:
Sleeping
Sleeping
update code
Browse files- educational_material.py +308 -0
- requirements.txt +1 -2
educational_material.py
ADDED
@@ -0,0 +1,308 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
|
3 |
+
class EducationalMaterial:
|
4 |
+
"""
|
5 |
+
A class to generate educational content based on provided parameters.
|
6 |
+
|
7 |
+
Attributes:
|
8 |
+
context (str): Context or transcript of the content.
|
9 |
+
topic (str): The topic of the content.
|
10 |
+
grade (str): The grade level for the content.
|
11 |
+
level (str): The difficulty level of the content.
|
12 |
+
specific_feature (str): A specific feature of the content.
|
13 |
+
content_type (str): The type of content to generate ('worksheet' or 'lesson_plan').
|
14 |
+
"""
|
15 |
+
def __init__(self, context, topic, grade, level, specific_feature, content_type):
|
16 |
+
"""
|
17 |
+
Initializes the EducationalMaterial with provided parameters.
|
18 |
+
|
19 |
+
Parameters:
|
20 |
+
context (str): Context or transcript of the content.
|
21 |
+
topic (str): The topic of the content.
|
22 |
+
grade (str): The grade level for the content.
|
23 |
+
level (str): The difficulty level of the content.
|
24 |
+
specific_feature (str): A specific feature of the content.
|
25 |
+
content_type (str): The type of content to generate ('worksheet' or 'lesson_plan').
|
26 |
+
"""
|
27 |
+
self.context = self._prepare_context(context)
|
28 |
+
self.topic = topic
|
29 |
+
self.grade = grade
|
30 |
+
self.level = level
|
31 |
+
self.specific_feature = specific_feature
|
32 |
+
self.content_type = content_type # 'worksheet' or 'lesson_plan'
|
33 |
+
self.system_content = "你是一個擅長資料分析跟影片教學備課的老師,請精讀資料文本,自行判斷資料的種類,使用 zh-TW"
|
34 |
+
|
35 |
+
def _prepare_context(self, context):
|
36 |
+
context_json = json.loads(context)
|
37 |
+
for entry in context_json:
|
38 |
+
entry.pop('embed_url', None)
|
39 |
+
entry.pop('screenshot_path', None)
|
40 |
+
processed_context = json.dumps(context_json, ensure_ascii=False, indent=2)
|
41 |
+
return processed_context
|
42 |
+
|
43 |
+
def generate_content_prompt(self):
|
44 |
+
if self.content_type == 'worksheet':
|
45 |
+
return self._generate_worksheet_prompt()
|
46 |
+
elif self.content_type == 'lesson_plan':
|
47 |
+
return self._generate_lesson_plan_prompt()
|
48 |
+
|
49 |
+
def _generate_worksheet_prompt(self):
|
50 |
+
bloom_worksheet_prompt = """
|
51 |
+
你是個專業的教師,熟悉布魯姆(Benjamin Bloom, 1964) 的認知理論。布魯姆認為人類的能力,大致可分為三個領域(domains),即認知領域(cognitive domain)、情意領域(affective domain)、技能領域 (psychomotor domain)。
|
52 |
+
|
53 |
+
【認知領域】涉及知能及其運作,著重心智、學習以及問題解決的工作。認知目標從簡單的認識或記憶能力到複雜的評鑑能力。大部分的教育目標都屬於這個領域。認知領域的目標分為六個層次,每個層次代表不同的心智功能。
|
54 |
+
- 📖 知識:在認知目標中知識是最低層次的能力,包括名詞、事實、規則和原理原則等的認識和記憶。用來表示此種能力的行為動詞有:指出、寫出、界定、說明、舉例、命名、認明等。例:能在地圖上指出長江流經的省分。
|
55 |
+
- 🤔 理解:理解是指能把握所學過知識或概念的意義,包含轉譯、解釋、推論等能力。代表此能力的行為動詞有:解釋、說明、區別、舉例、摘要、歸納等。例:能解釋光合作用。
|
56 |
+
- 🛠️ 應用:應用是指將所學到的規則、方法、步驟、原理、原則和概念,應用到新情境的能力。用來表示此能力的行為動詞有:預測、證明、解決、修改、表現、應用等。例:學生能預測抽出容器內之氣體對容器的影響。
|
57 |
+
- 🔍 分析:分析是指將所學到的概念或原則,分析為各個構成的部分,或找出各部分之間的相互關係,包括要素、關係及組織原理等的分析。用以表示此種能力的行為動詞有:選出、分析、判斷:區分、指出某些組成要素、指出某些的相互關係等。例:讀完某篇文章後,學生能區分事實和意見。
|
58 |
+
- 🌐 綜合:綜合是指將所學到的片斷概念或知識、原理原則或事實,統整成新的整體。用來表示此種能力的行為動詞有:設計、組織、綜合、創造、歸納、聯合等。例:讀完一篇有關防治汙染的文章後,學生能綜合防治汙染的各種方法。
|
59 |
+
- 🏅 評鑑:評鑑是認知目標中最高層次的能力,指依據某項標準做價值的判斷的能力。用來表示此能力的行為動詞有:評鑑、判斷、評論、比較、批判等。例:學生能評斷辯論中的謬論。
|
60 |
+
|
61 |
+
學習單包含以下的內容,將以布魯姆教育目標來建構提問的架構;請用 markdown 格式來呈現。
|
62 |
+
- 📝 主題:請使用上傳檔案的檔名作為標題
|
63 |
+
- 🔑 重點: 和影片有關重要知識摘要
|
64 |
+
- 💭 概念:概念性問題 - 布魯姆的知識層級;數學知識的建構
|
65 |
+
- 📊 計算:程序性問題 - 布魯姆的理��層級;和影片相同的例題,類似的練習題 → 計算與步驟操作
|
66 |
+
- 🚀 延伸與應用 - 布魯姆的應用、分析、綜合、評鑑層級 → 延伸思考與應用
|
67 |
+
|
68 |
+
其中,「重點」的題目請用挖空的填空題;在「計算」的程序性問題請以單選題或填空題的形式來建立,需要 3 個題目;「延伸與應用」請使用問答題的形式來建立,一題即可。
|
69 |
+
題目和題目之間要換行,並加上 point 符號,像是 "-" 或是 "1." 等等
|
70 |
+
|
71 |
+
這是範例格式:
|
72 |
+
🌐【主題】:認識公里
|
73 |
+
|
74 |
+
🎓【對象】
|
75 |
+
科目: 數學
|
76 |
+
年級: 三年級
|
77 |
+
難度: 基礎
|
78 |
+
|
79 |
+
🏞️【情境描述】
|
80 |
+
狐狸貓和家人出遊,過程中認識測量較長距離的單位「公里」。
|
81 |
+
|
82 |
+
🔑【影片重點】
|
83 |
+
- 公里是用來測量長距離的單位,通常用於測量很遠的距離。
|
84 |
+
- 1公里等於___公尺,也稱為千米。
|
85 |
+
- 公里的英文簡寫是 ____。
|
86 |
+
|
87 |
+
🌟【概念】
|
88 |
+
- 請問公里通常用於測量什麼類型的距離?
|
89 |
+
- 如果一圈操場是200公尺,那跑5圈是多少公尺?多少公里?
|
90 |
+
- 為什麼我們需要使用公里這個單位來測量距離?
|
91 |
+
|
92 |
+
🔢【計算】
|
93 |
+
1. 一圈操場是200公尺,跑10圈是多少公里?(A) 1公里 (B) 2公里 (C) 3公里 (D) 4公里
|
94 |
+
2. 如果你跑了5圈操場,運動手環上會顯示你跑了多少公里?
|
95 |
+
3. 6000公尺等於多少公里?
|
96 |
+
|
97 |
+
💡【延伸與應用】
|
98 |
+
- 假設你參加一場慈善路跑活動,全程是5公里。如果你已經跑了3公里,還剩下多少公里?你覺得這樣的活動對你的體能有什麼影響?
|
99 |
+
"""
|
100 |
+
|
101 |
+
Polya_worksheet_prompt = """
|
102 |
+
你是個專業的教師,熟悉 George Polya(1945) 的數學問題解決策略。
|
103 |
+
Polya提出了一個四步驟的數學問題解決策略,在他影響深遠的經典著作 How to solve it《如何解題》中指出解難過程可分為四個階段:
|
104 |
+
(1) 理解問題 (understanding the problem)
|
105 |
+
(2) 設計解題策略 (devising a plan)
|
106 |
+
(3) 按步解題 (carrying out the plan)
|
107 |
+
(4) 回顧解答 (looking back) (edited)
|
108 |
+
|
109 |
+
請以此設計學習單並依據文本跟難度給予題目
|
110 |
+
請一定要使用 zh-TW
|
111 |
+
|
112 |
+
這是範例格式:
|
113 |
+
🌐 主題:【概念】認識公里
|
114 |
+
|
115 |
+
🎓【對象】
|
116 |
+
科目: 數學
|
117 |
+
年級: 三年級
|
118 |
+
難度: 基礎
|
119 |
+
|
120 |
+
🏞️【情境描述】
|
121 |
+
狐狸貓和家人出遊,過程中認識測量較長距離的單位「公里」。
|
122 |
+
|
123 |
+
❓【給出問題】
|
124 |
+
- 如果日月潭環潭自行車道共30公里,狐狸貓騎行了13.7公里後休息,剩餘多少公里尚未騎行?
|
125 |
+
|
126 |
+
🤔【理解問題】
|
127 |
+
首先,我們必須完全理解問題的所有細節。在此情境中,我們需要釐清以下幾點:
|
128 |
+
- 日月潭環潭自行車道的總長度為30公里。
|
129 |
+
- 狐狸貓已經騎行了13.7公里。
|
130 |
+
- 我們的目標是計算狐狸貓還剩下多少公里未騎行。
|
131 |
+
|
132 |
+
🧭【設計解題策略】
|
133 |
+
接下來,根據我們對問題的理解來設計解決問題的計劃。在此步驟中,我們決定採用哪種策略來解決問題。對於這個問題,最直接的計劃是使用算術減法:
|
134 |
+
- 總公里數(30公里)減去已騎行的公里數(13.7公里)。
|
135 |
+
|
136 |
+
📝【按步解題】
|
137 |
+
按照設計的計劃執行解題步驟。在這裡我們執行減法運算:
|
138 |
+
30−13.7=16.3
|
139 |
+
這意味著狐狸貓還有16.3公里未騎行。
|
140 |
+
|
141 |
+
✨【回顧解答】
|
142 |
+
最後,解題完成後,我們回顧和反思整個解題過程。在這一步,我們驗證計算的結果是否符合邏輯,是否正確解決了原問題。
|
143 |
+
同時,考慮是否有更有效或簡便的方法來解決類似的問題。在這個例子中,使用直接減法是最簡單直接的方法。
|
144 |
+
但在其他情境下,可能需要考慮使用圖形、表格或代數表達式等其他策略來解決問題。
|
145 |
+
"""
|
146 |
+
|
147 |
+
# CRA教學法
|
148 |
+
cra_worksheet_prompt = """
|
149 |
+
你是個專業的教師,熟悉CRA教學法,CRA教學法是一種教學策略,
|
150 |
+
CRA正是一種用來促進學生學習和記憶數學的三步教學法,它闡明瞭用這種方式進行教學的具體步驟。
|
151 |
+
CRA的三個步驟互相依賴,運用CRA能建立起一種概念結構,從而形成知識的意義關聯。
|
152 |
+
CRA策略的第一個階段, 即實例(C)階段,是一個“做”的階段。在這一階段,教師用加工材料建模,這些材料包括彩色圓片、立方體、十進位積木、六形六色積木,以及分數積木,等等。在使用這些材料時,必須考慮到兒童的視覺、���覺及動感經驗。
|
153 |
+
階段二,即描述(R)階段,是一個“看”的階段。在這一-階段,具體的模型被改成了圖片展示,教師可用手繪圖片或貼紙來對概念進行解釋。
|
154 |
+
最後一個階段,即抽象(A)階段,是一個抽象的“符號”階段, 在這一階段, 教師使用數字、字母等數學符號(如:2, 6, 3x, +,-等)來進行教學。
|
155 |
+
運用CRA的前提是學生在學習“規則”前必須學會概念。使用過加工材料的學生,其思維更加明確,更容易理解該方式,同時其學習動機、專注行爲、 理解力以及對這些概念的運用能力也會得到較大改善( Hrrison & Harison, 1986 )。
|
156 |
+
CRA策略可以有效地幫助學生理解以下幾個概念:早期數量關係、位值、計算、分數、小數、測量、幾何、貨幣、百分數、數基、應用題、概率以及統計等
|
157 |
+
這是範例格式:
|
158 |
+
🌐 主題:【概念】認識公里
|
159 |
+
|
160 |
+
🎓【對象】
|
161 |
+
科目: 數學
|
162 |
+
年級: 三年級
|
163 |
+
難度: 基礎
|
164 |
+
|
165 |
+
【實例(C)階段】
|
166 |
+
1. 用彩色圓片來解釋什麼是分數?
|
167 |
+
2. 用立方體來解釋什麼是體積?
|
168 |
+
3. 用十進位積木來解釋什麼是小數?
|
169 |
+
|
170 |
+
【描述(R)階段】
|
171 |
+
1. 用手繪圖片來解釋什麼是分數?
|
172 |
+
2. 用貼紙來解釋什麼是體積?
|
173 |
+
3. 用手繪圖片來解釋什麼是小數?
|
174 |
+
|
175 |
+
【抽象(A)階段】
|
176 |
+
1. 用數字來解釋什麼是分數?
|
177 |
+
2. 用字母來解釋什麼是體積?
|
178 |
+
3. 用數字來解釋什麼是小數?
|
179 |
+
|
180 |
+
"""
|
181 |
+
algorithm = self.specific_feature
|
182 |
+
case = {
|
183 |
+
"Bloom認知階層理論": bloom_worksheet_prompt,
|
184 |
+
"Polya數學解題法": Polya_worksheet_prompt,
|
185 |
+
"CRA教學法": cra_worksheet_prompt
|
186 |
+
}
|
187 |
+
worksheet_prompt = case.get(algorithm, "Bloom認知階層理論")
|
188 |
+
|
189 |
+
return worksheet_prompt
|
190 |
+
|
191 |
+
def _generate_lesson_plan_prompt(self):
|
192 |
+
lesson_plan_prompt = """
|
193 |
+
你是一位專業教師,
|
194 |
+
請根據以上要教學的項目細節
|
195 |
+
幫我安排一個 lesson plan
|
196 |
+
|
197 |
+
規則如下,請嚴格遵守
|
198 |
+
1. 請使用 zh-TW
|
199 |
+
2. 該換行就換行,盡量滿足 word .doc 的格式
|
200 |
+
3. 【課程大綱】的工作項目請嚴格遵守【課程時間】的時間長度,總和時間不要超過或不足
|
201 |
+
4. 時間安排盡量以五分鐘的倍數為一個單位
|
202 |
+
5. 並且根據課程目標安排教學內容
|
203 |
+
|
204 |
+
範例:
|
205 |
+
【課程主題】計算面積的創意設計
|
206 |
+
|
207 |
+
【課程目標】
|
208 |
+
- 理解不同形狀(正方形、長方形、三角形)的面積計算方法。
|
209 |
+
- 學會如何通過對摺改變形狀並計算新形狀的面積。
|
210 |
+
- 鼓勵創造力和實際操作,將數學知識應用於創作中。
|
211 |
+
|
212 |
+
【年級】國小三年級
|
213 |
+
|
214 |
+
【難度】基礎
|
215 |
+
|
216 |
+
【課程時間】60 分鐘
|
217 |
+
|
218 |
+
【課程大綱】
|
219 |
+
- 開場介紹 (5 分鐘)
|
220 |
+
簡短介紹今天的課程主題和目標。
|
221 |
+
|
222 |
+
- 講解與示範 (15 分鐘)
|
223 |
+
形狀與面積:介紹基本幾何形狀(正方形、長方形、三角形)的面積計算公式。
|
224 |
+
對摺技巧:示範如何通過對摺正方形貼紙創造新的形狀(半正方形、三角形)並解釋面積如何改變。
|
225 |
+
應用討論:討論如何使用這些形狀創造不同的圖案或設計,特別是斜屋頂的設計。
|
226 |
+
|
227 |
+
- 實作活動 (25 分鐘)
|
228 |
+
材料準備:每位學生發放正方形貼紙、剪刀、膠水和紙張。
|
229 |
+
創意剪貼:學生使用對摺技巧製作不同的幾何形狀,並將它們組合成一個有關斜屋頂的圖案或其他創意設計。
|
230 |
+
面積計算:學生計算他們設計中每種形狀的面積,以及整體設計的總面積。
|
231 |
+
|
232 |
+
- 分享與討論 (10 分鐘)
|
233 |
+
學生展示他們的創作並分享他們的設計過程,包括面積如何影響他們的設計選擇。
|
234 |
+
討論學生在創作過程中遇到的挑戰和他們如何解決。
|
235 |
+
|
236 |
+
- 總結 (5 分鐘)
|
237 |
+
回顧課程學到的主要概念。
|
238 |
+
鼓勵學生在家中嘗試更多的創意組合和面積計算。
|
239 |
+
|
240 |
+
- 課後活動
|
241 |
+
建議學生使用家中的材料(如報紙、雜誌等)進行更多的創意剪貼,並嘗試計算不同形狀的面積,進一步鞏固今天學到的知識。
|
242 |
+
|
243 |
+
【教學策略總結】
|
244 |
+
通過這個課程計劃,學生不僅能夠學習數學知識,還能夠將這些知識應用於實際生活中,從而增強他們的創造力和問題解決能力。
|
245 |
+
"""
|
246 |
+
|
247 |
+
return lesson_plan_prompt
|
248 |
+
|
249 |
+
def create_ai_content(self, ai_client, request_payload):
|
250 |
+
user_content = self.build_user_content()
|
251 |
+
messages = self.build_messages(user_content)
|
252 |
+
request_payload['messages'] = messages
|
253 |
+
response_content = self.send_ai_request(ai_client, request_payload)
|
254 |
+
|
255 |
+
return response_content
|
256 |
+
|
257 |
+
def build_user_content(self):
|
258 |
+
if self.content_type == 'worksheet':
|
259 |
+
specific_feature_text = f"理論模型: {self.specific_feature}"
|
260 |
+
elif self.content_type == 'lesson_plan':
|
261 |
+
specific_feature_text = f"時間: {self.specific_feature}分鐘"
|
262 |
+
|
263 |
+
# 根据属性构建用户内容
|
264 |
+
user_content = f"""
|
265 |
+
課程脈絡 or 逐字稿:{self.context}
|
266 |
+
主題:{self.topic}
|
267 |
+
年級:{self.grade}
|
268 |
+
難度:{self.level}
|
269 |
+
{specific_feature_text}
|
270 |
+
|
271 |
+
請根據逐字稿進行以下工作:
|
272 |
+
不要提到 【逐字稿】 這個詞,直接給出工作內容即可
|
273 |
+
如果是中文素材,請嚴格使用 zh-TW
|
274 |
+
{self.generate_content_prompt()}
|
275 |
+
"""
|
276 |
+
print("====User content====")
|
277 |
+
print(user_content)
|
278 |
+
print("====User content====")
|
279 |
+
return user_content
|
280 |
+
|
281 |
+
def build_messages(self, user_content):
|
282 |
+
messages = [{"role": "system", "content": self.system_content},
|
283 |
+
{"role": "user", "content": user_content}]
|
284 |
+
return messages
|
285 |
+
|
286 |
+
def send_ai_request(self, ai_client, request_payload):
|
287 |
+
try:
|
288 |
+
response = ai_client.chat.completions.create(**request_payload)
|
289 |
+
response_content = response.choices[0].message.content.strip()
|
290 |
+
return response_content
|
291 |
+
except Exception as e:
|
292 |
+
print(f"An error occurred: {e}")
|
293 |
+
return "Error generating content."
|
294 |
+
|
295 |
+
def build_fine_tune_user_content(self, original_prompt, result, fine_tune_prompt):
|
296 |
+
user_content = f"""
|
297 |
+
這是逐字稿:{self.context}
|
298 |
+
---
|
299 |
+
這是預設的 prompt
|
300 |
+
{original_prompt}
|
301 |
+
---
|
302 |
+
產生了以下的結果:
|
303 |
+
{result}
|
304 |
+
---
|
305 |
+
但我不是很滿意,請根據以下的調整,產生新的結果
|
306 |
+
{fine_tune_prompt}
|
307 |
+
"""
|
308 |
+
return user_content
|
requirements.txt
CHANGED
@@ -12,6 +12,5 @@ google-api-python-client
|
|
12 |
google-auth-httplib2
|
13 |
google-auth-oauthlib
|
14 |
google-cloud-storage
|
15 |
-
|
16 |
groq
|
17 |
-
|
|
|
12 |
google-auth-httplib2
|
13 |
google-auth-oauthlib
|
14 |
google-cloud-storage
|
|
|
15 |
groq
|
16 |
+
yt_dlp
|