EduTechTeam commited on
Commit
88a8512
·
verified ·
1 Parent(s): 6974aea

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -41
app.py CHANGED
@@ -4,66 +4,54 @@ import PyPDF2
4
  import os
5
  from datetime import datetime
6
 
7
- # ✅ 設定 OpenAI API Key(從 Hugging Face Secrets 取得)
8
  openai.api_key = os.getenv("OPENAI_API_KEY")
9
 
10
- # ✅ 主題與難度設定
11
  topics = ["教育哲學", "教育社會學", "教育心理學", "課程與教學", "教學原理", "班級經營", "教育測驗與評量", "青少年問題與輔導"]
12
  difficulties = ["簡單", "中等", "困難"]
13
 
14
- # ✅ 錯題紀錄初始化
15
  user_errors = {}
16
  error_history = {}
17
 
18
- # ✅ PDF 教材位置
19
  DEFAULT_PDF_PATH = "教材.pdf"
20
 
21
- # ✅ 擷取 PDF 文字內容
22
  def extract_text_from_pdf():
23
  if not os.path.exists(DEFAULT_PDF_PATH):
24
- print(f"[錯誤] 教材檔案未找到:{DEFAULT_PDF_PATH}")
25
  return ""
26
  try:
27
- with open(DEFAULT_PDF_PATH, "rb") as pdf_file:
28
- reader = PyPDF2.PdfReader(pdf_file)
29
- text = ""
30
- for page in reader.pages:
31
- text += page.extract_text() or ""
32
- return text
33
  except Exception as e:
34
- print(f"[錯誤] 讀取 PDF 失敗:{e}")
35
  return ""
36
 
37
  pdf_text = extract_text_from_pdf()
38
 
39
- # ✅ 生成題目
40
  def generate_question(topic, difficulty):
41
  if not pdf_text.strip():
42
- return "⚠️ 無法載入教材內容,請確認 PDF 是否存在或格式正確。"
43
-
44
  prompt = f"請根據以下教育學教材內容,設計一個屬於「{topic}」主題、「{difficulty}」難度的考題:\n\n{pdf_text}"
45
-
46
  try:
47
  response = openai.ChatCompletion.create(
48
  model="gpt-4",
49
  messages=[
50
- {"role": "system", "content": "你是一位教育專家,請根據教材內容提供符合主題的問題。"},
51
  {"role": "user", "content": prompt}
52
  ]
53
  )
54
- return response['choices'][0]['message']['content']
55
  except Exception as e:
56
- return f"⚠️ AI 生成失敗:{str(e)}"
57
 
58
- # ✅ 分析學生回答
59
  def analyze_answer(user_input, topic):
60
  global user_errors, error_history
61
-
62
  if not user_input.strip():
63
- return "⚠️ 請先輸入你的回答。"
64
  if not pdf_text.strip():
65
- return "⚠️ 無法載入教材內容,請確認 PDF 是否存在或格式正確。"
66
-
67
  current_date = datetime.today().strftime("%Y-%m-%d")
68
  prompt = f"請根據以下教材內容,檢查學生的回答是否正確,並提供正確答案與講解:\n{pdf_text}\n\n學生回答:'{user_input}'"
69
 
@@ -71,15 +59,14 @@ def analyze_answer(user_input, topic):
71
  response = openai.ChatCompletion.create(
72
  model="gpt-4",
73
  messages=[
74
- {"role": "system", "content": "你是一位教育專家,請根據教材內容分析學生的回答,並提供正確答案與講解。"},
75
  {"role": "user", "content": prompt}
76
  ]
77
  )
78
- feedback = response['choices'][0]['message']['content']
79
  except Exception as e:
80
- return f"⚠️ AI 回應失敗:{str(e)}"
81
 
82
- # 簡單判斷是否為錯誤回答
83
  if "❌" in feedback or "錯" in feedback:
84
  user_errors[topic] = user_errors.get(topic, 0) + 1
85
  error_history.setdefault(current_date, []).append({
@@ -87,26 +74,18 @@ def analyze_answer(user_input, topic):
87
  "回答": user_input,
88
  "AI 分析": feedback
89
  })
90
-
91
  return feedback
92
 
93
- # ✅ 錯題查詢
94
  def get_errors_by_date_safe(date_str):
95
  try:
96
  datetime.strptime(date_str, "%Y-%m-%d")
97
  except ValueError:
98
- return "⚠️ 日期格式錯誤,請使用 YYYY-MM-DD"
99
-
100
  errors = error_history.get(date_str)
101
  if not errors:
102
- return "✅ 該日期沒有錯題紀錄"
103
-
104
- return "\n\n".join([
105
- f"🔹 題目: {e['題目']}\n📝 回答: {e['回答']}\n📖 AI 分析: {e['AI 分析']}"
106
- for e in errors
107
- ])
108
 
109
- # ✅ Gradio UI
110
  with gr.Blocks() as demo:
111
  gr.Markdown("# 👨‍🏫 教師檢定智慧陪讀家教 🚀")
112
 
@@ -135,4 +114,4 @@ with gr.Blocks() as demo:
135
  inputs=date_input,
136
  outputs=error_history_output)
137
 
138
- demo.launch()
 
4
  import os
5
  from datetime import datetime
6
 
7
+ # ✅ openai 0.28:API 金鑰設定
8
  openai.api_key = os.getenv("OPENAI_API_KEY")
9
 
 
10
  topics = ["教育哲學", "教育社會學", "教育心理學", "課程與教學", "教學原理", "班級經營", "教育測驗與評量", "青少年問題與輔導"]
11
  difficulties = ["簡單", "中等", "困難"]
12
 
 
13
  user_errors = {}
14
  error_history = {}
15
 
 
16
  DEFAULT_PDF_PATH = "教材.pdf"
17
 
 
18
  def extract_text_from_pdf():
19
  if not os.path.exists(DEFAULT_PDF_PATH):
20
+ print(f"[錯誤] 教材未找到:{DEFAULT_PDF_PATH}")
21
  return ""
22
  try:
23
+ with open(DEFAULT_PDF_PATH, "rb") as f:
24
+ reader = PyPDF2.PdfReader(f)
25
+ return "\n".join([page.extract_text() or "" for page in reader.pages])
 
 
 
26
  except Exception as e:
27
+ print(f"[錯誤] PDF 載入失敗:{e}")
28
  return ""
29
 
30
  pdf_text = extract_text_from_pdf()
31
 
 
32
  def generate_question(topic, difficulty):
33
  if not pdf_text.strip():
34
+ return "⚠️ 無法載入教材內容,請確認 PDF 是否存在。"
 
35
  prompt = f"請根據以下教育學教材內容,設計一個屬於「{topic}」主題、「{difficulty}」難度的考題:\n\n{pdf_text}"
 
36
  try:
37
  response = openai.ChatCompletion.create(
38
  model="gpt-4",
39
  messages=[
40
+ {"role": "system", "content": "你是一位教育專家,請根據教材內容設計問題。"},
41
  {"role": "user", "content": prompt}
42
  ]
43
  )
44
+ return response["choices"][0]["message"]["content"]
45
  except Exception as e:
46
+ return f"⚠️ 發生錯誤:{e}"
47
 
 
48
  def analyze_answer(user_input, topic):
49
  global user_errors, error_history
 
50
  if not user_input.strip():
51
+ return "⚠️ 請輸入回答。"
52
  if not pdf_text.strip():
53
+ return "⚠️ 教材內容未載入,請確認 PDF"
54
+
55
  current_date = datetime.today().strftime("%Y-%m-%d")
56
  prompt = f"請根據以下教材內容,檢查學生的回答是否正確,並提供正確答案與講解:\n{pdf_text}\n\n學生回答:'{user_input}'"
57
 
 
59
  response = openai.ChatCompletion.create(
60
  model="gpt-4",
61
  messages=[
62
+ {"role": "system", "content": "你是一位教育專家,請根據教材內容分析學生回答。"},
63
  {"role": "user", "content": prompt}
64
  ]
65
  )
66
+ feedback = response["choices"][0]["message"]["content"]
67
  except Exception as e:
68
+ return f"⚠️ 發生錯誤:{e}"
69
 
 
70
  if "❌" in feedback or "錯" in feedback:
71
  user_errors[topic] = user_errors.get(topic, 0) + 1
72
  error_history.setdefault(current_date, []).append({
 
74
  "回答": user_input,
75
  "AI 分析": feedback
76
  })
 
77
  return feedback
78
 
 
79
  def get_errors_by_date_safe(date_str):
80
  try:
81
  datetime.strptime(date_str, "%Y-%m-%d")
82
  except ValueError:
83
+ return "⚠️ 日期格式錯誤,請使用 YYYY-MM-DD"
 
84
  errors = error_history.get(date_str)
85
  if not errors:
86
+ return "✅ 該日無錯題紀錄。"
87
+ return "\n\n".join([f"🔹 題目: {e['題目']}\n📝 回答: {e['回答']}\n📖 AI 分析: {e['AI 分析']}" for e in errors])
 
 
 
 
88
 
 
89
  with gr.Blocks() as demo:
90
  gr.Markdown("# 👨‍🏫 教師檢定智慧陪讀家教 🚀")
91
 
 
114
  inputs=date_input,
115
  outputs=error_history_output)
116
 
117
+ demo.launch()