基于知识图谱(Knowledge Graph)的学习类软件

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 基于知识图谱(Knowledge Graph)的学习类软件

做个能用的学习软件 / EdukgApp

1 项目概述

本项目是一套基于知识图谱(Knowledge Graph)的学习类软件。


就用户侧而言,本项目可提供一般学习软件所包含的知识点查看、知识问答等功能,也可以提供基于图谱实现的独特功能,以提供新的学习方式。


就开发侧而言,本项目的主要功能均基于图谱实现,可以充分利用图算法寻找知识内部的关联。


本项目中涉及到域名的部分,有些采用自定义域名解析,因此若要运行请先设置如下hosts:


123.60.58.194 edukgappdb  # 用户数据库
127.0.0.1 edukgappserver  # 通用后端

因为我们的一些组件位于服务器上,而这些服务器并非长期租用,所以我们不保证一段时间后本项目仍可正常运行。


2 需求分析


  • 用户管理
  • 注册与登录,权限认证
  • 收藏
  • 历史记录
  • 基础图业务:使用赛方提供的接口
  • 具体内容对照edukg的接口文档实现
  • 拓展图业务:自行实现图算法
  • 推荐算法
  • 路径搜索
  • 大纲树抽取


3 系统架构


本项目采用多端分离的分布式架构,具体而言包括如下部分:


  • 客户端
  • 基于安卓实现
  • 主要面向移动端用户,这也是用户唯一可见的组件
  • 通用后端
  • 基于Java Spring实现
  • 唯一与客户端进行直接交互的组件,根据客户端的交互请求,将其就地处理或转发至其他组件
  • 算法端
  • 基于Python Flask实现,负责拓展图业务部分
  • Python与Neo4j的交互更加便捷
  • 用户数据库
  • Mysql,负责用户管理部分
  • 存储用户名、密码、收藏、历史记录等基本信息
  • 知识数据库
  • Neo4j,负责拓展图业务部分
  • 内容与下发的数据一致
  • edukg
  • 赛方提供的组件,负责基础图业务部分


4 各模块详细说明


4.1 客户端


主页


完成登录后进入主页,主页可以切换“首页”、“探索”和“我的”三个页面。首页主要展示学科分类列表,并可以进入搜索和知识问答页。探索页面可以进入知识链接、实体推荐、路径分析、知识大纲和历史数据页面。“我的”页面可以显示浏览数、做题数,并进入收藏、历史、本地缓存等页面,此外还可以在本页面清除缓存。


实体详情页


从各个功能得到的实体列表中点击实体可以进入实体详情页。实体详情页会显示实体的名称、学科、属性和与其他实体的关系。通过这些关系可以跳转到对应的实体详情页。此外,实体详情页还提供实体相关的练习题。在实体详情页可以对实体进行收藏和分享。


实体列表相关页面


  • 主页的“首页”页面会显示学科分类列表,显示每个学科的相关实体。可以对学科进行添加和删除。
  • 搜索页面会显示搜索结果列表。搜索需分学科,提供默认排序、按名称排序、按属性排序和浏览历史优先排序等多种排序方式。
  • 本地缓存页提供本地浏览过实体详情页的实体列表,这些实体的详情页可以离线浏览。
  • 历史页提供当前用户浏览的实体详情页的历史记录,这些实体由后端储存,根据当前登录用户给出。
  • 收藏页提供当前用户收藏的实体。
  • 实体推荐页会根据当前用户的浏览历史分学科推荐相关实体。
  • 知识链接页会在用户输入的一段文本中寻找知识点,并给出相应的实体列表。
  • 路径分析会找出两个实体之间的最多五条最短路径(路径上的相邻实体互相有关联),并给出每条路径的实体列表。


其他页面


  • 知识问答页:分学科进行知识问答,系统将回答用户用自然语言提出的学科相关的问题。
  • 历史数据页:对用户过往浏览数的学科分布、过往的做题数和正确率等数据进行图表式的呈现。
  • 知识大纲页:根据中心实体寻找两跳以内的其他实体绘制知识大纲图。


4.2 通用后端

4.2.1 组件划分

  • 安全 com.edukgapp.security
  • 数据库 com.edukgapp.database
  • 控制器 com.edukgapp.controller

4.2.2 安全组件

基本设计

基于JsonWebToken实现无会话的安全机制,具体工作逻辑如下:


该机制允许后端不保存会话,用户可以任意在多个后端之间切换,而该过程对用户和后端而言都是透明的。这种设计可以有效降低后端的复杂性,并且有利于扩展。

实现方式


  • JwtTokenUtil: 用于生成和解析JWT的各种工具
  • JwtRequestFilter: 自定义的过滤器,从请求头中取出JWT进行检验,并根据检验结果将请求导向不同的处理组件
  • WebSecurityConfig: 整体设置,将自定义的过滤器加入过滤器链中,以及进行其他设置
  • 其他构成部分,均依托于上述三个主体组件展开


4.2.3 数据库组件

实现方式

使用Spring框架提供的JPA组件与Mysql建立连接并进行交互。

在实现时,我们只需要为Mysql表建立一个对应的描述实体类,然后基于该类声明一个Repository接口即可。

Spring为自动实现该接口,包含最基础的一些查询方法。可以按照特定的语法规则在接口中声明额外的查询方法,Spring依然可以自动实现。

具体的实体
  • AppInfo: edukg的用户名和密码等
  • Account: 用户账号
  • Favorite: 收藏
  • History: 历史记录

4.2.4 控制器组件


概述

控制器组件为Spring框架中的Controller类,用于接受网络请求。

我们将请求分为三类,分别进行不同的处理。


  • 用户管理:与用户数据库交互
  • 基础图业务:通过RestTemplate发送网络请求,转交给edukg处理
  • 拓展图业务:通过RestTemplate发送网络请求,转交给算法端处理

虽然处理方式有所区别,但是对前端统一了交互方式,可以降低前端的开发复杂性。

接口说明

接口说明可在提交的后端代码根目录下看到(README.md),我们认为不必将这些内容复制粘贴到这里。

4.3 算法端

4.3.1 服务器

基于Flask框架实现。

现阶段没有给算法端设置复杂的安全机制。


接口说明如下:

post: /get-framework

参数:

  • uri: 中心实体的uri

返回值:

{
  'uri': '',
  'label': '',
  'rel': '', # 与上级实体关联的关系,以标签形式给出
  'sub': []
}
sub 中的每一项都递归采用相同的结构
post: /get-path

参数:

  • s: 起点实体的uri
  • t: 终点实体的uri

返回值:

[
  [
    {
      'type': '',
      'uri': '',
      'label': ''
    },
    ...
  ],  # 这是一条路径
  ...
]
post: /get-recommendation

参数:

  • course: 学科代号
  • hisotry: 历史记录列表,列表中每一项是一个uri

返回值:

[
  {
    'uri': '',
    'label': ''
  },
  ...
]


4.3.2 与数据库交互

使用py2neo包连接Neo4j数据库,构造Cypher语句后直接使用graph.run()方法进行查询。

4.3.3 算法

大纲抽取

首先搜索中心实体附近一跳的实体:


match (s {uri: "%s"})-[r1]-(t1:Entity)
with s, r1, t1 limit 5
return r1.uri as r1, t1.uri as t1, s.course as course

然后以一跳实体为起点搜索两跳实体,同时避免搜索到重复结果。

分两步搜索是因为Neo4j的执行逻辑存在限制,合并搜索可能导致完全拿不到结果。

with source_list as source
match (t1)-[r2]-(t2:Entity)
where (t2.course = "%s") and (t1.uri in source) and (not t2.uri in source) and (t2.uri <> "%s")
with t1, r2, t2 limit 15
return t1.uri as t1, r2.uri as r2, t2.uri as t2

经过两步搜索后,结果中仍然可能存在环路结构,具体而言是从中心实体经过不同的一跳实体到达同一个两跳实体。因此用Python进行后处理,消除环路,形成支撑树。

路径搜索

使用Neo4j提供的最短路功能:

match (p1:Entity {uri: "%s"}), (p2:Entity {uri: "%s"}),
path=allshortestpaths((p1)-[*..10]-(p2))
with path limit 5
return path
推荐算法


推荐算法分为两部分,基于PageRank的全局推荐,和基于Jaccard指数的个性化推荐。

全局推荐:使用gds插件的PageRank方法,分学科进行。

call gds.pageRank.stream("%s")
yield score, nodeId

个性化推荐:Jaccard指数是评估两个集合之间相似性的常用方法之一。将用户历史记录实体及其附近一跳的实体作为一个集合,然后同学科内的每个实体及其附近一跳的实体各构成一个集合,将这些集合与历史记录集合分别求Jaccard指数,并将相似性较高且不存在于历史记录中的实体返回。


with ' + history_str + ' as source
match (s)-[]-(s1:Entity) where s.uri in source
with source, s, collect(id(s))+collect(id(s1)) as sSet
match (t:Entity)-[]-(t1:Entity) where (t.course = s.course) and (not t.uri in source)
with sSet, t, collect(id(t))+collect(id(t1)) as tSet
with t, gds.alpha.similarity.jaccard(sSet, tSet) as similarity
return id(t) as t order by similarity desc


4.4 数据库


4.4.1 用户数据库


使用Mysql搭建,仅依赖于Mysql的基本服务。

该数据库需要频繁访问,且会发生频繁的修改,现阶段只有一个数据库,若要扩大业务规模则需要做分布式重构。


4.4.2 知识数据库


使用Neo4j搭建,需要额外的gds(Graph Data Science)插件。


该数据库的修改频率很低,主要功能是以算法的形式提供查询服务。


因为不需要考虑数据的并发写入,所以只需要简单地设置多个一样的知识数据库即可扩大业务规模。


完整代码+项目报告:


https://download.csdn.net/download/pythonyanyan/87390274

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
机器学习/深度学习 自然语言处理 分布式计算
知识图谱(Knowledge Graph)之综述理解
知识图谱(Knowledge Graph)之综述理解
978 0
知识图谱(Knowledge Graph)之综述理解
|
机器学习/深度学习 算法 知识图谱
cs224w(图机器学习)2021冬季课程学习笔记12 Knowledge Graph Embeddings
cs224w(图机器学习)2021冬季课程学习笔记12 Knowledge Graph Embeddings
cs224w(图机器学习)2021冬季课程学习笔记12 Knowledge Graph Embeddings
|
20天前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
73 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
🔍 Prompt、RAG、Fine-tuning三者各自的优势是什么?
【10月更文挑战第15天】在人工智能模型的开发中,Prompt、RAG(检索增强生成)和Fine-tuning是三种常见的优化技术。Prompt通过少量示例引导模型生成特定输出,简单灵活;RAG结合检索和生成,适合需要大量外部知识的场景,提高答案准确性和可解释性;Fine-tuning通过特定任务或数据集训练模型,提升特定场景下的表现,适用于有大量数据和计算资源的场景。开发者需根据具体需求选择最合适的优化策略。
64 4
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【Prompt Engineering提示工程技术:思维树 (ToT)、检索增强生成 (RAG)、自动推理并使用工具 (ART)】
思维树(ToT)框架,旨在解决复杂任务,通过构建一棵思维树,利用语言模型生成并评估中间步骤,结合搜索算法(如广度优先搜索)进行系统探索。ToT在不同任务中需定义思维步骤及候选数量,如“算24游戏”需三分步骤,每步评估可行性。实验表明,ToT显著优于其他提示方法。此外,ToT框架可结合强化学习不断进化,提升解决复杂问题的能力。
111 1
【Prompt Engineering提示工程技术:思维树 (ToT)、检索增强生成 (RAG)、自动推理并使用工具 (ART)】
|
3月前
|
存储 NoSQL 搜索推荐
知识图谱(Knowledge Graph)根本概念
知识图谱(Knowledge Graph)根本概念
97 0
|
3月前
|
存储 数据库 知识图谱
知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表
知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表
54 0
|
人工智能 自然语言处理 机器人
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人
|
机器学习/深度学习 数据可视化 大数据
深度学习实践篇 第七章:transfer learning for computer vision
简要介绍如何使用预训练好的模型做训练。
|
机器学习/深度学习
cs224w(图机器学习)2021冬季课程学习笔记7 Graph Neural Networks 1: GNN Model
本章主要内容: 介绍深度学习基础。 介绍GNN思想:聚合邻居信息。 每一层都产生一种节点嵌入。将上一层的邻居信息聚合起来,连接本节点上一层信息,产生新的节点嵌入。 第一层节点嵌入就是节点特征。 GCN:用平均值作为聚合函数。 GraphSAGE:用各种聚合函数。
cs224w(图机器学习)2021冬季课程学习笔记7 Graph Neural Networks 1: GNN Model
下一篇
无影云桌面