# 知识工程 **Repository Path**: QikY1027/knowledge-engineering ## Basic Information - **Project Name**: 知识工程 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-09-09 - **Last Updated**: 2026-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 人工智能专业培养计划 GraphRAG 问答系统 本项目以天津大学 2024 级人工智能专业培养计划为主要数据源,构建可溯源的课程知识图谱与 GraphRAG 问答系统。页面支持培养计划全文检索、课程关系检索和混合检索,并可在 DeepSeek API 与本地 Ollama 之间切换。 > 数据声明:培养计划没有给出学校官方先修课表。系统中的课程关系由项目规则推断,始终与正式先修要求分开标记;同学期课程只标记为“建议同修”。 ## 当前进度 - [x] 项目骨架 - [x] DeepSeek API 与 Ollama 可切换的统一 LLM 接口 - [x] 课程本体与样例数据 - [x] 天津大学人工智能专业 2023 版 PDF 解析(105 条记录) - [x] 天津大学 2024 级人工智能培养方案 PDF 直接解析(105 条记录、95 个唯一代码) - [x] 真实培养方案课程检索与网页数据源切换 - [x] 可追溯的培养计划规则推断(先修、先后、同修) - [x] 9 门专业核心课的公开知识资料整理与检索接入 - [x] 内存图谱基线与先修路径查询 - [x] Neo4j 真实培养方案幂等导入、便携安装与实库验收 - [x] 参数化 Cypher 检索器与页面图谱后端切换 - [x] TF-IDF 中文向量检索基线 - [x] 图关系检索与问题路由基线 - [ ] 本地语义嵌入与混合排序 - [x] 基于检索证据的 LLM 回答与课程引用 - [x] Streamlit 演示页面 - [x] 固定检索评测集与 Vector/Graph/Hybrid/Neo4j 对比报告 - [x] 课程关系与知识点一跳子图可视化 下一阶段优先补充生成回答质量评测,之后整理课程报告与答辩材料。 ## 当前数据快照 | 数据 | 当前规模 | 用途 | | --- | ---: | --- | | 2024 级人工智能培养方案 | 105 条记录、95 个唯一课程代码 | 网页默认课程数据 | | 项目推断关系 | 302 条 | 课程先后、同修和实践衔接问答 | | 核心课程知识 | 9 门课程、59 个知识点 | 课程内容与建议基础知识问答 | | 2023 人工智能培养方案 | 105 条记录 | 历史参考与解析回归测试 | | 关系演示数据 | 15 门课程 | 展示明确先修图与基础 GraphRAG 流程 | 302 条推断关系由 204 条 `INFERRED_PREREQUISITE`、86 条 `RECOMMENDED_BEFORE` 和 12 条 `RECOMMENDED_COREQUISITE` 组成。每条边都保存规则编号、置信度、起止学期和中文推断理由。 核心课程知识来自 Stanford、MIT 与 UNESCO 的公开教学或规范性资料,共形成 55 条 `TEACHES` 和 23 条 `REQUIRES` 关系。它们用于归纳通用知识结构,不代表天津大学官方课程大纲。 ## 快速开始 ```powershell git clone https://gitee.com/wuhushangjiang_1/knowledge-engineering.git Set-Location knowledge-engineering conda create -n course-graphrag python=3.12 -y conda activate course-graphrag pip install -e ".[dev]" Copy-Item .env.example .env ``` 在 `.env` 中至少配置一种生成模型,然后启动: ```powershell python scripts/check_llm.py python -m streamlit run app/streamlit_app.py ``` 浏览器访问 `http://localhost:8501/`。可以直接尝试: - `我的培养计划按学期怎样安排?` - `学习机器学习与深度学习前需要掌握哪些课程?` - `专业核心课应按什么顺序学习?` - `知识图谱之前应该学习什么?` 新成员从 Git 克隆时不会获得本机 `.env`、便携 Neo4j 或 `data/raw` 中的原始文件,这是预期行为。运行页面所需的 `data/processed`、`data/curated` 和样例数据均已提交;复制 `.env.example` 并配置 DeepSeek 或 Ollama 后即可运行。缺少原始 PDF 时,相关解析集成测试会显示为 `skipped`,其余测试和系统功能不受影响。 ## 模型配置 完成快速开始并复制 `.env.example` 后,选择 DeepSeek 或 Ollama 其中一种配置。 ## 使用 DeepSeek API 编辑 `.env`: ```dotenv LLM_PROVIDER=deepseek DEEPSEEK_API_KEY=你的密钥 DEEPSEEK_MODEL=deepseek-v4-flash ``` 执行连通性检查: ```powershell python scripts/check_llm.py ``` ## 使用 Ollama 安装 Ollama 后拉取本地模型: ```powershell ollama pull qwen3:8b ``` 编辑 `.env`: ```dotenv LLM_PROVIDER=ollama OLLAMA_MODEL=qwen3:8b ``` 再次运行: ```powershell python scripts/check_llm.py ``` 两种方式共用同一套业务接口,后续 GraphRAG 代码只调用 `ChatModel.chat()`。 ## 检查课程关系图 项目包含 15 门演示课程。运行以下命令可检查图谱统计信息和“推荐系统”的完整先修路径: ```powershell python scripts/check_graph.py ``` 样例数据只用于演示明确先修关系;网页默认加载真实培养计划及其项目推断关系。 ## 命令行问答 确保 `.env` 已配置后运行: ```powershell python scripts/ask.py "学习机器学习前需要掌握哪些课程?" ``` 输出包含路由方式、回答正文和课程来源。生成模型只能使用检索到的课程证据,证据不足时应明确说明。 ## 启动演示页面 ```powershell python -m streamlit run app/streamlit_app.py ``` 页面侧栏可以选择 DeepSeek 或 Ollama。两个数据集都可以固定使用 Vector、Graph、Hybrid,或让系统自动路由。“2024级人工智能培养方案”支持课程信息、1–8学期安排和项目推断的课程关系查询。 Graph 或 Hybrid 找到结构化关系时,回答下方会显示以命中课程为中心的一跳关系子图。课程节点为蓝色、知识点节点为黄色;箭头由先学或提供支撑的一端指向后学或被支撑的一端,推断先修、建议先修、建议同修、讲授和建议基础使用不同颜色或线型。当前视图用于解释本次检索命中的直接关系,并不表示已经计算出两门课程之间的完整多跳路径。图中项目推断关系仍会明确标注为非学校官方要求。 ## 解析真实培养方案 ```powershell python scripts/parse_curriculum.py ``` 脚本直接解析 `data/raw/tju-ai-2024-training-plan.pdf` 第 10–15 页的课程表,生成: - `data/processed/tju_ai_2024_curriculum.json`:网页实际使用的2024级培养方案。 仓库另行保留 `data/processed/tju_ai_2023_curriculum.json`,仅用于历史参考和解析回归测试,不再参与2024级主数据生成。 2024级 PDF 提供课程、学分、建议学期、必选修和开课单位,但没有明确先修关系、课程简介与知识点;后两类字段仍需课程教学大纲补充。原始 PDF 不是网页运行所必需的,系统默认读取仓库中已提交的结构化 JSON。 原始 PDF 默认不随仓库分发。只有需要重新验证解析过程时,才按照 [data/raw/README.md](data/raw/README.md) 中的文件名自行放入;普通开发、测试和演示直接使用已提交的处理结果。 `data/curated/core_course_knowledge.json` 为 9 门专业核心课补充了可追溯的通用知识结构。每门课程保存公开来源链接,系统回答时会明确标记为“非天津大学官方课程大纲”。 项目另外用以下命令,根据我们自定的培养逻辑生成推断关系: ```powershell python scripts/infer_curriculum_relations.py ``` 输出为 `data/processed/tju_ai_2024_inferred_relations.json`。目前规则包括:大类基础课先于专业课,同学期时改为建议同修;专业核心、思政、体育、外语分级、数学、物理等按相邻学期衔接;理论课与对应综合实践衔接。每条关系均保留规则编号、置信度、学期和推断理由,并明确标注为非学校官方要求。 ## 检索方式 | 模式 | 主要用途 | | --- | --- | | `Vector` | 查询课程信息、类别、开课学期和完整学期安排 | | `Graph` | 通过内置关系图或 Neo4j Cypher 查询课程与知识关系 | | `Hybrid` | 合并课程信息与关系证据 | | `自动` | 根据问题中的学期或关系词选择检索方式 | 生成模型只能使用检索证据作答。推断关系证据会明确写出“非学校官方要求”,避免把项目建议误报为培养方案原文。 ## 检索评测 项目提供 10 道固定问题,覆盖学期查询、课程信息、培养路径、先修/后续关系和课程知识。评测只检查检索结果,不调用 DeepSeek 或 Ollama,因此不会消耗模型 token。 不启动 Neo4j 时比较 Vector、内置 Graph 和内置 Hybrid: ```powershell python scripts/evaluate_retrieval.py ``` 启动并导入 Neo4j 后,比较五种真实运行组合: ```powershell python scripts/evaluate_retrieval.py --with-neo4j ``` 当前 Top-12 结果如下;延迟是本机单次运行数据,只用于观察量级: | 运行组合 | 通过率 | Hit@K | 平均 Recall@K | MRR | 平均延迟 | | --- | ---: | ---: | ---: | ---: | ---: | | Vector | 80% | 80% | 0.771 | 0.750 | 0.46ms | | 内置 Graph | 30% | 30% | 0.267 | 0.300 | 0.07ms | | 内置 Hybrid | 100% | 100% | 0.967 | 0.750 | 0.44ms | | Neo4j Graph | 50% | 50% | 0.467 | 0.500 | 11.24ms | | Neo4j Hybrid | 100% | 100% | 0.967 | 0.850 | 5.61ms | Graph 只负责关系类问题,因此整体通过率不应与覆盖信息查询的 Hybrid 直接等同。完整逐题结果见 [Markdown 报告](reports/retrieval_evaluation.md) 和 [CSV 明细](reports/retrieval_evaluation.csv)。 修改检索、图谱或页面代码后,可运行完整测试进行回归验证: ```powershell python -m pytest -q ``` ## 导入 Neo4j ### 项目内便携安装 Windows 可以把 Neo4j Community 2026.07.1 完整安装在被 Git 忽略的 `.tools/neo4j` 中,不注册系统服务、不修改系统 `PATH`。需要 Java 21 或 Java 25,当前完整目录约占 275 MB: ```powershell powershell -ExecutionPolicy Bypass -File scripts/neo4j_portable.ps1 Install powershell -ExecutionPolicy Bypass -File scripts/neo4j_portable.ps1 Start ``` 安装脚本从 Neo4j 官方分发站点下载固定版本并校验 SHA-256,自动生成仅用于本机的密码,然后写入被忽略的 `.env`。`Start` 使用前台控制台运行,按 `Ctrl+C` 即可停止。启动后可访问 Neo4j Browser:。 另开一个终端导入数据: ```powershell python scripts/import_neo4j.py python scripts/check_neo4j.py ``` 脚本会从2024级培养方案同步并幂等创建课程、类别、培养方向、开课单位、专业和学期节点;重新导入时会移除上一版培养方案遗留的课程和受管理关系。随后单独导入 `INFERRED_PREREQUISITE`、`RECOMMENDED_BEFORE` 与 `RECOMMENDED_COREQUISITE` 三类项目推断边。它们不会写成代表正式要求的 `PREREQUISITE_OF`。 导入脚本还会创建知识点节点,以及来自公开资料的 `TEACHES` 和 `REQUIRES` 关系。完成导入后,在页面侧栏把“Graph 后端”切换为 `Neo4j Cypher`。课程先修、后续课程、类别顺序和知识点问题将使用参数化 Cypher 查询。 `check_neo4j.py` 不调用 DeepSeek 或 Ollama,只用两组参数化 Cypher 查询验证课程关系与知识点检索,因此不会消耗模型 token。 查看状态: ```powershell powershell -ExecutionPolicy Bypass -File scripts/neo4j_portable.ps1 Status ``` 不再需要时,先回到运行 `Start` 的终端按 `Ctrl+C`,等输出 `Stopped.` 后,再一次性删除程序、数据库、日志和本地 Neo4j 密码: ```powershell powershell -ExecutionPolicy Bypass -File scripts/neo4j_portable.ps1 Remove -ConfirmRemove ``` Neo4j 官方 Windows ZIP 方式以控制台运行,停止方法就是在启动窗口按 `Ctrl+C`。清理脚本会先确认 7687 端口已经关闭,并严格校验目标路径,只删除当前项目的 `.tools/neo4j`。本机没有 Neo4j 时,保持默认的“内置关系图”仍可正常演示。 ## 测试 ```powershell python -m pytest -q ``` 当前测试覆盖培养方案解析、规则推断、Vector/Graph/Hybrid 检索、问题路由、生成约束与 Neo4j 幂等导入。 ## 常见问题 ### 页面显示 `Connection error` 先执行 `python scripts/check_llm.py`。DeepSeek 模式需要能访问 `.env` 中的 `DEEPSEEK_BASE_URL`;Ollama 模式需要先启动 Ollama,并确认 `ollama list` 中存在配置的模型。API Key 错误通常会显示身份验证失败,而网络、防火墙或本地服务未启动会显示连接失败。 ### 为什么部分课程是“建议同修” 项目规则要求大类基础课先于专业课程,但培养计划把“算法设计与分析”和部分专业课同时安排在第 4 学期。系统不会制造时间上不可能的先修关系,因此将这些关系降级为“建议同修并优先掌握基础内容”。 ## 项目结构 ```text app/ Streamlit 页面 data/curated/ 公开资料整理的核心课程知识点 data/evaluation/ 固定检索评测问题 data/processed/ 结构化培养计划和推断关系 data/samples/ 关系演示数据 docs/ 系统范围与图谱本体说明 reports/ 可复现的评测结果 scripts/ 解析、关系生成、检查和 Neo4j 导入脚本 src/course_graphrag/ 核心代码 tests/ 自动化测试 ``` ## 安全说明 - `.env` 已被 `.gitignore` 排除。 - 不要在代码、截图、Issue 或提交记录中粘贴 API Key。 - 如果密钥曾经进入 Git 历史,应立即在服务商控制台撤销并重新生成。 ## 文档 - [更新日志](CHANGELOG.md) - [系统范围](docs/requirements.md) - [知识图谱本体](docs/ontology.md)