Personalized Question Generation System Based on LLM and Knowledge Graph Collaboration
一个基于LLM和知识图谱协同的个性化出题系统,使用BKT算法、RAG引擎和OpenPangu模型,实现个性化的智能题目生成和推荐。
开发单位: 深圳市大数据研究院 (SRIBD) | 课题组: AI系统与应用课题组
Powered by OpenPangu. OpenPangu is a trademark of Huawei Technologies Co., Ltd.
许可证:
- 项目代码: 本项目代码采用 BSL 1.1 (Business Source License 1.1) 许可证,允许非商业使用,商业使用需要授权。
- OpenPangu模型: 本项目使用的OpenPangu模型采用 OPENPANGU MODEL LICENSE AGREEMENT VERSION 1.0 许可证,需遵守该许可协议的所有条款。
- Beyond Static Question Banks: Dynamic Knowledge Expansion via LLM-Automated Graph Construction and Adaptive Generation https://doi.org/10.48550/arXiv.2602.00020
- 自适应题目推荐: 基于BKT算法和知识图谱RAG引擎,根据学生掌握度智能推荐题目
- 细粒度知识点追踪: 支持知识点章节和小类两级追踪,实时更新掌握度
- AI答案评估: 使用盘古7B模型进行智能答案评估,提供详细反馈
- 学生画像生成: 自动生成个性化学习画像,识别薄弱知识点
- 可视化报告: 生成包含雷达图、掌握度图表等可视化分析报告
- 历史记录查询: 支持按知识点、时间范围查询答题历史
- 自动构建与更新: 使用盘古7B模型自动构建知识图谱,智能检测题库变化并更新
- 交互式可视化: 支持2D/3D可视化,多种布局算法,交互式探索
- 知识图谱RAG: 基于知识图谱的检索增强,实现精准题目推荐
- 角色权限: 支持学生和教师两种角色,权限分离
- 用户注册登录: 安全的用户认证系统,支持默认测试账号
- 题库管理: UI界面添加题目,支持JSON批量导入
- 学生管理: 教师可查看学生学习数据和答题情况
- 系统监控: 实时监控系统状态和统计信息
%%{init: {'theme':'base', 'themeVariables': {'primaryBackgroundColor':'#ffffff', 'primaryTextColor':'#000000', 'primaryBorderColor':'#333333', 'lineColor':'#333333', 'edgeLabelBackground':'#ffffff', 'secondaryColor':'#f0f0f0', 'tertiaryColor':'#ffffff', 'mainBkgColor':'#ffffff', 'secondBkgColor':'#f5f5f5', 'tertiaryBkgColor':'#ffffff', 'background':'#ffffff', 'primaryColor':'#ffffff'}}}%%
graph TB
subgraph 前端层["前端层"]
GradioUI["Gradio Web UI<br/>enhanced_main_ui.py<br/>交互式Web界面"]
Login["登录注册系统<br/>用户认证与权限管理"]
end
subgraph 应用层["应用层"]
SystemCore["System Core<br/>system_core_db.py<br/>系统核心协调器"]
BKT["BKT算法适配器<br/>bkt_database_adapter.py<br/>贝叶斯知识追踪"]
RAG["RAG引擎<br/>rag_engine.py<br/>基于知识图谱的检索"]
KG["知识图谱构建器<br/>kg_builder.py<br/>实体关系提取与图谱构建"]
Selector["题目选择器<br/>question_generator.py<br/>智能推荐+题目互选"]
Evaluator["评估器<br/>evaluator.py<br/>答案评判+学习分析+报告生成"]
Visualizer["可视化器<br/>kg_visualizer.py<br/>radar_chart.py<br/>知识图谱+雷达图可视化"]
end
subgraph AI模型层["AI模型层"]
Pangu["OpenPangu 7B<br/>llm_models.py<br/>• 实体关系提取<br/>• 题目互选<br/>• 答案评判<br/>• 分析总结"]
BGE["BGE-small-zh-v1.5<br/>embedding_model.py<br/>文本向量化"]
end
subgraph 数据层["数据层"]
DB[("SQLite数据库<br/>database.py<br/>• 用户表<br/>• 题目表<br/>• 答题记录表<br/>• 学生状态表")]
Cache[("知识图谱缓存<br/>knowledge_graph.pkl<br/>实体关系图")]
Hash[("知识图谱哈希<br/>kg_hash.txt<br/>检测题库更新")]
VectorIndex[("向量索引<br/>内存存储<br/>题目向量检索")]
end
subgraph 硬件层["硬件层"]
NPU["昇腾910B2 NPU<br/>AI模型加速"]
end
%% 前端到核心
GradioUI --> Login
Login --> SystemCore
%% 系统核心初始化各组件
SystemCore --> BKT
SystemCore --> RAG
SystemCore --> KG
SystemCore --> Selector
SystemCore --> Evaluator
SystemCore --> Visualizer
%% 数据存储关系
BKT --> DB
SystemCore --> DB
KG --> Cache
KG --> Hash
RAG --> VectorIndex
%% RAG引擎相关连接
RAG --> DB
RAG --> BGE
RAG --> Pangu
RAG --> Cache
BGE --> VectorIndex
%% 知识图谱构建器相关连接
KG --> DB
KG --> Pangu
KG --> Cache
%% 题目选择器相关连接
Selector --> RAG
Selector --> BKT
Selector --> Pangu
Selector --> DB
%% 评估器相关连接
Evaluator --> Pangu
Evaluator --> BKT
Evaluator --> DB
%% 可视化器相关连接
Visualizer --> Cache
Visualizer --> DB
%% 硬件加速
Pangu --> NPU
BGE --> NPU
style GradioUI fill:#E3F2FD
style Login fill:#C8E6C9
style SystemCore fill:#F3E5F5
style Pangu fill:#FFF3E0
style BGE fill:#FFF3E0
style NPU fill:#E0E0E0
style RAG fill:#E1BEE7
style Selector fill:#E1BEE7
style Evaluator fill:#E1BEE7
style Visualizer fill:#E1BEE7
style BKT fill:#C8E6C9
style KG fill:#BBDEFB
style DB fill:#FFE0B2
style Cache fill:#FFE0B2
style Hash fill:#FFE0B2
style VectorIndex fill:#FFE0B2
%%{init: {'theme':'base', 'themeVariables': {'primaryBackgroundColor':'#ffffff', 'primaryTextColor':'#000000', 'primaryBorderColor':'#333333', 'lineColor':'#333333', 'edgeLabelBackground':'#ffffff', 'secondaryColor':'#f0f0f0', 'tertiaryColor':'#ffffff', 'mainBkgColor':'#ffffff', 'secondBkgColor':'#f5f5f5', 'tertiaryBkgColor':'#ffffff', 'background':'#ffffff', 'primaryColor':'#ffffff'}}}%%
graph LR
subgraph 前端技术["前端技术"]
Gradio["Gradio 5.49.1<br/>Apache 2.0"]
end
subgraph 深度学习框架["深度学习框架"]
PyTorch["PyTorch<br/>BSD 3-Clause"]
TorchNPU["torch-npu<br/>Apache 2.0"]
end
subgraph 模型库["模型库"]
Transformers["Transformers 4.53.2<br/>Apache 2.0"]
Accelerate["Accelerate 1.10.1<br/>Apache 2.0"]
SentenceTransformers["sentence-transformers 5.1.1<br/>Apache 2.0"]
end
subgraph 数据处理["数据处理"]
NumPy["NumPy 1.26.4<br/>BSD 3-Clause"]
Pandas["Pandas 1.5.3<br/>BSD 3-Clause"]
SciPy["SciPy 1.15.3<br/>BSD 3-Clause"]
end
subgraph 图论可视化["图论与可视化"]
NetworkX["NetworkX 3.5<br/>BSD 3-Clause"]
Plotly["Plotly 6.4.0<br/>MIT"]
Matplotlib["Matplotlib 3.10.6<br/>Matplotlib License"]
end
subgraph 数据库["数据库"]
SQLite["SQLite<br/>Public Domain"]
end
subgraph AI模型["AI模型"]
OpenPangu["OpenPangu 7B<br/>OpenPangu License v1.0"]
BGE["BGE-small-zh-v1.5<br/>Apache 2.0"]
end
subgraph 硬件加速["硬件加速"]
NPU["昇腾910B2 NPU"]
end
Gradio --> PyTorch
Gradio --> Transformers
PyTorch --> TorchNPU
TorchNPU --> NPU
Transformers --> OpenPangu
Transformers --> Accelerate
Accelerate --> NPU
SentenceTransformers --> BGE
SentenceTransformers --> Transformers
OpenPangu --> NPU
BGE --> NPU
NumPy --> PyTorch
Pandas --> NumPy
SciPy --> NumPy
NetworkX --> NumPy
Plotly --> NumPy
Matplotlib --> NumPy
SQLite --> Gradio
style Gradio fill:#BBDEFB
style PyTorch fill:#C8E6C9
style Transformers fill:#FFF9C4
style Accelerate fill:#FFF9C4
style SentenceTransformers fill:#FFF9C4
style OpenPangu fill:#FFE0B2
style BGE fill:#FFE0B2
style NPU fill:#E0E0E0
style SQLite fill:#C8E6C9
style NetworkX fill:#E1BEE7
style Plotly fill:#E1BEE7
style Matplotlib fill:#E1BEE7
%%{init: {'theme':'base', 'themeVariables': {'primaryBackgroundColor':'#ffffff', 'primaryTextColor':'#000000', 'primaryBorderColor':'#333333', 'lineColor':'#333333', 'edgeLabelBackground':'#ffffff', 'secondaryColor':'#f0f0f0', 'tertiaryColor':'#ffffff', 'mainBkgColor':'#ffffff', 'secondBkgColor':'#f5f5f5', 'tertiaryBkgColor':'#ffffff', 'background':'#ffffff', 'primaryColor':'#ffffff'}}}%%
flowchart TD
Start([用户登录系统]) --> Auth{身份验证}
Auth -->|学生| StudentFlow[学生流程]
Auth -->|教师| TeacherFlow[教师流程]
StudentFlow --> StartAssess[开始智能测评]
StartAssess --> GenProfile[【BKT算法】<br/>生成学生画像]
GenProfile --> SelectKP{选择目标知识点}
SelectKP -->|70%概率| WeakKP[优先选择薄弱知识点]
SelectKP -->|30%概率| RandomKP[随机选择知识点]
WeakKP --> GetMastery[【BKT算法】<br/>获取学生掌握度]
RandomKP --> GetMastery
GetMastery --> QuestionSelect[【题目选择器】<br/>智能选择题目]
QuestionSelect --> RAGStrategy{知识图谱RAG检索}
RAGStrategy -->|成功| RAGSelected[返回RAG推荐题目]
RAGStrategy -->|失败| Fallback[多级SQL备用方案<br/>1.精确匹配 2.章节+难度<br/>3.章节匹配 4.任意题目]
RAGSelected --> CreateSession[创建测评会话]
Fallback --> CreateSession
CreateSession --> DisplayQ[显示题目]
DisplayQ --> Answer[学生答题]
Answer --> SubmitAnswer[提交答案]
SubmitAnswer --> AnswerJudge[【盘古7B模型】<br/>智能答案评估<br/>支持答案缓存优化]
AnswerJudge --> BKTUpdate[【BKT算法】<br/>更新学生掌握度]
BKTUpdate --> SaveDB[【SQLite数据库】<br/>保存答题记录]
SaveDB --> CheckMore{还有题目?}
CheckMore -->|是| PreSelectNext[预选下一题<br/>选择知识点+选择题目]
CheckMore -->|否| GenerateReport[【盘古7B模型】<br/>生成学习分析报告]
PreSelectNext --> NextQuestion[加载下一题]
NextQuestion --> DisplayQ
GenerateReport --> ShowReport[显示学习报告<br/>包含掌握度、薄弱点、<br/>进步趋势等]
ShowReport --> End([结束])
TeacherFlow --> Manage[【教师管理功能】<br/>题库管理、学生管理、<br/>系统监控、知识图谱管理]
style Start fill:#E8F5E9
style Auth fill:#FFF3E0
style StudentFlow fill:#E3F2FD
style TeacherFlow fill:#F3E5F5
style GenProfile fill:#E3F2FD
style SelectKP fill:#FFF3E0
style WeakKP fill:#FFE0B2
style GetMastery fill:#E3F2FD
style QuestionSelect fill:#E1BEE7
style RAGStrategy fill:#F3E5F5
style RAGSelected fill:#C8E6C9
style Fallback fill:#FFF9C4
style AnswerJudge fill:#FFE0B2
style BKTUpdate fill:#E3F2FD
style SaveDB fill:#C8E6C9
style GenerateReport fill:#FFE0B2
style ShowReport fill:#C8E6C9
style End fill:#FFCDD2
style Manage fill:#E1BEE7
- CPU: Kunpeng-920处理器
- 存储: 196GB总容量(建议至少100GB可用空间用于模型文件和Docker镜像)
- NPU: 昇腾910B2 NPU
- 操作系统: Linux (推荐 Ubuntu 22.04.5 LTS,容器内使用 Ubuntu 22.04.5 LTS)
- Python: 3.11.12 (容器内版本)
- Docker: 18.09.0+ (宿主机版本,推荐使用Docker容器化部署)
- 昇腾CANN: 23.0.6 (如果使用NPU,需要在宿主机安装,容器内驱动版本 23.0.6)
本项目采用 Docker 容器化部署,代码通过 volume 挂载到容器内,容器启动后由 watchdog 自动拉起 Gradio 服务。更详细的运维说明见 DOCKER快速启动.md。
flowchart LR
Host[宿主机] --> Docker[docker_person_exam 容器]
Docker --> Entry[container-entrypoint.sh]
Entry --> App["python main.py 端口7861"]
Entry --> Watchdog[watchdog 健康检查]
Watchdog --> App
Host --> Neo4j[("Neo4j 7687")]
Host --> Pangu["盘古模型 opt-pangu"]
Host --> Code["项目代码 app volume"]
App --> Neo4j
App --> Pangu
部署前请确认宿主机已具备:
| 类别 | 要求 |
|---|---|
| 硬件 | 昇腾 910B NPU(示例挂载 davinci2)、建议 ≥100GB 可用磁盘 |
| 软件 | Linux(推荐 openEuler / Ubuntu 22.04)、Docker 18.09+、昇腾 CANN 驱动 |
| 服务 | Neo4j 已运行(默认 bolt://localhost:7687) |
| 模型 | 盘古 7B 挂载于 /opt/pangu/openPangu-Embedded-7B-V1.1 |
| 镜像 | personal-exam:2.0.0-ready(预装 Python 依赖与启动脚本) |
容器使用
--net=host,Gradio 默认监听 7861 端口,Neo4j 与 Gradio 均通过 localhost 访问。
推荐使用 SSH 克隆(需先在 GitHub 配置 SSH 公钥):
git clone [email protected]:sribdcn/PersonalExam.git
cd PersonalExam也可使用 HTTPS:https://github.com/sribdcn/PersonalExam.git
复制示例文件并填写 Neo4j 密码(必填):
cd education
cp .env.example .env
# 编辑 .env,至少设置 NEO4J_PASSWORD.env 示例:
PANGU_MODEL_PATH=/opt/pangu/openPangu-Embedded-7B-V1.1
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=your_neo4j_password_here
NEO4J_DATABASE=neo4j可选环境变量(watchdog 调优,一般无需修改):
| 变量 | 默认值 | 说明 |
|---|---|---|
GRADIO_SERVER_PORT |
7861 |
Web 服务端口 |
PERSON_EXAM_CHECK_INTERVAL |
60 |
watchdog 检查间隔(秒) |
PERSON_EXAM_STARTUP_GRACE |
180 |
启动宽限期:模型加载期间 HTTP 未就绪仍视为正常(秒) |
模型地址:https://huggingface.co/BAAI/bge-small-zh-v1.5
# 安装 Hugging Face CLI(如未安装)
curl -LsSf https://hf.co/cli/install.sh | bash
# 下载到项目目录(与默认配置路径一致)
hf download BAAI/bge-small-zh-v1.5 --local-dir education/models/bge-small-zh-v1.5BGE 缺失时系统仍可启动,但 RAG 将使用模拟嵌入,推荐下载以获得完整功能。
重要:OpenPangu 采用 OPENPANGU MODEL LICENSE AGREEMENT VERSION 1.0,使用前请阅读并遵守许可条款。
模型地址:https://huggingface.co/FreedomIntelligence/openPangu-Embedded-7B-V1.1
mkdir -p /opt/pangu
hf download FreedomIntelligence/openPangu-Embedded-7B-V1.1 \
--local-dir /opt/pangu/openPangu-Embedded-7B-V1.1验证:
ls -lh /opt/pangu/openPangu-Embedded-7B-V1.1/
# 应包含 config.json、tokenizer 及权重文件(约 14GB)路径须与 PANGU_MODEL_PATH / .env 中配置一致。
若数据库 education/data/education_system.db 尚不存在,需从 JSON 初始化:
4.1 准备 JSON 题库(可参考 question_database.json):
[
{
"题号": 1,
"问题": "解方程 x^2 - 5x + 6 = 0",
"答案": "x = 2 或 x = 3",
"解析": "使用因式分解法...",
"难度": 0.3,
"知识点章节": "必修一 第2章 等式与不等式",
"知识点小类": "一元二次方程"
}
]4.2 在宿主机或容器内执行迁移:
# 若尚未创建容器,可先在宿主机安装依赖后运行:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
cd education && python migrate_to_database.py
# 或容器创建后在容器内运行:
docker exec -it docker_person_exam bash -c 'cd /app/education && python migrate_to_database.py'系统首次启动时会创建默认账号(也可在迁移脚本中修改):
- 学生:
student_001/123456 - 教师:
teacher/admin123
将下方 /path/to/PersonalExam 替换为实际项目路径(示例:/home/liqinsi/PersonalExam)。
bash /path/to/PersonalExam/scripts/recreate_container.sh脚本会:检查 .env → 删除旧容器 → 创建新容器 → 等待 HTTP 200(约 40–60 秒)。
docker run -dit --net=host \
--name docker_person_exam \
--restart=unless-stopped \
--device /dev/davinci2 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /opt/pangu:/opt/pangu \
-v /path/to/PersonalExam:/app \
personal-exam:2.0.0-ready \
/app/scripts/container-entrypoint.sh关键路径说明:
| 路径 | 用途 |
|---|---|
/app/education/ |
应用主目录 |
/app/education/data/ |
SQLite 数据库与知识图谱缓存 |
/app/education/logs/ |
启动日志 startup.log |
/app/scripts/ |
启动、停止、健康检查脚本 |
代码通过 volume 挂载,宿主机
git pull后重启应用即可生效,无需docker cp复制代码。
首次启动需 40–60 秒 加载模型与知识图谱:
# HTTP 健康检查
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://localhost:7861/
# 返回 HTTP 200 表示就绪
# 容器内健康检查脚本
docker exec docker_person_exam /app/scripts/is_running.sh && echo OK
# 查看启动日志
docker exec docker_person_exam tail -f /app/education/logs/startup.log
# 确认仅有一个 main.py 进程
docker exec docker_person_exam pgrep -af "python main.py"浏览器访问:http://localhost:7861
容器入口脚本 scripts/container-entrypoint.sh 负责:
- 首次启动时运行
start_person_exam.sh - watchdog 每 60 秒调用
is_running.sh检查健康状态 - 进程异常退出时自动重启
健康检查逻辑(is_running.sh):
- 进程存活 且 HTTP 200 → 正常
- 进程存活但 HTTP 未就绪 → 启动宽限期(默认 180 秒)内仍视为正常,避免模型加载期间误判并重复拉起
运维注意:
- 手动重启应用请使用脚本,不要直接
pkill python main.py(会被 watchdog 立即再次拉起) - 修改 watchdog 间隔或宽限期后,需
docker restart docker_person_exam使 entrypoint 重新读取配置
# 仅重启应用(不重启容器)
docker exec docker_person_exam /app/scripts/stop_person_exam.sh
docker exec docker_person_exam /app/scripts/start_person_exam.sh
# 启动已有容器(容器已创建但未运行)
bash /path/to/PersonalExam/scripts/start_container.sh
# 重启整个容器
docker restart docker_person_examcd /path/to/PersonalExam
git pull origin main
# 重启应用使代码生效
docker exec docker_person_exam /app/scripts/stop_person_exam.sh
docker exec docker_person_exam /app/scripts/start_person_exam.sh若镜像、NPU 设备或 volume 挂载有变更,请重新执行 recreate_container.sh。
配置文件: education/config.py
# 模型配置
PANGU_MODEL_CONFIG = {
"max_new_tokens": 32768,
"temperature": 0.7,
"top_p": 0.9,
"device": "npu",
}
# 智能出题配置
SMART_QUESTION_CONFIG = {
"default_question_count": 10,
"weak_threshold": 0.4, # 薄弱点阈值
"weak_point_focus_ratio": 0.7, # 薄弱点题目比例
"rebuild_kg": False, # 是否强制重建知识图谱
"use_kg_rag": True, # 是否使用知识图谱RAG
"kg_rag_top_k": 5, # 知识图谱RAG返回的候选题目数量
}
# UI配置
UI_CONFIG = {
"port": 7861,
"share": False,
"server_name": "0.0.0.0"
}
# 日志配置
LOGGING_CONFIG = {
"level": "INFO",
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
"log_file": "logs/system.log"
}数据库文件路径在 main.py 中配置,默认路径为:
- 数据库文件:
education/data/education_system.db - 知识图谱缓存:
education/data/knowledge_graph.pkl - 知识图谱哈希:
education/data/kg_hash.txt
数据库会自动创建,包含以下表:
users: 用户表(学生和教师)questions: 题目表student_states: 学生状态表(BKT参数)answer_records: 答题记录表
可以通过环境变量覆盖配置(也可写入 education/.env,启动脚本会自动加载):
export PANGU_MODEL_PATH="/opt/pangu/openPangu-Embedded-7B-V1.1"
export BGE_MODEL_PATH="/app/education/models/bge-small-zh-v1.5"
export GRADIO_SERVER_PORT=7861
export NEO4J_URI="bolt://localhost:7687"
export NEO4J_USER="neo4j"
export NEO4J_PASSWORD="your_password"
export NEO4J_DATABASE="neo4j"打开浏览器访问系统地址(默认 **http://localhost:7861**),服务就绪前请等待约 40–60 秒(模型与知识图谱加载)。
- 点击"注册新用户"按钮
- 填写用户名、密码和角色(学生/教师)
- 完成注册后即可使用新账号登录
系统提供默认测试账号:
- 学生账号:
student_001/123456 - 教师账号:
teacher/admin123
- 登录学生账号: 使用学生账号登录系统
- 选择题目数量: 在"智能测评"标签页选择题目数量(5-20题)
- 开始测评: 点击"开始智能测评"按钮
- 答题:
- 系统会根据学生掌握度智能推荐题目
- 在答题框中输入答案
- 点击"提交答案"进行判断
- 查看答案反馈后,点击"下一题"继续
- 完成测评: 所有题目完成后,系统会生成个性化的评估报告
开始答题
提交答案
评测界面
评测报告
- 切换到"我的学习"或"学习分析"标签页
- 查看历史答题记录
- 查看掌握度雷达图和学习统计
学习分析
掌握度雷达
最近答题历史
- 切换到"知识图谱"标签页
- 选择布局算法(spring/circular/kamada_kawai)
- 查看题目、知识点和难度之间的关系网络
知识图谱
- 切换到"题库管理"标签页
- 查看所有题目列表和统计信息
- 添加新题目: 点击"添加题目"按钮,填写题目信息(问题、答案、解析、难度、知识点等)即可添加到题库中
题库管理
- 登录教师账号: 使用教师账号登录系统
- 在相应界面选择要查看的学生
- 查看该学生的详细答题情况和学习数据
学生管理
查看学生答题情况
PersonalExam/
├── education/ # 主程序目录
│ ├── main.py # 程序入口(数据库版本,带登录功能)
│ ├── config.py # 配置文件
│ ├── database.py # 数据库管理器(SQLite)
│ ├── system_core.py # 系统核心(JSON版本,已弃用)
│ ├── system_core_db.py # 系统核心(数据库版本)
│ ├── bkt_database_adapter.py # BKT算法数据库适配器
│ ├── enhanced_main_ui.py # 增强UI(带登录注册系统)
│ ├── migrate_to_database.py # 数据迁移脚本(JSON→数据库)
│ ├── visualize_knowledge_graph.py # 知识图谱可视化脚本
│ ├── data/ # 数据目录
│ │ ├── education_system.db # SQLite数据库(用户、题目、记录)
│ │ ├── knowledge_graph.pkl # 知识图谱缓存
│ │ ├── kg_hash.txt # 知识图谱哈希(用于检测更新)
│ │ ├── question_database.json # 题库(JSON格式,用于迁移到数据库)
│ │ └── student_states.json # 学生状态(旧版,已迁移到数据库)
│ ├── models/ # 模型模块
│ │ ├── llm_models.py # 语言模型(盘古7B)
│ │ └── embedding_model.py # 嵌入模型(BGE)
│ ├── data_management/ # 数据管理
│ │ └── question_db.py # 题库数据库(旧版,已整合到database.py)
│ ├── knowledge_management/ # 知识管理
│ │ ├── kg_builder.py # 知识图谱构建器
│ │ └── rag_engine.py # RAG引擎(基于知识图谱)
│ ├── utils/ # 工具模块
│ │ ├── bkt_algorithm.py # BKT算法(基础实现)
│ │ ├── evaluator.py # 评估器
│ │ └── question_generator.py # 题目生成器
│ ├── visualization/ # 可视化
│ │ ├── kg_visualizer.py # 知识图谱可视化
│ │ └── radar_chart.py # 雷达图可视化
│ ├── ui/ # UI界面(旧版)
│ │ └── main_ui.py # Gradio界面(已迁移到enhanced_main_ui.py)
│ └── logs/ # 日志目录
│ └── system.log # 系统日志
├── img/ # 图片资源目录
│ └── *.png, *.jpg # 文档和UI使用的图片
├── scripts/ # 容器运维脚本
│ ├── container-entrypoint.sh # 容器入口 + watchdog
│ ├── start_person_exam.sh # 启动应用(单实例)
│ ├── stop_person_exam.sh # 停止应用
│ ├── is_running.sh # 健康检查
│ ├── recreate_container.sh # 一键重建容器
│ └── start_container.sh # 启动已有容器
├── DOCKER快速启动.md # Docker 运维详细手册
├── requirements.txt # Python依赖
├── LICENSE # 项目许可证
├── NOTICE # 开源软件声明
└── README.md # 本文件
本项目代码采用 BSL 1.1 (Business Source License 1.1) 许可证
BSL 1.1 是一种源代码可见的许可证,允许:
- ✅ 非商业使用: 个人、教育、研究用途完全免费
- ✅ 查看源代码: 可以查看、复制、修改源代码
- ✅ 分发: 可以分发源代码(需保留版权声明)
⚠️ 商业使用限制: 商业使用需要获得授权许可
完整的许可证文本请参阅 LICENSE 文件。
本项目使用了OpenPangu模型(openPanGu-Embedded-7B-V1.1)。OpenPangu是由华为技术有限公司(Huawei Technologies Co., Ltd.)发布的大型语言模型。
OpenPangu模型采用 OPENPANGU MODEL LICENSE AGREEMENT VERSION 1.0 许可证
使用OpenPangu模型时,必须遵守OPENPANGU MODEL LICENSE AGREEMENT VERSION 1.0的所有条款和条件,包括:
- 地理限制:不能在欧盟境内使用
- 归属声明:必须包含OpenPangu的归属声明
- 许可证通知:必须包含许可证副本或链接
有关详细信息,请参阅:
- OpenPangu 7B模型 (Hugging Face): https://huggingface.co/FreedomIntelligence/openPangu-Embedded-7B-V1.1
- OpenPangu官方仓库: https://ai.gitcode.com/ascend-tribe/openpangu-embedded-7b-model
本项目基于以下优秀的开源项目构建,我们感谢所有开源贡献者的工作。
(版本信息基于 requirements.txt):
- Gradio (5.49.1, Apache 2.0) - 用于构建交互式Web界面
- PyTorch (2.5.1, BSD 3-Clause) - 深度学习框架
- torch-npu (2.5.1.post1, Apache 2.0) - 昇腾NPU支持
- Transformers (4.53.2, Apache 2.0) - Hugging Face 模型库
- vLLM (0.9.2, Apache 2.0) - 高性能LLM推理引擎
- vllm-ascend (0.9.2rc1, Apache 2.0) - vLLM昇腾支持
- NumPy (1.26.4, BSD 3-Clause) - 数值计算库
- NetworkX (3.5, BSD 3-Clause) - 图论和网络分析
- Plotly (6.4.0, MIT) - 交互式数据可视化
- FastAPI (0.117.1, MIT) - 高性能Web API框架
- Accelerate (1.10.1, Apache 2.0) - 模型加速库
本项目使用的第三方依赖许可证类型主要是商业友好的:
完整的开源软件清单和许可证信息请参考:
- 📋 LICENSE - 项目代码的许可证
- 📄 NOTICE - 开源软件声明文件
- 📦 requirements.txt - Python 依赖清单
本项目使用的 AI 模型:
-
OpenPangu模型 (openPanGu-Embedded-7B-V1.1)
- 来源: 华为技术有限公司 (Huawei Technologies Co., Ltd.)
- 许可证: OPENPANGU MODEL LICENSE AGREEMENT VERSION 1.0
- 参考: https://huggingface.co/FreedomIntelligence/openPangu-Embedded-7B-V1.1
- 重要: 本项目使用OpenPangu模型,需遵守OPENPANGU MODEL LICENSE AGREEMENT VERSION 1.0许可协议
-
BGE-small-zh-v1.5
- 来源: 北京智源人工智能研究院 (BAAI)
- 许可证: Apache 2.0
- 参考: https://github.com/FlagOpen/FlagEmbedding
重要: 使用本项目时,必须遵守以下许可证要求:
-
项目代码许可证 (BSL 1.1):
- 非商业使用:允许个人、教育、研究用途
- 商业使用:需要获得授权许可
-
OpenPangu模型许可证: 必须遵守OPENPANGU MODEL LICENSE AGREEMENT VERSION 1.0的所有条款
- 必须包含OpenPangu的归属声明
- 必须包含许可证通知
- 遵守OpenPangu商标使用规定
- 不能在欧盟境内使用
-
第三方开源软件: 请遵守所有相关开源软件的许可证条款
详细信息请参考:
重要声明:如果您的研究、工作或项目中使用了本项目,请引用并致谢 深圳市大数据研究院 (SRIBD) 和 AI系统与应用课题组。
引用格式:
Wang, Y., Wei, T., Li, Q., & Zeng, L. (2026). Beyond Static Question Banks: Dynamic Knowledge Expansion via LLM-Automated Graph Construction and Adaptive Generation. arXiv preprint arXiv:2602.00020. https://doi.org/10.48550/arXiv.2602.00020
BibTeX格式:
@article{wang2026beyond,
title = {Beyond Static Question Banks: Dynamic Knowledge Expansion via LLM-Automated Graph Construction and Adaptive Generation},
author = {Wang, Yingquan and Wei, Tianyu and Li, Qinsi and Zeng, Li},
journal = {arXiv preprint arXiv:2602.00020},
year = {2026},
doi = {10.48550/arXiv.2602.00020},
url = {https://arxiv.org/abs/2602.00020}
}如果您在研究中使用了本项目,请使用以下格式引用:
中文引用格式:
基于LLM和知识图谱协同的个性化出题系统.
AI系统与应用课题组, 深圳市大数据研究院 (SRIBD), 2025.
https://github.com/sribdcn/PersonalExam
英文引用格式:
Personalized Question Generation System Based on LLM and Knowledge Graph Collaboration.
AI System and Application Research Group, Shenzhen Research Institute of Big Data (SRIBD), 2025.
https://github.com/sribdcn/PersonalExam
BibTeX格式:
@software{personalexam2025,
title = {基于LLM和知识图谱协同的个性化出题系统},
author = {AI系统与应用课题组},
organization = {深圳市大数据研究院 (SRIBD)},
year = {2025},
url = {https://github.com/sribdcn/PersonalExam}
}@software{personalexam2025,
title = {Personalized Question Generation System Based on LLM and Knowledge Graph Collaboration},
author = {AI System and Application Research Group},
organization = {Shenzhen Research Institute of Big Data (SRIBD)},
year = {2025},
url = {https://github.com/sribdcn/PersonalExam}
}在您的论文、报告或项目中,请包含以下致谢内容:
中文致谢:
本研究/工作使用了"基于LLM和知识图谱协同的个性化出题系统"。
感谢深圳市大数据研究院 (SRIBD) 和 AI系统与应用课题组提供该项目。
英文致谢:
This research/work uses the "Personalized Question Generation System Based on LLM and Knowledge Graph Collaboration".
We thank the Shenzhen Research Institute of Big Data (SRIBD) and the AI System and Application Research Group for providing this project.
我们欢迎所有形式的贡献!
- Fork 本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
- 遵循 PEP 8 Python 代码规范
- 添加适当的注释和文档字符串
- 确保代码通过所有测试
如果发现问题,请在 [Issues](https://github.com/sribdcn/PersonalExam /issues) 中报告,包括:
- 问题描述
- 复现步骤
- 预期行为
- 实际行为
- 环境信息
A: 是的,本项目面向昇腾 NPU 环境,推荐使用预构建的 personal-exam:2.0.0-ready 镜像部署。镜像已包含 Python 依赖、启动脚本与 watchdog,代码通过 volume 挂载,无需手动配置虚拟环境。
A: 根据使用场景选择不同方式:
-
初次使用(必须): 先将JSON格式的题库文件保存在
education/data/目录下,然后运行迁移脚本:python migrate_to_database.py
将JSON格式转换为数据库格式。
-
后续添加题目(推荐): 使用教师账号登录,在"题库管理"标签页点击"添加题目"按钮,填写题目信息即可添加到题库中。
注意:
- 初次使用必须先通过迁移脚本导入数据
- 系统会自动检测题库更新,并在需要时重建知识图谱
- 初次构建知识图谱需要一定时间,请耐心等待
A: 系统支持自定义知识点结构。在 education/config.py 中的 KNOWLEDGE_HIERARCHY 配置知识点层级。可以通过volume挂载配置文件来修改。
A: 有三种方式:
- 在Dockerfile中配置(构建时)
- 通过环境变量配置(运行时)
- 挂载配置文件(运行时)
A: 是的,系统支持完整的用户管理系统:
- 用户注册: 支持学生和教师两种角色的注册
- 用户登录: 每个用户有独立的账号和密码
- 数据隔离: 每个学生有独立的学习档案和状态
- 数据持久化: 所有数据存储在SQLite数据库中,容器重启后数据不会丢失
- 默认账号: 系统提供默认测试账号(学生:
student_001/123456,教师:teacher/admin123)
A: 目前报告在Web界面显示。可以复制报告内容或使用浏览器的打印功能保存为PDF。
A: 按以下顺序排查:
# 1. 容器是否在运行
docker ps -a --filter name=docker_person_exam
# 2. 健康检查
docker exec docker_person_exam /app/scripts/is_running.sh && echo OK || echo FAIL
# 3. 查看启动日志
docker exec docker_person_exam tail -50 /app/education/logs/startup.log
# 4. 确认 .env 中 NEO4J_PASSWORD 已配置
cat education/.env常见原因:
education/.env未配置或NEO4J_PASSWORD为空- Neo4j 未启动或端口 7687 不可达
- 模型路径
/opt/pangu/openPangu-Embedded-7B-V1.1不存在 - 7861 端口被其他进程占用
- 服务仍在加载模型(等待 40–60 秒后再检查 HTTP 200)
A: 容器内 watchdog 会定期检查服务健康状态并在异常时自动拉起。若启动期间 HTTP 尚未就绪就被判定为「未运行」,可能重复启动多个进程。当前版本已通过 180 秒启动宽限期 和 60 秒检查间隔 修复此问题。运维时请使用 stop_person_exam.sh / start_person_exam.sh,避免直接 pkill python main.py。
A: 典型流程:
# 1. SSH 登录服务器
ssh user@your-server
# 2. 克隆代码
git clone [email protected]:sribdcn/PersonalExam.git
cd PersonalExam
# 3. 配置 .env、下载模型、初始化题库(见「部署指南」)
# 4. 创建容器(修改脚本中的项目路径,或手动 docker run)
bash /path/to/PersonalExam/scripts/recreate_container.sh
# 5. 验证
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://localhost:7861/数据库文件位于 education/data/education_system.db,随 volume 挂载持久化,容器重建不会丢失。
- ✨ 数据库架构: 从JSON文件存储迁移到SQLite数据库存储
- ✨ 用户系统: 新增用户登录注册功能,支持学生和教师角色分离
- ✨ 知识图谱: 新增知识图谱自动构建和RAG引擎
- ✨ 自动更新: 知识图谱支持自动检测题库更新并重建
- ✨ 数据迁移: 提供从JSON格式到数据库的迁移工具
- ✨ 增强UI: 全新的UI界面,支持登录注册和角色权限管理
- ✨ 细粒度知识点追踪(支持知识点小类)
- ✨ RAG引擎驱动的智能题目推荐
- ✨ 知识图谱可视化功能
- ✨ 盘古7B模型支持
- ✨ 题目选择策略
- 📚 完善文档和许可证信息
- ✨ 新增细粒度知识点追踪(支持知识点小类)
- ✨ 新增RAG引擎驱动的智能题目推荐
- ✨ 新增知识图谱可视化功能
- ✨ 新增盘古7B模型支持
- ✨ 新增题目选择策略
- ✨ 新增学生状态保存
- 📚 完善文档和许可证信息
- DOCKER快速启动.md - Docker 镜像、运维命令与故障排查
- 华为昇腾社区
- Hugging Face
- BAAI智源
- Gradio文档
由于 openPangu-Embedded-7B等AI模型固有的技术限制,以及本系统生成的内容是由盘古等模型自动生成的,我们无法对以下事项做出任何保证:
- 尽管本系统的输出由 AI 算法生成,但不能排除某些信息可能存在缺陷、不合理或引起不适的可能性,生成的内容不代表我们的态度或立场;
- 无法保证该系统 100% 准确、可靠、功能齐全、及时、安全、无错误、不间断、持续稳定或无任何故障;
- 该系统的输出内容不构成任何建议或决策,也不保证生成的内容的真实性、完整性、准确性、及时性、合法性、功能性或实用性。生成的内容不能替代教育、医疗等领域的专业人士回答您的问题。生成的内容仅供参考,不代表我们的任何态度、立场或观点。您需要根据实际情况做出独立判断,我们不承担任何责任。
如果有任何意见和建议,请提交issue或联系 [email protected]。
Made with ❤️ by AI系统与应用课题组@SRIBD
最后更新: 2026年5月
























