python+html实现学生与ai私教一对一关键知识点教育培训系统代码
代码语言:python
所属分类:其他
代码描述:python+html实现学生与ai私教一对一关键知识点教育培训系统代码,提出一个想学的知识点,ai老师会与你沟通讲解,并一步一步教会你并给你出题验证是否学会,还会对你进行综合的评估。接入兼容openai的任意ai大模型api即可,默认千问。
代码标签: python html 学生 ai 私教 一对一 关键 知识点 教育 培训 系统 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
import os
import json
import sqlite3
from flask import Flask, request, jsonify, session
from werkzeug.security import generate_password_hash, check_password_hash
from openai import OpenAI
app = Flask(__name__)
# 生产环境中建议修改此密钥,确保 session 安全
app.secret_key = os.environ.get("FLASK_SECRET_KEY", "eduspark_qwen_secret_key_1024")
DB_FILE = "tutor_system.db"
# =====================================================================
# 通义千问 服务配置
# =====================================================================
# 1. 默认模型名称:推荐使用 qwen-plus(综合能力强,性价比极高)或 qwen-max(旗舰模型)
OPENAI_MODEL = os.environ.get("OPENAI_API_MODEL", "qwen-plus")
# 2. 阿里云百炼平台官方兼容端点 (国内推荐使用 dashscope.aliyuncs.com)
OPENAI_BASE_URL = os.environ.get("OPENAI_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1")
# =====================================================================
# ----------------- 数据库初始化 -----------------
def get_db():
conn = sqlite3.connect(DB_FILE)
conn.row_factory = sqlite3.Row
return conn
def init_db():
with get_db() as conn:
conn.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL
)
''')
conn.execute('''
CREATE TABLE IF NOT EXISTS topics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
topic_name TEXT NOT NULL,
global_summary TEXT,
current_phase TEXT DEFAULT 'introduction',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (id)
)
''')
conn.execute('''
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
topic_id INTEGER NOT NULL,
role TEXT NOT NULL,
content TEXT NOT NULL,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (topic_id) REFERENCES topics (id)
)
''')
conn.commit()
# ----------------- Qwen 状态压缩逻辑 -----------------
def compress_history_if_needed(topic_id, client):
"""
当对话累积到一定长度,触发背景提炼逻辑,
提取出学生当前的认知画像并更新至全局记忆中。
"""
conn = get_db()
cursor = conn.cursor()
# 【修复点】改为统计用户发送的消息数(即真实的对话轮数),避免初始AI欢迎语导致奇偶数判断失误
cursor.execute("SELECT COUNT(*) FROM messages WHERE topic_id = ? AND role = 'user'", (topic_id,))
rounds_count = cursor.fetchone()[0]
# 达到 6 轮对话后,每 2 轮自动触发一次状态压缩与摘要生成
if rounds_count >= 6 and rounds_count % 2 == 0:
cursor.execute("SELECT role, content FROM messages WHERE topic_id = ? ORDER BY timestamp ASC", (topic_id,))
rows = cursor.fetchall()
conversation_text = ""
for r in rows:
role_zh = "学生" if r['role'] == 'user' else "导师"
conversation_text += f"{role_zh}: {r['content']}\n"
# 【修复点】提示词全部改为中文
prompt = (
"你是一个 AI 教学分析专家。以下是一段学生与 AI 苏格拉底式导师之间的辅导对话。\n"
"请分析这段对话,并更新学生学习进度的结构化状态摘要。\n\n"
"包含内容:\n"
"1. 学生已经成功掌握并展示出的核心概念。\n"
"2. 当前正在探索的活跃概念或步骤。\n"
"3. 学生遇到的误解、困难或错误。\n"
"4. 下一步建议的教学调整方向。\n\n"
"请保持摘要紧凑、直接,字数控制在 250 字以内,以便有效地加载到上下文中。\n\n"
f"辅导对话内容:\n{conversation_text}"
)
try:
response = client.chat.completions.create(
model=OPENAI_MODEL,
messages=[{"role": "user", "content": prompt}]
)
summary = response.choices[0].message.content
cursor.execute("UPDATE topics SET global_summary = ? WHERE id = ?", (summary, topic_id))
conn.commit()
except Exception as e:
print(f"[Warning] 历史状态提取失败: {e}")
conn.close()
# ----------------- Flask 核心 API 路由 -----------------
@app.route('/')
def index():
return HTML_TEMPLATE
# --- 用户认证模块 ---
@app.route('/api/auth/register', methods=['POST'])
def register():
data = request.json or {}
username = data.get('username', '').strip()
password = data.get('password', '').strip()
if not username or not password:
return jsonify({'error': '用户名和密码不能为空'}), 400
conn = get_db()
cursor = conn.cursor()
try:
hashed = generate_password_hash(password)
cursor.execute("INSERT INTO users (username, password_hash) VALUES (?, ?)", (username, hashed))
conn.commit()
return jsonify({'status': 'success', 'message': '注册成功,请登录'})
except sqlite3.IntegrityError:
return jsonify({'error': '用户名已存在'}), 400
finally:
conn.close()
@app.route('/api/auth/login', methods=['POST'])
def login():
data = request.json or {}
username = data.get('username', '').strip()
password = data.get('password', '').strip()
conn = get_db()
cursor =.........完整代码请登录后点击上方下载按钮下载查看














网友评论0