做一个 Obsidian 插件,通过 AI 辅助管理个人知识。
- 目标用户:有做个人笔记习惯的个人
- AI交互面板:集成聊天式问答界面,类似于 Trae 的 Copilot 侧边栏
- 参考:开源 OpenSPG 项目的源代码实现
一、整体技术架构分层
+-----------------------+
| Obsidian Plugin | <-> 用户交互层
+-----------------------+
↓ HTTP
+-----------------------+
| Core Services | <-> 核心服务层
+-----------------------+
↓
+-----------------------+
| Data Infrastructure | <-> 数据基础设施层
+-----------------------+
二、详细技术组件设计
1. 前端层(Obsidian 插件)
- 技术栈: TypeScript + Obsidian API + vue3
- 关键技术点:
- 通过
obsidian-community-lib实现插件与 Obsidian Vault 的深度集成 - 使用 Web Workers 处理本地文件解析等重计算任务
- 通过
2. 核心服务层
- 技术栈: Java + Spring AI + Neo4j Driver + Ollama
- 核心模块:
- 知识图谱****服务:
- 基于 OpenSPG 定义 Schema:
# 节点类型示例 (Document {id, title, format}) -[CONTAINS]-> (KnowledgeNode {id, content, type:concept|entity|relation}) -[RELATED]-> (KnowledgeNode) - 实时图计算:实现矛盾检测(基于节点属性冲突分析)
- 基于 OpenSPG 定义 Schema:
- 向量检索服务:
- 集成 Neo4j 5. x 的向量搜索扩展
- 混合检索策略:关键词匹配+语义相似度
- 智能目录引擎:
- 基于层次聚类算法自动生成文件目录
- 路径推荐使用改进的 PrefixSpan 算法
- 知识图谱****服务:
3. 数据基础设施层
- 存储方案:
- 知识图谱存储: Neo4j Community Edition(兼容 LPG 模型)
- 向量存储: 利用 Neo4j 的
vector索引类型 - 原始文档存储: 直接复用 Obsidian Vault 的本地文件系统
- 数据处理:
- 增量索引:通过文件系统监听(如 WatchService)触发处理流水线
三、关键技术实现路径
1. QA-Pair 标准化处理
2. 知识图谱动态构建
// 自动化图谱更新Cypher示例
MATCH (d:Document {id: $docId})
FOREACH (kn in $knowledgeNodes |
MERGE (k:KnowledgeNode {id: kn.id})
SET k.content = kn.content
MERGE (d)-[:CONTAINS]->(k)
)
FOREACH (rel in $relations |
MATCH (s:KnowledgeNode {id: rel.source})
MATCH (t:KnowledgeNode {id: rel.target})
MERGE (s)-[r:RELATED {type: rel.type}]->(t)
)
3. 混合检索实现
// 混合检索示例(Neo4j Java API)
@Query("""
CALL db.index.vector.queryNodes('knowledge_vectors', $topK, $queryEmbedding)
YIELD node AS kn, score
WITH kn, score * 0.7 AS finalScore
OPTIONAL MATCH (kn)-[r]-(related)
WHERE ANY(t IN $keywords WHERE kn.content CONTAINS t)
SET finalScore = finalScore + size($keywords) * 0.3
RETURN kn, finalScore
ORDER BY finalScore DESC LIMIT 10
""")
List<KnowledgeNode> hybridSearch(@Param("queryEmbedding") float[] embedding,
@Param("keywords") List<String> keywords);
4. 异步处理管道
// 前端触发文件处理流程
obsidian.on('file-change', async (file) => {
enqueueProcessingTask(file).then(() => {
showStatusBar('后台处理中...');
});
});
四、当前阶段不实现的功能
- 知识图谱可视化: 基于 d3. js 或 vis. js 的图谱交互视图。可基于 Neo4J 本身的可视化交互功能先使用,后续有进一步需求再实现。
感兴趣的同学联系我、私我、关注我、收藏我,加我 EQCover