File size: 17,292 Bytes
a7f852c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
import json

class EducationalMaterial:
    """
    A class to generate educational content based on provided parameters.
    
    Attributes:
        context (str): Context or transcript of the content.
        topic (str): The topic of the content.
        grade (str): The grade level for the content.
        level (str): The difficulty level of the content.
        specific_feature (str): A specific feature of the content.
        content_type (str): The type of content to generate ('worksheet' or 'lesson_plan').
    """
    def __init__(self, context, topic, grade, level, specific_feature, content_type):
        """
        Initializes the EducationalMaterial with provided parameters.
        
        Parameters:
            context (str): Context or transcript of the content.
            topic (str): The topic of the content.
            grade (str): The grade level for the content.
            level (str): The difficulty level of the content.
            specific_feature (str): A specific feature of the content.
            content_type (str): The type of content to generate ('worksheet' or 'lesson_plan').
        """
        self.context = self._prepare_context(context)
        self.topic = topic
        self.grade = grade
        self.level = level
        self.specific_feature = specific_feature
        self.content_type = content_type  # 'worksheet' or 'lesson_plan'
        self.system_content = "你是一個擅長資料分析跟影片教學備課的老師,請精讀資料文本,自行判斷資料的種類,使用 zh-TW"

    def _prepare_context(self, context):
        context_json = json.loads(context)
        for entry in context_json:
            entry.pop('embed_url', None)
            entry.pop('screenshot_path', None)
        processed_context = json.dumps(context_json, ensure_ascii=False, indent=2)
        return processed_context

    def generate_content_prompt(self):
        if self.content_type == 'worksheet':
            return self._generate_worksheet_prompt()
        elif self.content_type == 'lesson_plan':
            return self._generate_lesson_plan_prompt()

    def _generate_worksheet_prompt(self):
        bloom_worksheet_prompt = """
        你是個專業的教師,熟悉布魯姆(Benjamin Bloom, 1964) 的認知理論。布魯姆認為人類的能力,大致可分為三個領域(domains),即認知領域(cognitive domain)、情意領域(affective domain)、技能領域 (psychomotor domain)。
        
        【認知領域】涉及知能及其運作,著重心智、學習以及問題解決的工作。認知目標從簡單的認識或記憶能力到複雜的評鑑能力。大部分的教育目標都屬於這個領域。認知領域的目標分為六個層次,每個層次代表不同的心智功能。
        - 📖 知識:在認知目標中知識是最低層次的能力,包括名詞、事實、規則和原理原則等的認識和記憶。用來表示此種能力的行為動詞有:指出、寫出、界定、說明、舉例、命名、認明等。例:能在地圖上指出長江流經的省分。
        - 🤔 理解:理解是指能把握所學過知識或概念的意義,包含轉譯、解釋、推論等能力。代表此能力的行為動詞有:解釋、說明、區別、舉例、摘要、歸納等。例:能解釋光合作用。
        - 🛠️ 應用:應用是指將所學到的規則、方法、步驟、原理、原則和概念,應用到新情境的能力。用來表示此能力的行為動詞有:預測、證明、解決、修改、表現、應用等。例:學生能預測抽出容器內之氣體對容器的影響。
        - 🔍 分析:分析是指將所學到的概念或原則,分析為各個構成的部分,或找出各部分之間的相互關係,包括要素、關係及組織原理等的分析。用以表示此種能力的行為動詞有:選出、分析、判斷:區分、指出某些組成要素、指出某些的相互關係等。例:讀完某篇文章後,學生能區分事實和意見。
        - 🌐 綜合:綜合是指將所學到的片斷概念或知識、原理原則或事實,統整成新的整體。用來表示此種能力的行為動詞有:設計、組織、綜合、創造、歸納、聯合等。例:讀完一篇有關防治汙染的文章後,學生能綜合防治汙染的各種方法。
        - 🏅 評鑑:評鑑是認知目標中最高層次的能力,指依據某項標準做價值的判斷的能力。用來表示此能力的行為動詞有:評鑑、判斷、評論、比較、批判等。例:學生能評斷辯論中的謬論。

        學習單包含以下的內容,將以布魯姆教育目標來建構提問的架構;請用 markdown 格式來呈現。
        - 📝 主題:請使用上傳檔案的檔名作為標題
        - 🔑 重點: 和影片有關重要知識摘要
        - 💭 概念:概念性問題 - 布魯姆的知識層級;數學知識的建構
        - 📊 計算:程序性問題 - 布魯姆的理解層級;和影片相同的例題,類似的練習題 → 計算與步驟操作
        - 🚀 延伸與應用 - 布魯姆的應用、分析、綜合、評鑑層級 → 延伸思考與應用
        
        其中,「重點」的題目請用挖空的填空題;在「計算」的程序性問題請以單選題或填空題的形式來建立,需要 3 個題目;「延伸與應用」請使用問答題的形式來建立,一題即可。
        題目和題目之間要換行,並加上 point 符號,像是 "-" 或是 "1." 等等

        這是範例格式:
        🌐【主題】:認識公里

        🎓【對象】 
        科目: 數學
        年級: 三年級
        難度: 基礎

        🏞️【情境描述】
        狐狸貓和家人出遊,過程中認識測量較長距離的單位「公里」。

        🔑【影片重點】
        - 公里是用來測量長距離的單位,通常用於測量很遠的距離。
        - 1公里等於___公尺,也稱為千米。
        - 公里的英文簡寫是 ____。

        🌟【概念】
        - 請問公里通常用於測量什麼類型的距離?
        - 如果一圈操場是200公尺,那跑5圈是多少公尺?多少公里?
        - 為什麼我們需要使用公里這個單位來測量距離?

        🔢【計算】
        1. 一圈操場是200公尺,跑10圈是多少公里?(A) 1公里 (B) 2公里 (C) 3公里 (D) 4公里
        2. 如果你跑了5圈操場,運動手環上會顯示你跑了多少公里?
        3. 6000公尺等於多少公里?

        💡【延伸與應用】
        - 假設你參加一場慈善路跑活動,全程是5公里。如果你已經跑了3公里,還剩下多少公里?你覺得這樣的活動對你的體能有什麼影響?
        """

        Polya_worksheet_prompt = """
        你是個專業的教師,熟悉 George Polya(1945) 的數學問題解決策略。
        Polya提出了一個四步驟的數學問題解決策略,在他影響深遠的經典著作 How to solve it《如何解題》中指出解難過程可分為四個階段:
        (1) 理解問題 (understanding the problem)
        (2) 設計解題策略 (devising a plan)
        (3) 按步解題 (carrying out the plan)
        (4) 回顧解答 (looking back) (edited) 

        請以此設計學習單並依據文本跟難度給予題目
        請一定要使用 zh-TW
        
        這是範例格式:
        🌐 主題:【概念】認識公里

        🎓【對象】
        科目: 數學
        年級: 三年級
        難度: 基礎

        🏞️【情境描述】
        狐狸貓和家人出遊,過程中認識測量較長距離的單位「公里」。

        ❓【給出問題】
        - 如果日月潭環潭自行車道共30公里,狐狸貓騎行了13.7公里後休息,剩餘多少公里尚未騎行?
        
        🤔【理解問題】
        首先,我們必須完全理解問題的所有細節。在此情境中,我們需要釐清以下幾點:
        - 日月潭環潭自行車道的總長度為30公里。
        - 狐狸貓已經騎行了13.7公里。
        - 我們的目標是計算狐狸貓還剩下多少公里未騎行。

        🧭【設計解題策略】
        接下來,根據我們對問題的理解來設計解決問題的計劃。在此步驟中,我們決定採用哪種策略來解決問題。對於這個問題,最直接的計劃是使用算術減法:
        - 總公里數(30公里)減去已騎行的公里數(13.7公里)。

        📝【按步解題】
        按照設計的計劃執行解題步驟。在這裡我們執行減法運算:
        30−13.7=16.3
        這意味著狐狸貓還有16.3公里未騎行。

        ✨【回顧解答】
        最後,解題完成後,我們回顧和反思整個解題過程。在這一步,我們驗證計算的結果是否符合邏輯,是否正確解決了原問題。
        同時,考慮是否有更有效或簡便的方法來解決類似的問題。在這個例子中,使用直接減法是最簡單直接的方法。
        但在其他情境下,可能需要考慮使用圖形、表格或代數表達式等其他策略來解決問題。
        """
        
        # CRA教學法
        cra_worksheet_prompt = """
        你是個專業的教師,熟悉CRA教學法,CRA教學法是一種教學策略,
        CRA正是一種用來促進學生學習和記憶數學的三步教學法,它闡明瞭用這種方式進行教學的具體步驟。
        CRA的三個步驟互相依賴,運用CRA能建立起一種概念結構,從而形成知識的意義關聯。
        CRA策略的第一個階段, 即實例(C)階段,是一個“做”的階段。在這一階段,教師用加工材料建模,這些材料包括彩色圓片、立方體、十進位積木、六形六色積木,以及分數積木,等等。在使用這些材料時,必須考慮到兒童的視覺、觸覺及動感經驗。
        階段二,即描述(R)階段,是一個“看”的階段。在這一-階段,具體的模型被改成了圖片展示,教師可用手繪圖片或貼紙來對概念進行解釋。
        最後一個階段,即抽象(A)階段,是一個抽象的“符號”階段, 在這一階段, 教師使用數字、字母等數學符號(如:2, 6, 3x, +,-等)來進行教學。
        運用CRA的前提是學生在學習“規則”前必須學會概念。使用過加工材料的學生,其思維更加明確,更容易理解該方式,同時其學習動機、專注行爲、 理解力以及對這些概念的運用能力也會得到較大改善( Hrrison & Harison, 1986 )。
        CRA策略可以有效地幫助學生理解以下幾個概念:早期數量關係、位值、計算、分數、小數、測量、幾何、貨幣、百分數、數基、應用題、概率以及統計等
        這是範例格式:
        🌐 主題:【概念】認識公里

        🎓【對象】
        科目: 數學
        年級: 三年級
        難度: 基礎

        【實例(C)階段】
        1. 用彩色圓片來解釋什麼是分數?
        2. 用立方體來解釋什麼是體積?
        3. 用十進位積木來解釋什麼是小數?

        【描述(R)階段】
        1. 用手繪圖片來解釋什麼是分數?
        2. 用貼紙來解釋什麼是體積?
        3. 用手繪圖片來解釋什麼是小數?

        【抽象(A)階段】
        1. 用數字來解釋什麼是分數?
        2. 用字母來解釋什麼是體積?
        3. 用數字來解釋什麼是小數?
        
        """
        algorithm = self.specific_feature
        case = {
            "Bloom認知階層理論": bloom_worksheet_prompt,
            "Polya數學解題法": Polya_worksheet_prompt,
            "CRA教學法": cra_worksheet_prompt
        }
        worksheet_prompt = case.get(algorithm, "Bloom認知階層理論")

        return worksheet_prompt

    def _generate_lesson_plan_prompt(self):
        lesson_plan_prompt = """
        你是一位專業教師,
        請根據以上要教學的項目細節
        幫我安排一個 lesson plan

        規則如下,請嚴格遵守
        1. 請使用 zh-TW
        2. 該換行就換行,盡量滿足 word .doc 的格式 
        3. 【課程大綱】的工作項目請嚴格遵守【課程時間】的時間長度,總和時間不要超過或不足
        4. 時間安排盡量以五分鐘的倍數為一個單位
        5. 並且根據課程目標安排教學內容
        
        範例:
        【課程主題】計算面積的創意設計

        【課程目標】
        - 理解不同形狀(正方形、長方形、三角形)的面積計算方法。
        - 學會如何通過對摺改變形狀並計算新形狀的面積。
        - 鼓勵創造力和實際操作,將數學知識應用於創作中。

        【年級】國小三年級

        【難度】基礎

        【課程時間】60 分鐘
        
        【課程大綱】
        - 開場介紹 (5 分鐘)
        簡短介紹今天的課程主題和目標。
        
        -  講解與示範 (15 分鐘)
        形狀與面積:介紹基本幾何形狀(正方形、長方形、三角形)的面積計算公式。
        對摺技巧:示範如何通過對摺正方形貼紙創造新的形狀(半正方形、三角形)並解釋面積如何改變。
        應用討論:討論如何使用這些形狀創造不同的圖案或設計,特別是斜屋頂的設計。
        
        - 實作活動 (25 分鐘)
        材料準備:每位學生發放正方形貼紙、剪刀、膠水和紙張。
        創意剪貼:學生使用對摺技巧製作不同的幾何形狀,並將它們組合成一個有關斜屋頂的圖案或其他創意設計。
        面積計算:學生計算他們設計中每種形狀的面積,以及整體設計的總面積。

        - 分享與討論 (10 分鐘)
        學生展示他們的創作並分享他們的設計過程,包括面積如何影響他們的設計選擇。
        討論學生在創作過程中遇到的挑戰和他們如何解決。
        
        - 總結 (5 分鐘)
        回顧課程學到的主要概念。
        鼓勵學生在家中嘗試更多的創意組合和面積計算。
        
        - 課後活動
        建議學生使用家中的材料(如報紙、雜誌等)進行更多的創意剪貼,並嘗試計算不同形狀的面積,進一步鞏固今天學到的知識。
        
        【教學策略總結】
        通過這個課程計劃,學生不僅能夠學習數學知識,還能夠將這些知識應用於實際生活中,從而增強他們的創造力和問題解決能力。
        """

        return lesson_plan_prompt

    def create_ai_content(self, ai_client, request_payload):
        user_content = self.build_user_content()
        messages = self.build_messages(user_content)
        request_payload['messages'] = messages
        response_content = self.send_ai_request(ai_client, request_payload)
        
        return response_content

    def build_user_content(self):
        if self.content_type == 'worksheet':
            specific_feature_text = f"理論模型: {self.specific_feature}"
        elif self.content_type == 'lesson_plan':
            specific_feature_text = f"時間: {self.specific_feature}分鐘"

        # 根据属性构建用户内容
        user_content = f"""
            課程脈絡 or 逐字稿:{self.context}
            主題:{self.topic}
            年級:{self.grade}
            難度:{self.level}
            {specific_feature_text}
            
            請根據逐字稿進行以下工作:
            不要提到 【逐字稿】 這個詞,直接給出工作內容即可
            如果是中文素材,請嚴格使用 zh-TW
            {self.generate_content_prompt()}
        """
        print("====User content====")
        print(user_content)
        print("====User content====")
        return user_content

    def build_messages(self, user_content):
        messages = [{"role": "system", "content": self.system_content},
                    {"role": "user", "content": user_content}]
        return messages
    
    def send_ai_request(self, ai_client, request_payload):
        try:
            response = ai_client.chat.completions.create(**request_payload)
            response_content = response.choices[0].message.content.strip()
            return response_content
        except Exception as e:
            print(f"An error occurred: {e}")
            return "Error generating content."

    def build_fine_tune_user_content(self, original_prompt, result, fine_tune_prompt):
        user_content = f"""
            這是逐字稿:{self.context}
            ---
            這是預設的 prompt
            {original_prompt}
            ---
            產生了以下的結果:
            {result}
            ---
            但我不是很滿意,請根據以下的調整,產生新的結果
            {fine_tune_prompt}
        """
        return user_content