Spaces:
Sleeping
Sleeping
File size: 4,676 Bytes
921be27 88a8512 03bc31b 921be27 03bc31b 88a8512 03bc31b 88a8512 03bc31b 88a8512 03bc31b 921be27 03bc31b 88a8512 03bc31b 6bced76 03bc31b 88a8512 03bc31b 88a8512 03bc31b 88a8512 03bc31b 921be27 03bc31b 88a8512 03bc31b 88a8512 921be27 03bc31b 6bced76 03bc31b 88a8512 03bc31b 88a8512 03bc31b 88a8512 03bc31b 921be27 03bc31b 921be27 03bc31b 88a8512 03bc31b 88a8512 7628926 03bc31b 6e59977 03bc31b 6e59977 88a8512 |
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 |
import gradio as gr
import openai
import PyPDF2
import os
from datetime import datetime
# ✅ openai 0.28:API 金鑰設定
openai.api_key = os.getenv("OPENAI_API_KEY")
topics = ["教育哲學", "教育社會學", "教育心理學", "課程與教學", "教學原理", "班級經營", "教育測驗與評量", "青少年問題與輔導"]
difficulties = ["簡單", "中等", "困難"]
user_errors = {}
error_history = {}
DEFAULT_PDF_PATH = "教材.pdf"
def extract_text_from_pdf():
if not os.path.exists(DEFAULT_PDF_PATH):
print(f"[錯誤] 教材未找到:{DEFAULT_PDF_PATH}")
return ""
try:
with open(DEFAULT_PDF_PATH, "rb") as f:
reader = PyPDF2.PdfReader(f)
return "\n".join([page.extract_text() or "" for page in reader.pages])
except Exception as e:
print(f"[錯誤] PDF 載入失敗:{e}")
return ""
pdf_text = extract_text_from_pdf()
def generate_question(topic, difficulty):
if not pdf_text.strip():
return "⚠️ 無法載入教材內容,請確認 PDF 是否存在。"
prompt = f"請根據以下教育學教材內容,設計一個屬於「{topic}」主題、「{difficulty}」難度的考題:\n\n{pdf_text}"
try:
response = openai.ChatCompletion.create(
model="gpt-4o-mini-2024-07-18",
messages=[
{"role": "system", "content": "你是一位教育專家,請根據教材內容設計問題。"},
{"role": "user", "content": prompt}
]
)
return response["choices"][0]["message"]["content"]
except Exception as e:
return f"⚠️ 發生錯誤:{e}"
def analyze_answer(user_input, topic):
global user_errors, error_history
if not user_input.strip():
return "⚠️ 請輸入回答。"
if not pdf_text.strip():
return "⚠️ 教材內容未載入,請確認 PDF。"
current_date = datetime.today().strftime("%Y-%m-%d")
prompt = f"請根據以下教材內容,檢查學生的回答是否正確,並提供正確答案與講解:\n{pdf_text}\n\n學生回答:'{user_input}'"
try:
response = openai.ChatCompletion.create(
model="gpt-4o-mini-2024-07-18",
messages=[
{"role": "system", "content": "你是一位教育專家,請根據教材內容分析學生回答。"},
{"role": "user", "content": prompt}
]
)
feedback = response["choices"][0]["message"]["content"]
except Exception as e:
return f"⚠️ 發生錯誤:{e}"
if "❌" in feedback or "錯" in feedback:
user_errors[topic] = user_errors.get(topic, 0) + 1
error_history.setdefault(current_date, []).append({
"題目": topic,
"回答": user_input,
"AI 分析": feedback
})
return feedback
def get_errors_by_date_safe(date_str):
try:
datetime.strptime(date_str, "%Y-%m-%d")
except ValueError:
return "⚠️ 日期格式錯誤,請使用 YYYY-MM-DD。"
errors = error_history.get(date_str)
if not errors:
return "✅ 該日無錯題紀錄。"
return "\n\n".join([f"🔹 題目: {e['題目']}\n📝 回答: {e['回答']}\n📖 AI 分析: {e['AI 分析']}" for e in errors])
with gr.Blocks() as demo:
gr.Markdown("# 👨🏫 教師檢定智慧陪讀家教 🚀")
with gr.Row():
topic_input = gr.Dropdown(choices=topics, label="選擇複習主題")
difficulty_input = gr.Dropdown(choices=difficulties, label="選擇難度等級")
ask_btn = gr.Button("🎯 生成問題")
question_output = gr.Textbox(label="AI 生成的問題", lines=4)
ask_btn.click(fn=lambda t, d: generate_question(t, d),
inputs=[topic_input, difficulty_input],
outputs=question_output)
user_answer = gr.Textbox(label="你的回答", lines=3)
analyze_btn = gr.Button("📊 分析回答")
analysis_result = gr.Textbox(label="AI 分析與講解", lines=5)
analyze_btn.click(fn=lambda ans, topic: analyze_answer(ans, topic),
inputs=[user_answer, topic_input],
outputs=analysis_result)
gr.Markdown("---")
gr.Markdown("📅 查詢錯題紀錄")
date_input = gr.Textbox(label="輸入日期(YYYY-MM-DD)")
search_errors_btn = gr.Button("🔍 查看該日期錯題")
error_history_output = gr.Textbox(label="錯題紀錄", lines=5)
search_errors_btn.click(fn=get_errors_by_date_safe,
inputs=date_input,
outputs=error_history_output)
demo.launch()
|