alibicer's picture
Update app.py
221acd3 verified
raw
history blame
8.26 kB
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)