feat(kb): 笔记可编辑(按 doc 替换重索引)+ 笔记关系图([[双链]])
Obsidian 化继续:笔记能编辑/新建,文档间 [[双链]] 连成可点关系图。
按 doc 重索引(编辑不重复累积):
- Milvus 加 doc 字段(旧 schema 自动重建);insert 带 doc;deleteDoc(kb,doc) 重入库前清旧块。
- Bleve 索引 id 含 doc + deleteDoc 按 kb+doc 清旧块。
- rag.Ingest(kb, doc, text):写入前按 doc 删旧块再写(Neo4j MERGE 仍幂等,附加式)。
- kb_ingest 工具加 doc 参数;gateway runIngest 把 doc 透传,forceDoc 支持编辑保持笔记名稳定。
编辑/新建:
- gateway POST /kb/note {kb,name,content}:落库 + 以 name 为 doc 重入库(替换旧块,搜索/图谱同步)。
- 前端 VaultPanel:阅读/编辑切换(textarea 预填原文,保存调 saveNote)、新建笔记、乐观更新。
笔记关系图:
- GraphView 加 onNode(节点可点);VaultPanel 阅读/关系图切换,关系图 = 文档间 [[双链]] 三元组
力导向(点节点跳转该笔记)。
验证:curl 编辑 笔记B → 检索只返编辑后内容(旧块已清,不重复)。Preview:关系图渲染
笔记B—链接→项目A概述/模块X 且节点可点;编辑器预填原文可改可存。tsc+vite+后端 build 通过;重建 .app。
注:Milvus 加 doc 字段会触发集合重建(旧向量丢,文库原文在 PG 可重灌);Neo4j 图谱按附加式合并,
编辑删除的实体不会自动消失(图谱倾向增长)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -114,8 +114,9 @@ func (e *Engine) Status() map[string]bool {
|
||||
}
|
||||
|
||||
// Ingest 把一段文本切块 → 分批向量化 → 写 Milvus + Bleve,返回块数。
|
||||
// doc 非空表示这是某篇文档/笔记(按 doc 先删旧块再写,支持编辑替换,不重复累积)。
|
||||
// onProgress 非空时逐阶段/逐批回调进度(用于实时入库监控)。
|
||||
func (e *Engine) Ingest(ctx context.Context, kb, text string, onProgress func(contract.IngestEvent)) (int, error) {
|
||||
func (e *Engine) Ingest(ctx context.Context, kb, doc, text string, onProgress func(contract.IngestEvent)) (int, error) {
|
||||
emit := func(ev contract.IngestEvent) {
|
||||
if onProgress != nil {
|
||||
onProgress(ev)
|
||||
@@ -144,12 +145,16 @@ func (e *Engine) Ingest(ctx context.Context, kb, text string, onProgress func(co
|
||||
}
|
||||
|
||||
emit(contract.IngestEvent{Stage: "写Milvus", Msg: "向量库写入中"})
|
||||
if err := e.mv.insert(ctx, kb, chunks, vecs); err != nil {
|
||||
if len(vecs) > 0 {
|
||||
e.mv.deleteDoc(ctx, kb, doc, len(vecs[0])) // 编辑/重入库:先清该 doc 旧块
|
||||
}
|
||||
if err := e.mv.insert(ctx, kb, doc, chunks, vecs); err != nil {
|
||||
emit(contract.IngestEvent{Stage: "失败", Error: "写Milvus: " + err.Error()})
|
||||
return 0, err
|
||||
}
|
||||
emit(contract.IngestEvent{Stage: "写Bleve", Msg: "全文索引写入中"})
|
||||
_ = e.bleve.index(kb, chunks) // 同步写全文索引(失败不阻断向量入库)
|
||||
e.bleve.deleteDoc(kb, doc)
|
||||
_ = e.bleve.index(kb, doc, chunks) // 同步写全文索引(失败不阻断向量入库)
|
||||
|
||||
// 图谱路:LLM 抽实体/关系 → Neo4j(可降级,不阻断向量入库)。
|
||||
if e.graph.ready() && e.chatClient().ready() {
|
||||
|
||||
Reference in New Issue
Block a user