File size: 8,261 Bytes
ce5b5d6
 
 
 
 
 
 
 
 
221acd3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce5b5d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
from dotenv import load_dotenv
from openai import OpenAI
from prompts.initial_prompt import INITIAL_PROMPT
from prompts.main_prompt import MAIN_PROMPT

# .env ํŒŒ์ผ์—์„œ OPENAI_API_KEY ๋กœ๋“œ
if os.path.exists(".env"):
    load_dotenv(".env")Module 10: Developing Conceptual Understanding through Tables and Proportional Reasoning

Task Introduction
"Welcome to the final module in this series! In this module, youโ€™ll watch a video of a lesson on proportional reasoning involving tables. Youโ€™ll reflect on the teacherโ€™s practices, how students connect their reasoning, and the ways these practices address Common Core standards. Letโ€™s dive in!"

Video:
"Watch the video provided at this link. Before watching how students approach the task, solve it yourself to reflect on your own reasoning."

๐Ÿš€ **Pre-Video Task Prompt**
Before watching the video, let's start by solving the problem.

1๏ธโƒฃ **How did you approach solving the problem?**
- What strategies did you use?
- Did you recognize proportional relationships within the table?

๐Ÿ›  **Hints if Needed**:
- Think about the relationships both horizontally (within rows) and vertically (between columns) in the table.
- How might unit rate play a role in reasoning proportionally?

After you solve the problem, **let me know**, and weโ€™ll move to the next step!

---

๐Ÿ“– **Post-Video Reflection Prompts**  
Now that youโ€™ve watched the video and solved the problem, letโ€™s reflect on different aspects of the lesson **one by one**:

### **Step 1: Observing Creativity-Directed Practices**
๐Ÿ”น What creativity-directed practices did you notice the teacher implementing during the lesson?  
๐Ÿ”น Reflect on how these practices supported studentsโ€™ reasoning and collaboration.  
  
๐Ÿ’ก **Hints if Needed**:
- Consider whether the teacher encouraged mathematical connections, collaborative problem-solving, or extended studentsโ€™ thinking beyond the unit rate.

โœ… When you're ready, **share your thoughts**, and we'll move to the next reflection.

---

### **Step 2: Student Reasoning and Connections**
๐Ÿ”น How did students connect the relationship between price and container size?  
๐Ÿ”น How did their reasoning evolve as they worked through the task?  

๐Ÿ’ก **Hints if Needed**:
- Did students start with the given information (e.g., the 24-ounce container costing $3)?
- How did they use this information to reason proportionally?

โœ… **Once you respond, weโ€™ll move on!**

---

### **Step 3: Teacher Actions in Small Groups**
๐Ÿ”น How did the teacherโ€™s actions during small group interactions reflect the studentsโ€™ reasoning?  
๐Ÿ”น How did the teacher use these interactions to inform whole-class discussions?  

๐Ÿ’ก **Hints if Needed**:
- Think about how the teacher listened to studentsโ€™ reasoning and used their ideas to guide the next steps.  
- What types of questions did the teacher ask?  

โœ… **Once you're ready, letโ€™s move forward!**

---

### **Step 4: Initial Prompts and Sense-Making**
๐Ÿ”น How did the teacher prompt students to initially make sense of the task?  
๐Ÿ”น What role did these prompts play in guiding studentsโ€™ reasoning?  

๐Ÿ’ก **Hints if Needed**:
- Did the teacher ask open-ended questions?
- How did these prompts help students engage with the task?

โœ… **Share your response, and weโ€™ll continue!**

---

### **Step 5: Common Core Practice Standards**
๐Ÿ”น What Common Core practice standards do you think the teacher emphasized during the lesson?  
๐Ÿ”น Choose four and explain how you observed these practices in action.  

๐Ÿ’ก **Hints if Needed**:
- Consider whether the teacher emphasized reasoning, collaboration, or modeling with mathematics.  
- How did the students demonstrate these practices?

โœ… **When youโ€™re ready, letโ€™s move to the final steps!**

---

### **Step 6: Problem Posing Activity**
๐Ÿ“ Based on what you observed, **pose a problem** that encourages students to use visuals and proportional reasoning.  
๐Ÿ”น What real-world context will you use?  
๐Ÿ”น How will students use visuals like bar models or tables to represent proportional relationships?  
๐Ÿ”น Does your problem encourage multiple solution paths?  

๐Ÿ’ก **Hints if Needed**:
- Try to design a problem where students can approach it differently but still apply proportional reasoning.

โœ… **Once you've created your problem, let me know!**

---

### **Step 7: Summary and Final Reflection**
๐Ÿ“š **Whatโ€™s one change you will make in your own teaching based on this module?**  
Reflect on a specific strategy, question type, or approach to representation that you want to implement.

๐Ÿ’ก **Encouraging Closing Statement**:  
"Great work completing all the modules! We hope youโ€™ve gained valuable insights into fostering creativity, connecting mathematical ideas, and engaging students in meaningful learning experiences. It was a pleasure working with youโ€”see you in the next professional development series!" ๐ŸŽ‰  


OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

client = OpenAI(api_key=OPENAI_API_KEY)



def gpt_call(history, user_message,
             model="gpt-4o-mini",
             max_tokens=512,
             temperature=0.7,
             top_p=0.95):
    """
    OpenAI ChatCompletion API๋ฅผ ํ†ตํ•ด ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜.
    - history: [(user_text, assistant_text), ...]
    - user_message: ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ์ž…๋ ฅํ•œ ๋ฉ”์‹œ์ง€
    """
    # 1) ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€(=MAIN_PROMPT)๋ฅผ ๊ฐ€์žฅ ์•ž์— ์ถ”๊ฐ€
    messages = [{"role": "system", "content": MAIN_PROMPT}]
    
    # 2) ๊ธฐ์กด ๋Œ€ํ™” ๊ธฐ๋ก(history)์„ OpenAI ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
    #    user_text -> 'user' / assistant_text -> 'assistant'
    for user_text, assistant_text in history:
        if user_text:
            messages.append({"role": "user", "content": user_text})
        if assistant_text:
            messages.append({"role": "assistant", "content": assistant_text})

    # 3) ๋งˆ์ง€๋ง‰์— ์ด๋ฒˆ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ถ”๊ฐ€
    messages.append({"role": "user", "content": user_message})

    # 4) OpenAI API ํ˜ธ์ถœ
    completion = client.chat.completions.create(
        model=model,
        messages=messages,
        max_tokens=max_tokens,
        temperature=temperature,
        top_p=top_p
    )
    return completion.choices[0].message.content

def respond(user_message, history):
    """
    Gradio ์ƒ์—์„œ submitํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
    - user_message: ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ์นœ ๋ฉ”์‹œ์ง€
    - history: ๊ธฐ์กด (user, assistant) ํŠœํ”Œ ๋ฆฌ์ŠคํŠธ
    """
    # ์‚ฌ์šฉ์ž๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์„ ๋ณด๋ƒˆ๋‹ค๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š์Œ
    if not user_message:
        return "", history

    # GPT ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์Œ
    assistant_reply = gpt_call(history, user_message)

    # history์— (user, assistant) ์Œ ์ถ”๊ฐ€
    history.append((user_message, assistant_reply))

    # Gradio์—์„œ๋Š” (์ƒˆ๋กœ ๋น„์›Œ์งˆ ์ž…๋ ฅ์ฐฝ, ๊ฐฑ์‹ ๋œ history)๋ฅผ ๋ฐ˜ํ™˜
    return "", history

##############################
#  Gradio Blocks UI
##############################
with gr.Blocks() as demo:
    gr.Markdown("## Simple Chat Interface")

    # Chatbot ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •
    # ์ฒซ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€๋Š” (user="", assistant=INITIAL_PROMPT) ํ˜•ํƒœ๋กœ ๋„ฃ์–ด
    # ํ™”๋ฉด์ƒ์—์„œ 'assistant'๊ฐ€ INITIAL_PROMPT๋ฅผ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•จ
    chatbot = gr.Chatbot(
        value=[("", INITIAL_PROMPT)],  # (user, assistant)
        height=500
    )

    # (user, assistant) ์Œ์„ ์ €์žฅํ•  ํžˆ์Šคํ† ๋ฆฌ ์ƒํƒœ
    # ์—ฌ๊ธฐ์„œ๋„ ๋™์ผํ•œ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ๋„ฃ์–ด์คŒ
    state_history = gr.State([("", INITIAL_PROMPT)])

    # ์‚ฌ์šฉ์ž ์ž…๋ ฅ
    user_input = gr.Textbox(
        placeholder="Type your message here...",
        label="Your Input"
    )

    # ์ž…๋ ฅ์ด submit๋˜๋ฉด respond() ํ˜ธ์ถœ โ†’ ์ถœ๋ ฅ์€ (์ƒˆ ์ž…๋ ฅ์ฐฝ, ๊ฐฑ์‹ ๋œ chatbot)
    user_input.submit(
        respond,
        inputs=[user_input, state_history],
        outputs=[user_input, chatbot]
    ).then(
        # respond ๋๋‚œ ๋’ค, ์ตœ์‹  history๋ฅผ state_history์— ๋ฐ˜์˜
        fn=lambda _, h: h,
        inputs=[user_input, chatbot],
        outputs=[state_history]
    )

# ๋ฉ”์ธ ์‹คํ–‰
if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0", server_port=7860, share=True)