为什么构建个人知识图谱
第一个要回答的问题就是为什么构建 个人知识图谱?
这个问题对于我个人来说很简单,就是为了管理自己的知识,构建完整的知识体系,打造第二大脑,当然我的要求在知识管理的基础上对知识实体识别的需求可能更贴合知识图谱的概念。
知识管理的形式?
是不是所有人都需要构建知识图谱?
答案肯定是否定的。知识管理有很多形式。你可以记日记、记笔记、用书签管理、写博客、用带着目录树的工具整理资料、或者画各种知识导图沉淀。
而知识图谱知识一种比较好的可视化方式,并且和人类大脑的神经网络原理比较类似的一种实现方式, 而恰恰对于我来说,大家最常用的按照目录总结知识不能够满足我的需求,因为除了大数据量下不够直观,就单单把所有知识都归类到目录里面,就是一件很困难的事情。
现有工具能满足么?
我觉得这个是大家在计划构建知识图谱之后第一个要考虑的问题:是不是有现有的工具能满足你对知识管理的需求。
除了我的脑子,我用到(用过)的工具很多,包含但不限于下面这些,我觉得他们中的某一款能已经能满足大多数人的需求:
• Microsoft OneNote
• MacOS Notes
• Quiver
• Youdao Notes
• 印象笔记
• Obsidian
• XMind
• The Brain
• iThoughtX
• VuePress
• Notion
• Excel
所有的工具都有各自的优点,但是也都有不那么满足我需求的地方,经常想要是能把他们的优点结合起来就好了。
• 一些脑图工具适合简答的展示,但是复杂内容关联,大数据管理 和搜索能力不够;
• 大多数笔记工具写作体验很好、全文搜索很方便,但是关键词搜索不行;
• 类似 Obsidian 这样的包含图谱能力的工具提供了很棒的功能,其实能解决很多人的问题,但是其扩展方式包括 UI 体验,有点儿不太适合我打造第二大脑的想法。
如果你只是想画一些脑图,有很多优秀的工具来实现。
同样的,笔记软件也有很多优秀的。
Obsidian 包括很多国产的类似工具提供了知识关联和脑图展示。
而现如今我觉得最大的问题就是搜索、知识关联、资源连接。而做一个一劳永逸的工具,可能对我来说是比较好的方案。
个人知识图谱放什么
好了,既然我们已经确定了要做知识图谱,而不仅仅是记录,下一个问题就是个人知识图谱里面放什么内容?
由于我现在还主要和各种技术打交道,所以我的知识图谱主要就是各种技术工具(包含各种开源项目)、技能、方法论等。
另外我还写了很多文章,除了很早之前在 JavaEye、博客园等平台的「旧文章」之外,还有大几百篇博客文章,也没有很认真的进行分类归纳, 内容也比较杂,不能整体进行查看管理,这块后期我也要集成到知识图谱里面。
除了技术和历史文章,国内外的公司以及产品,一些商业思维和管理框架我也很感兴趣,当然一并放入我的知识图谱里面了。
如何动手做个人知识图谱?
经常有人开玩笑说,价值一个亿的商业想法有了,就差一个程序员、一个产品经理、一个设计师?
做个人知识图谱,首先要有知识吧,其次要有图谱吧,咱们简单粗暴一点拆解,知识图谱就先做这两个东西。既然定位是个人 的,那肯定怎么开心怎么搞了。
如何进行知识存储
为了检索效率以及满足未来扩展能力,我们直接用最简单的方案,使用数据库存储知识。
我们先实现一个最最简单的图模型,有两个对象:「节点」和「边」。
节点和边只有最基本的属性,足矣支撑我们实现最初的知识图谱。后续可以在此基础上为节点和边补充更多的属性, 比如节点类型、节点标签、节点颜色,边类型等。
这里简单用代码表示一下数据结构:
转换成代码可能是这样:
class KgNode {
String id
String name
}
class KgEdge {
String source
String target
}
有很多可用的 ORM 和数据库框架来实现数据存储,比如 Python 的 SqlAlchemy,Java 的 Spring Data JPA等, 后端实现我就不再赘述,大家可以参考使用自己喜欢的方法来实现,
如何进行图谱展示?
我们还是使用通用的方式,使用 Web 浏览器来展示图谱,简单说,就是写一个网页。
工欲善其事,必先利其器,对图谱进行可视化肯定要有个趁手的工具,常见(或者不常见)的可视化库有下面几个:
• d3.js
• ECharts
• AntV
• Graphology
• cola.js
我最终选择了使用 d3-force-3d 来实现图谱展现的第一版。
知识图谱实现
个人知识图谱的方案如上所述,下面大概讲一下我怎么实现的。
后端(可选)
后端功能我估计未来会比较复杂,所以没用 Python,直接用 Java 做原型开发。
首先就是初始化[12]一个 SpringBoot 项目。
然后连接上咱的 Postgres 数据库,写两个 API 接口返回下数据。
前端实现
直接参考例子[13] 写一个界面,然后用我们《三天速成JavaScript》的知识来修改一下:
const elem = document.getElementById('3d-graph');
const Graph = ForceGraph3D()
(elem)
.graphData(data)
.nodeLabel('id')
.nodeAutoColorBy('group')
.nodeLabel((node) => {
return node.name
})
.onNodeClick(node => {
// Aim at node from outside it
const distance = 40;
const distRatio = 1 + distance/Math.hypot(node.x, node.y, node.z);
const newPos = node.x || node.y || node.z
? { x: node.x * distRatio, y: node.y * distRatio, z: node.z * distRatio }
: { x: 0, y: 0, z: distance }; // special case if node is in (0,0,0)
Graph.cameraPosition(
newPos, // new position
node, // lookAt ({ x, y, z })
3000 // ms transition duration
);
});
如果是后端数据源,
const data = await axios.get('/api/graphData')
如果没有写后端,咱们直接把数据给写出来就好:
const data = {
nodes: [
{id: llm, name: 'LLM'},
{id: openai, name: 'OpenAI'}
],
edges: [
{source: 'llm', target: 'openai'}
]
}
最后补充下数据,看看结果:
结语
首先现有的五花八门的工具能满足大多数人的个人知识管理以及知识图谱的需求。
其次对于我这种没事儿找事儿的,先把思路理清楚,出个原型,构建个人知识图谱也很容易实现。
万事开头难,明天继续补充细节和功能。
引用链接
[1] XMind: https://xmind.app/features/[2] iThoughts: https://www.toketaware.com/ithoughts-osx[3] d3.js: https://d3js.org/[4] d3-force: https://d3js.org/d3-force[5] D3 Force 3d: https://github.com/vasturiano/3d-force-graph[6] ECharts: https://echarts.apache.org/[7] G6: https://g6.antv.antgroup.com/[8] Graphin: https://graphin.antv.vision/zh[9] Graphology 的文档: https://graphology.github.io/[10] Graphology 的文档: https://graphology.github.io/[11] 在线Examples: https://codesandbox.io/examples/package/graphology[12] 初始化: https://start.spring.io/[13] 例子: https://github.com/vasturiano/3d-force-graph/blob/master/example/click-to-focus/index.html
--- END ---

