AI 知识管理-基于Obsidian插件的设计思路

147 阅读2分钟

做一个 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)
        
      • 实时图计算:实现矛盾检测(基于节点属性冲突分析)
    • 向量检索服务:
      • 集成 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