feat(kb): 入库可视化做厚 —— 文件解析/知识抽取过程 + 力导向知识图谱
把"进度条"升级成可观测的入库工作台,回应三点诉求:解析过程、知识抽取过程、丰富图谱。 - contract: IngestEvent 加 Preview(解析文本预览)+ Triples[]TripleView(抽出的三元组)。 - 后端回流:rag.Ingest 抽实体阶段把 LLM 抽出的三元组实时回流(边出现边渲染); gateway 解析完成回流文件类型 + 文本预览片段。 - 前端 GraphView.tsx:零依赖自建力导向布局(斥力+边弹簧+居中静态收敛),实体=节点 按度着色(枢纽紫/关联青/叶子)、关系=带标签边、hover 高亮邻域、节点过多按度裁剪。 - 前端 KbView 重做:入库从"阶段徽标+进度条"→竖向时间线(解析预览/切块块/向量化进度/ 抽取知识三元组 chips + 实时小图谱逐步浮现);右侧知识图谱从扁平列表→GraphView, 入库完成自动刷新整库图谱。 验证(Preview):入库一段多事实文本 → 时间线逐阶段点亮、抽出 17 条三元组实时浮现、 右侧力导向图渲染 sundynix-agentix/知识库 为枢纽 + 带标签关系边。tsc+vite+后端 build 通过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
@@ -74,7 +75,11 @@ func (h *Handler) runIngest(job, kb, filename string, data []byte, rawText strin
|
||||
_ = h.bus.CompleteStream(job)
|
||||
return
|
||||
}
|
||||
emit(contract.IngestEvent{Stage: "解析完成", Msg: "解析出 " + itoa(len([]rune(parsed))) + " 字"})
|
||||
emit(contract.IngestEvent{
|
||||
Stage: "解析完成",
|
||||
Msg: fmt.Sprintf("%s · 解析出 %d 字", fileKind(filename), len([]rune(parsed))),
|
||||
Preview: head(parsed, 240),
|
||||
})
|
||||
text = parsed
|
||||
}
|
||||
|
||||
@@ -157,6 +162,34 @@ func itoa(n int) string {
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// head 取文本前 n 个字符(按 rune),用于解析预览。
|
||||
func head(s string, n int) string {
|
||||
s = strings.TrimSpace(s)
|
||||
r := []rune(s)
|
||||
if len(r) <= n {
|
||||
return s
|
||||
}
|
||||
return string(r[:n]) + "…"
|
||||
}
|
||||
|
||||
// fileKind 由扩展名给出可读的文件类型标签。
|
||||
func fileKind(filename string) string {
|
||||
switch strings.ToLower(filepath.Ext(filename)) {
|
||||
case ".docx":
|
||||
return "Word 文档"
|
||||
case ".xlsx", ".xls":
|
||||
return "Excel 表格"
|
||||
case ".pdf":
|
||||
return "PDF"
|
||||
case ".csv":
|
||||
return "CSV"
|
||||
case ".md", ".markdown":
|
||||
return "Markdown"
|
||||
default:
|
||||
return "文本"
|
||||
}
|
||||
}
|
||||
|
||||
// parseFile 把文件字节转为纯文本:文本类直读,其余经 mcp-py parse_document(算法层)。
|
||||
func (h *Handler) parseFile(ctx context.Context, filename string, data []byte) (string, error) {
|
||||
switch strings.ToLower(filepath.Ext(filename)) {
|
||||
|
||||
Reference in New Issue
Block a user