Files
mnote/design/07-ai/process/7-75-knowledge-rag-ui-panel-optimization-v1.md
T
Agent Board b798f628ee chore: land tree view-state, vault, Pi module split, and repo hygiene
Persist PageTree expand state via control-plane view-state and align
chevron/DOM with restored expansion; keep Sidex-style shallow page-tree
scan and drop the unused recursive scanner that only added cargo noise.

Add password vault workbench routes/runtime/skill/CLI, split page_ai_pi
into a module package, and retire Hermes/ACP/OpenHub recycle + root
harness evidence from the index while gitignoring recycle and local
diag dumps.

Archive superseded design/bugs docs under old/, point architecture at
ARCHITECTURE.md, and refresh smokes for Pi S1–S7, vault, and editor
regressions so the working tree can stay clean.
2026-07-21 05:13:05 +08:00

16 KiB
Raw Blame History

7-75 [process] Knowledge RAG UI 面板优化 v1

创建时间:2026-07-13

状态:PROCESS

Owner07-ai

范围:3000 主壳中的知识库 / RAG / OCR 状态面板、FileTree 知识库状态灯、当前页面附件索引入口、Page AI 对知识库状态的可见性。

上位依据:

  • /mnt/Data1T/mnote/ARCHITECTURE.mdCURRENT_ARCHITECTURE.md 为兼容指针)
  • /mnt/Data1T/mnote/design/07-ai/done/7-50-lightrag-knowledge-rag-provider-v1.md
  • /mnt/Data1T/mnote/design/07-ai/done/7-51-lightrag-post-commit-hardening-v1.md
  • /mnt/Data1T/mnote/design/07-ai/done/7-52-lightrag-image-ocr-search-chain-hardening-v1.md
  • /mnt/Data1T/mnote/design/10-review/done/20-post-lightrag-runtime-hardening-checklist-v1.md

1. 第一结论

当前更高优先级不是先恢复旧本地 OCR sidecar,而是把 Knowledge RAG UI 面板 做成用户能理解和操作的资料库控制面。

原因:

  • /api/local-folder/ocr/* 已退役,当前图片 / PDF / Office OCR 与资料库问答主线统一走 Knowledge RAG provider。
  • LightRAG 本地服务已具备图片 VLM / MinerU 路由能力,但用户在 MNote 里看不到“这张图是否已索引 / 是否已有 OCR 文本 / 是否失败 / 是否过期”。
  • FileTree 目前只有 indexed / indexing / failed 三态,缺少 not_indexed / stale / ocr_text_exposed / provider_unavailable 等用户可行动状态。
  • Page AI 能直接看本地图片,但长期知识库和非多模态模型仍需要 OCR / sidecar / indexUI 必须先让用户知道当前资源处于哪种状态。

因此,本设计把“图片插入后 OCR 能力增强”拆成 Knowledge RAG 面板的一部分,而不是重开旧 OCR 入口。

2. 当前证据

2.1 已存在能力

  • Knowledge RAG source 支持 md / pdf / docx / pptx / xlsx / csv / png / jpg / jpeg / webp / gif / bmp / tif / tiff 等文件。
  • /api/knowledge-rag/ingest 已能接收 rootUri + sources[],注册 source,创建 LightRAG input symlink,并触发 provider scan。
  • FileTree 行模型已带 indexStatus,前端可渲染 indexed / indexing / failed
  • 旧 OCR sidecar frontmatter 读取 helper 仍在,可作为历史兼容读取,不作为新任务入口。
  • LightRAG health 能返回 provider 配置、pipeline 状态、VLM 是否启用、MinerU / parser routing 等诊断信息。

2.2 已确认缺口

  • 新插入图片只写为 Markdown 图片引用和本地文件,不会自动登记为 Knowledge RAG source。
  • 未索引图片没有明确 UI 状态,用户只能看到文件存在,无法知道是否可被文本模型/RAG 检索。
  • Knowledge RAG registry 中存在大量 stale / provider_missing / failed 历史记录,但 UI 缺少 doctor 视图解释和引导。
  • 当前“索引到默认知识库”入口藏在 FileTree 右键菜单,缺少当前页面级的“索引本页附件”入口。
  • 失败原因没有被产品化展示,例如 provider API key 不一致、provider missing、chunk 超时、parser 失败。
  • OCR 结果没有在图片资源 tab 或页面侧栏中形成可读 preview;用户不知道 OCR 文本是否真正暴露给 AI。
  • Page AI target package 不应恢复旧 ocrContext,但需要一个轻量 resourceOcrStatus 告诉 agent 当前资源是否已有可查 OCR / 是否应调用 Knowledge RAG / 是否需要多模态兜底。

3. 目标体验

Knowledge RAG 面板应回答用户四个问题:

  1. 资料库是否可用:provider 是否在线、当前默认 provider 是谁、队列是否忙。
  2. 哪些资源已进入知识库:当前 workspace / 当前页面 / 当前文件夹下的 source 状态。
  3. 图片/PDF/Office 是否已 OCR/解析:是否已索引、是否有真实 OCR 文本、是否只是图片占位符。
  4. 下一步能做什么:索引、重试、强制重建、打开引用、查看 OCR 摘要、查看失败原因。

目标 UI 不是 debug 面板,而是资料库操作面板。Raw provider payload 只放到折叠诊断区。

4. 非目标

  • 不恢复 /api/local-folder/ocr/* 作为主动 OCR API。
  • 不把旧 .ocr sidecar 重新变成页面正文真相。
  • 不让 MNote 复制 LightRAG 的 chunk / vector / graph 真相。
  • 不在普通页面打开、FileTree 渲染、Markdown 编辑保存中硬依赖 LightRAG 可用性。
  • 不自动清理 registry / 删除 provider 索引;任何清理、删除、强制重建都必须用户确认。

5. 信息架构

5.1 面板入口

保留当前知识库入口,但改成四区布局:

知识库
  Provider 状态
  当前页面资源
  Workspace Sources
  诊断与修复

入口位置:

  • Sidebar 顶部资料库 / 搜索附近保留主入口。
  • FileTree 右键保留“索引到知识库”,但成功后跳转或高亮 Knowledge RAG 面板对应 source。
  • 文档页资源 tab 对图片/PDF/Office 显示“资料库状态”轻量按钮。

5.2 Provider 状态区

显示:

  • provider 名称:LightRAG / WeKnora / RAGFlow / legacy fallback
  • health:在线、不可达、API key 错误、pipeline busy。
  • dashboard 链接。
  • VLM/OCR 能力:图片解析是否启用、MinerU/Docling/native 路由摘要。
  • 队列状态:queued/running/failed/retry required。

对用户文案:

  • 在线:知识库服务可用
  • 不可达:知识库服务不可用,页面仍可编辑;AI 将只能读取本地文件或多模态图片
  • API key 错误:MNote 与 provider 的 API key 不一致,请检查配置
  • 队列忙:正在解析资料,稍后会自动刷新状态

5.3 当前页面资源区

针对当前 Markdown 页面解析图片、PDF、Office、mindmap、附件引用,展示:

含义
资源 文件名、类型、路径
状态 未索引 / 排队中 / 索引中 / 已索引 / 失败 / 已过期
OCR 不适用 / 待解析 / 已有文本 / 只有占位 / 失败
操作 索引、重试、强制重建、打开资源、查看 OCR

当前页面区必须提供批量动作:

  • 索引本页附件
  • 重试失败项
  • 重建已过期项

5.4 Workspace Sources 区

展示 registry 中当前 actor 可见的 sources

含义
Source root-relative path
类型 markdown / image / pdf / office
Provider LightRAG / WeKnora / RAGFlow
状态 registry + provider status 合并结果
更新时间 registry updatedAt / provider updatedAt
引用 open_reference 可否定位

默认过滤:

  • 隐藏已删除完成项。
  • stale / failed 单独汇总到顶部。
  • 测试 fixture 或历史 provider_missing 只在诊断区展开显示。

5.5 OCR / 解析预览区

点击图片 source 后,右侧或下方展示:

  • 原图预览。
  • OCR / parsed text preview。
  • ocrTextExposed:是否返回了真实文本,而不是 Markdown 图片占位符。
  • sidecar / blocks 路径只在诊断展开时显示。
  • 复制 OCR 文本用 OCR 问 AI打开引用位置

如果没有 OCR 文本:

这张图片尚未解析成文本。多模态模型可以临时读图,但文本模型和知识库检索需要先索引。

如果只有图片占位:

provider 只返回了图片占位符,未暴露 OCR 正文。建议重试解析或改用 MinerU/VLM parser。

6. 状态模型

6.1 Source index status

后端和前端统一使用以下状态:

  • not_indexed:本地资源存在,但 registry 无有效 entry。
  • queued:已提交,但 provider 尚未开始。
  • indexingprovider processing / parsing / submitted。
  • indexedprovider doc id 存在且 indexedAt 有效。
  • failedprovider failed / provider_missing / delete_retry_required。
  • stalesource hash/mtime 变化,已有索引过期。
  • deletingdelete submitted。
  • deleteddelete completed。

FileTree 可以继续只显示少量灯号,但 tooltip / 面板必须展示完整状态。

6.2 OCR status

图片、扫描 PDF、Office 附件需要额外 OCR/解析状态:

  • not_applicable:纯文本 Markdown 等无需 OCR。
  • not_started:未提交解析。
  • processing:解析中。
  • text_exposed:引用/sidecar 中已有真实文本。
  • placeholder_only:只返回图片占位符,没有 OCR 正文。
  • failed:解析失败。
  • stale:源文件变化后 OCR 过期。

text_exposed 的判断不得只看 provider “成功”,必须看 contentDiagnostics.ocrTextExposed 或 sidecar meaningful block 数。

7. 后端合同调整

7.1 Status API

扩展 /api/knowledge-rag/status?rootUri=... 返回:

{
  "sourceSummary": {
    "total": 0,
    "notIndexed": 0,
    "indexing": 0,
    "indexed": 0,
    "failed": 0,
    "stale": 0,
    "ocrTextExposed": 0,
    "placeholderOnly": 0
  },
  "sources": [
    {
      "sourceRootRelativePath": "docs/photo.jpg",
      "resourceType": "image",
      "indexStatus": "indexed",
      "ocrStatus": "text_exposed",
      "ocrTextPreview": "前 300 字...",
      "failureMessage": null,
      "actions": ["open", "reindex", "view_ocr"]
    }
  ]
}

7.2 Current page assets API

新增或复用 Page Aggregate 输出当前页资源引用,面板拿到:

{
  "pageId": "local-md:...",
  "sourceRootRelativePath": "docs/Page.md",
  "assets": [
    {
      "href": "photo.jpg",
      "sourceRootRelativePath": "docs/photo.jpg",
      "resourceType": "image",
      "exists": true,
      "indexStatus": "not_indexed"
    }
  ]
}

这一步不要让前端重复解析 Markdown 真相;优先从 Page Aggregate / kernel projection 输出。

7.3 Ingest response

/api/knowledge-rag/ingest 当前返回 configured / scan 等信息,面板需要稳定字段:

  • submittedSources[]
  • skippedSources[]
  • retryRequired
  • providerErrorCode
  • userMessage
  • nextPollAfterMs

7.4 Registry doctor

增加只读 doctor endpoint 或 status 子对象:

{
  "doctor": {
    "staleEntries": 58,
    "providerMissingEntries": 58,
    "failedEntries": 1,
    "apiKeyMismatchSuspected": true,
    "suggestedActions": ["check_provider_config", "retry_failed", "archive_stale_test_entries"]
  }
}

清理动作必须单独确认,不在 status 读取时自动执行。

8. 前端交互

8.1 FileTree 灯号

灯号含义:

  • 无灯:不支持索引或用户未开启显示。
  • 空心灰点:支持索引但未索引。
  • 黄点:排队/索引中。
  • 绿点:已索引且 OCR 文本暴露。
  • 蓝点:已索引但该资源不需要 OCR。
  • 红点:失败。
  • 橙点:过期。

FileTree 行已有 data-index-status,需要扩展为 data-index-status + data-ocr-statustooltip 显示完整原因。

8.2 图片插入后

图片插入完成后:

  1. 保存图片文件。
  2. Markdown 写入图片引用。
  3. UI 立刻把该资源标记为 not_indexed
  4. 如果用户开启“自动索引新图片”,后台提交 /api/knowledge-rag/ingest
  5. 默认不开启自动索引时,显示轻量提示:图片已插入,可索引后用于文本检索和非多模态 AI

自动索引应是 workspace/user preference,不是硬编码默认。

8.3 Page AI 协同

Page AI 不恢复旧 ocrContext,改用轻量状态:

{
  "resourceOcrStatus": {
    "currentPageAssets": [
      {
        "sourceRootRelativePath": "docs/photo.jpg",
        "resourceType": "image",
        "indexStatus": "not_indexed",
        "ocrStatus": "not_started",
        "recommendedReadMode": "multimodal_fallback"
      }
    ]
  }
}

AI 行为:

  • 多模态模型:可以临时读图,但应提示“未索引,无法长期检索”。
  • 文本模型:如果未 OCR,应建议用户索引图片;不要假装已读图。
  • 已 OCR:优先调用 mnote.knowledge_rag.query / section_context,必要时再多模态核验。

9. 实施步骤

Phase 1:只读状态面板

  • 统一 Knowledge RAG provider 文案,避免 LightRAG / WeKnora / RAGFlow legacy fallback 在用户界面混乱。
  • 扩展 /api/knowledge-rag/status 的 source summary 与 registry doctor。
  • 新建 Knowledge RAG 面板基础 UI,显示 provider health、source summary、失败/stale 汇总。
  • FileTree tooltip 展示当前 indexStatus,不改变索引行为。

Phase 2:当前页面资源闭环

  • 从 Page Aggregate / projection 输出当前页附件清单。
  • 面板展示“当前页面资源”列表。
  • 支持“索引本页附件”“重试失败项”。
  • 图片插入后刷新当前页面资源区并标记 not_indexed

Phase 3OCR 预览与诊断

  • 后端为 image/PDF/Office source 暴露 ocrStatusocrTextPreview
  • 图片资源 tab 增加 OCR/资料库状态按钮。
  • 面板支持 OCR preview、placeholder-only 诊断、失败原因展示。
  • Page AI target package 增加轻量 resourceOcrStatus

Phase 4Doctor 与配置修复

  • 增加 registry doctor UI。
  • 检测 MNote 读取的 LightRAG API key 与 provider 实际认证失败时的差异,给出明确配置建议。
  • 对 stale/provider_missing 历史记录提供“归档测试记录”建议,但执行前必须确认。
  • 增加失败重试与强制重建的确认流程。

10. 验收标准

  • 插入一张图片后,当前页面资源区能立即显示该图片为 未索引
  • 对该图片点击“索引”后,UI 进入 索引中,并能在 provider 完成后转成 已索引失败
  • 图片如果 provider 只返回 Markdown 图片占位,UI 必须显示 未暴露 OCR 正文,不能显示成 OCR 成功。
  • 图片 OCR 成功后,用户能在面板看到 OCR 预览,并能让 Page AI 基于 Knowledge RAG 查询引用。
  • provider 不可达或 API key 错误时,页面编辑不受影响,面板显示明确诊断。
  • .ocr sidecar 不作为普通页面进入 PageTree;历史 sidecar 只作为兼容资源打开。
  • 非多模态模型面对未 OCR 图片时,不声称已读取图片内容。

11. 测试计划

Rust

  • cargo test -p mnote-web knowledge_rag -- --test-threads=1
  • 增加 knowledge_rag_status_reports_not_indexed_page_assets
  • 增加 knowledge_rag_status_reports_ocr_text_exposed_only_for_meaningful_sidecar
  • 增加 knowledge_rag_registry_doctor_reports_provider_missing_without_cleanup
  • 增加 page_ai_target_package_includes_resource_ocr_status_without_ocr_context

Browser smoke

  • 新增 scripts/task8xx-knowledge-rag-panel-status-smoke.js
    • 登录 mnote-e2e
    • 打开含图片页面
    • 验证面板显示 provider health、当前页面图片、未索引状态
  • 新增 scripts/task8xx-knowledge-rag-image-index-flow-smoke.js
    • 用测试图片触发索引
    • 验证 FileTree 状态灯从未索引到索引中
    • provider 可用时验证 OCR previewprovider 不可用时验证失败诊断
  • 更新 Page AI smoke
    • 文本模型未 OCR 图片:提示需要索引
    • 多模态模型可临时读图,但回答标记未长期索引

12. 风险

  • LightRAG provider 解析大文件可能慢或超时;UI 必须将失败原因产品化,不能只显示“索引失败”。
  • 自动索引新图片可能消耗 VLM / MinerU 成本;默认建议关闭,由 workspace preference 控制。
  • registry 历史测试数据较多,doctor 只能提示,不应自动删除。
  • provider 名称当前存在历史口径漂移;面板第一阶段必须先统一用户可见命名。

13. Definition of Done

  • 用户在 MNote 内不用打开终端,就能判断当前图片/PDF/Office 是否已进入知识库、是否有 OCR 文本、是否失败、是否过期。
  • 用户可以从当前页面一键索引本页附件,并看到可追踪状态。
  • Page AI 能基于状态选择:直接读本地文件、多模态临时读图、或调用 Knowledge RAG。
  • 旧 OCR sidecar 仍可兼容打开,但不会重新成为主路径。