Skip to content

Commit 63f86ab

Browse files
committed
docs(v0.14): B/C/D 子项目设计规格落位(视觉系统/知识体系架构/采集质量攻坚)
1 parent 7b01da5 commit 63f86ab

4 files changed

Lines changed: 525 additions & 3 deletions

File tree

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
# v0.14 子项目 D:采集质量攻坚设计规格(结构 / 质量 / 算法 / 平台 四层)
2+
3+
> 状态:✅ 已批准(2026-08-28,逐节确认)
4+
> 所属版本:v0.14
5+
> 范围:子项目 D——章节级混合形态笔记 / 双维决策质量门控 / 版面重建+行合并+跨帧增量+行级重识别 / 平台模板适配
6+
7+
## 1. 背景与目标
8+
9+
### 1.1 痛点(用户反馈,2026-08-27~28)
10+
11+
| # | 痛点 | 现状根因 |
12+
|---|------|----------|
13+
| D1 | PPT 型视频知识内容可视但笔记仍口语化 | v0.11.5 决策:`assemble_markdown` 将 OCR 画面要点移出笔记正文(笔记只剩口语转写);"转文字+手动梳理"优于"采集-转化" |
14+
| D2 | OCR 产物质量偏低,喂 AI 只增 token 消耗 | 净化链是"字幕思维"(按时间戳线性拼接),对 PPT 版面结构性错误;bbox 已落库(v0.5.0)但从未使用;无质量评估,低质量 OCR 照样进正文/喂 AI |
15+
16+
### 1.2 用户关键纠正
17+
18+
> "问题在于不是所有的视频都有 ppt,而且一个视频内也可能存在两个部分。"
19+
20+
**不能做视频级二分法**——形态决策必须下沉到**章节级**。
21+
22+
### 1.3 目标
23+
24+
1. **章节级混合形态**:整篇笔记 = 图文章节 / 口语章节混编,每章独立决策
25+
2. **质量门控**:低质量 OCR 不进正文、不喂 AI(省 token);质量分诚实呈现
26+
3. **算法提质**:屏内版面重建(bbox 空间排序)+ 行合并评分器 + 跨帧增量合并 + 行级重识别(官方 adapter 编排自研)
27+
4. **平台适配**:B站/抖音/Edge 视频区 ROI + 字幕带先验 + 噪音区掩码(噪音从源头消失)
28+
5. **全链路零新增 token 成本**:规则方案,可单测,有降级
29+
30+
## 2. 方案选型记录
31+
32+
### 2.1 结构层:章节级混合形态(已裁决)
33+
34+
| 变体 | 结论 |
35+
|---|---|
36+
| A. 大纲骨架+屏幕内容为主体(视频级)| 否决——无 PPT 视频被误伤 |
37+
| B. 双轨笔记(视频级二分)| 否决——一个视频内两个部分无法处理 |
38+
| C. 最小改动(仅口语净化)| 否决——不解决"内容可视不可得" |
39+
| **章节级混合形态** | ✅ 采纳——章节边界检测(已有)→ 每章独立决策 → 图文/口语混编 |
40+
41+
### 2.2 质量层:双维决策 + 质量门控(已裁决)
42+
43+
| 维度 | 信号 | 决策 |
44+
|---|---|---|
45+
| OCR 密度(已有信号下沉)| 章节窗口内 OCR 文本量 / 屏卡数 | 密度高 → 候选图文章节 |
46+
| **OCR 质量分(新增)** | 置信度 + 碎片率 + 连贯性 + 噪音比 | 质量高 → 图文章节;**质量低 → 退回口语章节(OCR 弃用)** |
47+
48+
门控双出口:**笔记出口**(低质量不沉淀)+ **AI 精修出口**(低质量不喂 AI)。
49+
50+
### 2.3 算法层:三层叠加(已裁决,经 API 查证)
51+
52+
| 层 | 方案 | 状态 |
53+
|---|---|---|
54+
| 行合并评分器(B)| 识别后文本级合并(几何+文本信号)| ✅ 主链路 |
55+
| 跨帧增量合并(C)| PPT 动画逐行出现的增量拼接 | ✅ 主链路 |
56+
| 行级重识别(A)| 官方 `TextRecognitionAdapter` 编排自研 | ✅ 已确认 API(见 2.4)|
57+
58+
### 2.4 引擎 API 查证裁决(2026-08-28 源码验证)
59+
60+
| 结论 | 证据 |
61+
|---|---|
62+
| oar-ocr 0.9.2 **无 rec-only API** | `OAROCR.predict` 为 det+rec 一体(源码 oarocr/ocr.rs) |
63+
| **`TextRecognitionAdapter` 是公共 API** | `oar_ocr::domain::adapters::TextRecognitionAdapter` + Builder(CRNN + 预处理 + CTC 解码全封装,`supports_batching()=true`)|
64+
| 结构引擎已接入 | `OARStructure.predict_image`(structure_engine.rs,表格/公式在用)——作精修链路增强,不作实时主链路(模型 129MB+231MB)|
65+
66+
### 2.5 平台层:平台模板 + 通用几何兜底(已裁决)
67+
68+
| 变体 | 结论 |
69+
|---|---|
70+
| A. 平台硬编码模板 | 否决——网页改版即失效 |
71+
| B. 纯通用视频区检测 | 中间态——实现复杂 |
72+
| **C. 平台先验 + 通用兜底** | ✅ 采纳——模板是 JSON 数据不是代码;未命中走几何兜底;全失败走现状 |
73+
74+
## 3. 架构设计
75+
76+
### 3.1 四层数据流
77+
78+
```
79+
采集(关键帧 + bbox + 时间戳)
80+
│
81+
├─ D4 平台层:视频区 ROI 裁剪 / 字幕带先验 / 噪音区掩码(OCR 前)
82+
▼
83+
OCR 净化链(D3,重构 note_filter_ocr.rs):
84+
排序 → ① 行合并评分器 → ② 行级重识别(疑碎行)→ ③ 跨帧增量合并 → 净化 → 去重
85+
│
86+
├─ D1 结构层:章节边界检测 → 每章形态决策(图文/口语)
87+
▼
88+
D2 质量层:ocr_quality_score 门控 → 图文章节(达标)/ 口语章节(弃用/退回)
89+
│
90+
├─ 笔记出口:图文章节 OCR 主体 + 口语引用块 / 口语章节现状形态
91+
└─ AI 出口:仅达标图文章节 OCR 进精修输入(提示词标注修正错字)
92+
```
93+
94+
### 3.2 新增/修改文件清单
95+
96+
| 文件 | 职责 | 行数预算 |
97+
|---|---|---|
98+
| `chapter_morph.rs`(新)| 章节形态决策纯函数(密度×质量 → 图文/口语)| ≤150 |
99+
| `ocr_quality.rs`(新)| `ocr_quality_score` 计算(四信号加权)| ≤150 |
100+
| `layout_reorder.rs`(新)| 屏内版面重建:行聚类/栏检测/块排序(简化 XY-Cut)| ≤250 |
101+
| `line_merge.rs`(新)| 行合并评分器(几何+文本信号 + 护栏)| ≤150 |
102+
| `incremental_merge.rs`(新)| 跨帧增量合并(包含关系 + bbox 锚定)| ≤120 |
103+
| `line_rec_engine.rs`(新)| 行级重识别编排(行聚类→裁剪→官方 adapter→替换)| ≤200 |
104+
| `platform_layout.rs`(新)| 平台识别 + 模板加载 + 几何兜底(三层降级)| ≤200 |
105+
| `platform_templates.json`(新)| B站/抖音/Edge 平台模板数据(videoRoi/subtitleBand/noiseMasks)| ≤80 |
106+
| `note_filter_ocr.rs`(改)| 净化链插入 ① ② ③ 三步 | ≤40 增量 |
107+
| `note_filter.rs` / `concat.rs`(改)| 图文章节组装(OCR 主体 + 口语引用块)| ≤60 增量 |
108+
| `group_route.rs`(改)| ocr_text_density 信号下沉到章节级复用 | ≤30 增量 |
109+
110+
## 4. 详细设计
111+
112+
### 4.1 D1 章节级混合形态
113+
114+
**章节形态决策**(`chapter_morph.rs` 纯函数):
115+
116+
```
117+
输入:章节内屏卡集合(含 OCR 密度)+ ocr_quality_score
118+
决策:密度 ≥ DENSITY_TH && 质量 ≥ QUALITY_TH → 图文
119+
密度 ≥ DENSITY_TH && 质量 < QUALITY_TH → 口语(OCR 弃用,原料视图可查)
120+
密度 < DENSITY_TH → 口语(现状形态)
121+
边界:无章节边界 → 全篇退化现状;全高密度 → 整篇图文;空章节跳过
122+
```
123+
124+
**图文章节组装**(concat.rs 扩展):
125+
- 主体:OCR 屏卡要点(版面重建后的段落)
126+
- 口语降级为引用块(`> 讲者:...`,保留时间戳锚点)
127+
- 章节标题复用 `detect_outline_smart` 屏标题资产
128+
129+
### 4.2 D2 质量分与门控
130+
131+
**`ocr_quality_score`**(章节窗口内,四信号加权):
132+
133+
| 信号 | 计算 | 权重 |
134+
|---|---|---|
135+
| 置信度 | OcrBlock.score 加权均值 | 0.4 |
136+
| 碎片率 | ≤4 字块占比(越低越好)| 0.2 |
137+
| 连贯性 | 行合并后句长分布(可成句 → 高)| 0.2 |
138+
| 噪音比 | UiJunkList 命中率(越低越好)| 0.2 |
139+
140+
- **阈值**:`QUALITY_TH = 0.6`(可配置,初值经 golden 用例校准)
141+
- **AI 出口门控**:精修输入组装时过滤低质量章节 OCR(省 token);达标章节提示词标注"以下为屏幕 OCR 内容,请优先修正错字后使用"
142+
- **质量报告**:会话详情显示"本章节 OCR 质量 72 分,已采用/已弃用"(quality_report.rs 哲学延续:"指标从恒 ≈0 变真实")
143+
144+
### 4.3 D3 算法层
145+
146+
**屏内版面重建**(`layout_reorder.rs`,简化 XY-Cut):
147+
1. 行聚类:y 坐标容差(±8px)内归行
148+
2. 行内排序:x 升序
149+
3. 栏检测:相邻行稳定列间隙 → 多栏分组(栏内 y 序、栏间左→右)
150+
4. 标题识别:最大字号/最短文本行 → 标题(复用屏标题资产)
151+
5. 段落拼接:行间隙小的块合并为段落
152+
153+
**行合并评分器**(`line_merge.rs`):
154+
155+
```
156+
几何信号:垂直重叠 > 50%(同行)/ 水平间隙 < 半字宽 / 行高一致
157+
文本信号:A 尾虚词(的/了/是/在/与…)→ 续接;A 尾句号/问号 → 断开;
158+
B 首项目符号(•/-/1.)→ 新要点
159+
护栏:合并超长回退;字体差 > 30% 不合并(标题+正文)
160+
反误合并原则:宁可少合并(损失完整性)不可错合并(制造幻觉句子)
161+
```
162+
163+
**跨帧增量合并**(`incremental_merge.rs`):
164+
```
165+
帧2 文本 ⊇ 帧1 文本 && bbox 位置稳定 → 同屏增量合并(动画逐行出现)
166+
bbox 整体位移 → 翻页 → 新屏
167+
```
168+
169+
**行级重识别**(`line_rec_engine.rs`):
170+
```
171+
疑碎行判定:碎片率高(≤4 字块占比 > 阈值)或 置信度 < 阈值
172+
流程:行聚类 → 行图裁剪(bbox 并集 + padding)→ TextRecognitionAdapter::execute(批量)
173+
→ 行级文本替换碎片文本(行级得分取均值)
174+
降级:adapter 构建失败 → 保留碎片结果(能力降级不失效)
175+
挂载:engine.rs 常驻引擎池(OCR worker 线程)
176+
```
177+
178+
### 4.4 D4 平台模板
179+
180+
**平台识别**:窗口标题/URL → `platform_layout.rs`(bilibili/douyin/youtube/edge-local/unknown)
181+
182+
**模板数据**(`platform_templates.json`,数据非代码):
183+
184+
```json
185+
{
186+
"bilibili": {
187+
"videoRoi": [0.15, 0.08, 0.62, 0.72],
188+
"subtitleBand": { "y": 0.82, "h": 0.10 },
189+
"noiseMasks": ["danmaku_band", "right_recommend"]
190+
},
191+
"douyin": {
192+
"videoRoi": [0.0, 0.12, 1.0, 0.8],
193+
"subtitleBand": { "y": 0.60, "h": 0.15 },
194+
"noiseMasks": ["right_comments", "left_likes"]
195+
}
196+
}
197+
```
198+
199+
**三层降级**:命中模板 → 用模板;未命中 → 几何兜底(黑边检测/动态区域/宽高比);全失败 → 现状全窗口 OCR。
200+
201+
**收益**:OCR 只在视频区 ROI 内跑 → 弹幕/推荐流/评论区噪音从源头消失;字幕带先验让 `subtitle_detect` 从"盲找"变"带先验找"。
202+
203+
## 5. 错误处理
204+
205+
- **adapter 构建失败**:行级重识别跳过,保留碎片结果(净化链照常)
206+
- **模板 JSON 解析失败**:跳过模板层,走几何兜底
207+
- **章节边界缺失**:全篇退化现状(无回归风险)
208+
- **质量分计算异常**(空章节):按最低分处理(OCR 弃用,宁缺毋滥)
209+
210+
## 6. 测试计划
211+
212+
| 层 | 用例 |
213+
|---|---|
214+
| 纯函数 | `chapter_morph` 四象限决策(密度×质量);`ocr_quality_score` 四信号加权;`layout_reorder` 单栏/多栏/标题识别;`line_merge` 合并/断开/护栏;`incremental_merge` 增量/翻页 |
215+
| 引擎 | `line_rec_engine` 疑碎行判定 + 批量识别替换(集成测试标注:需模型文件)|
216+
| 平台 | 平台识别(标题/URL);模板加载;几何兜底(黑边/动态区域)|
217+
| 组装 | 图文章节(OCR 主体 + 口语引用块)golden 用例;混合形态整篇 |
218+
| 门控 | 低质量章节不进正文/不喂 AI(精修输入组装过滤)|
219+
| 回归 | 无 OCR 会话 → 全口语(现状形态零变化)|
220+
221+
## 7. 范围外
222+
223+
- 视频解析下载(B站/抖音内容源接入——非采集适配)
224+
- AI 版面理解(token 成本,用户反对;规则方案已覆盖)
225+
- 表格/公式 OCR 结构化(结构引擎精修增强,另行立项)
226+
227+
## 8. 决策记录
228+
229+
| 决策 | 结论 | 理由 |
230+
|---|---|---|
231+
| 形态粒度 | 章节级(非视频级)| 用户纠正:无 PPT 视频 + 一视频双部分 |
232+
| 质量门控 | 密度 × 质量双维 | 低质量不沉淀、不喂 AI(省 token)|
233+
| 行合并 | 几何+文本信号评分器 | 零 token、可单测;宁可少合并 |
234+
| 行级重识别 | 官方 TextRecognitionAdapter 编排自研 | rec-only API 不存在;adapter 公共 API 已源码验证 |
235+
| 跨帧增量 | 包含关系 + bbox 锚定 | 解决 PPT 动画逐行出现(现有去重失效场景)|
236+
| 平台适配 | 模板 JSON + 几何兜底三层 | 改版只改数据;能力降级不失效 |
237+
| 精修链路 | 结构引擎(A')作增强 | 模型重(129MB+231MB),不进实时链路 |
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# v0.14 子项目 C:知识体系架构设计规格(Obsidian 对齐 + 深度联动)
2+
3+
> 状态:✅ 已批准(2026-08-28,逐节确认)
4+
> 所属版本:v0.14
5+
> 范围:子项目 C——C1 组侧栏 Obsidian 式改造 / C2 多关系分层图谱 / C3 深度联动 v2
6+
7+
## 1. 背景与目标
8+
9+
### 1.1 痛点(用户反馈,2026-08-27~28)
10+
11+
| # | 痛点 | 现状根因 |
12+
|---|------|----------|
13+
| C1 | 分组分类方式有问题(确认:**展示混乱**)| `GroupSidebar` 240px 平铺无分区,行内堆叠 5 类信息(类别/feed/体系/路由/ⓘ),快速记录/收件箱/全部笔记/复习 5 种职责混排 |
14+
| C2 | 知识体系对齐 Obsidian(选定:图谱视图)| 现有画布为知识体系内部视图,无"笔记 ↔ 体系"关系图谱 |
15+
| C3 | 笔记挂体系后体系页不显示(**使用体验断裂**)| NoteLinkToSystem 只支持挂 node;体系页按 entityType 过滤,挂载实体与查看实体不一致时引用"消失" |
16+
17+
### 1.2 目标
18+
19+
1. 组侧栏 **Obsidian 式**:按 kind 分区 + 折叠记忆 + 过滤 + 拖拽归组 + 最近使用
20+
2. 图谱 **A' 多关系分层**:🔗 引用 / 🧬 溯源 / 📁 归属三类边可开关图层,局部聚焦,避免毛线球
21+
3. 深度联动 **v2 体验闭环**:挂接即见、跨页即时同步、反查聚合
22+
23+
## 2. 方案选型记录
24+
25+
### 2.1 组侧栏:Obsidian 式(已裁决)
26+
27+
| 变体 | 结论 |
28+
|---|---|
29+
| 纯分区(按 kind 分组展示)| 中间态——只解决"混排",未解决"找组慢" |
30+
| **分区 + 过滤 + 拖拽 + 最近使用** | ✅ 采纳——Obsidian 心智:文件树分区、折叠记忆、拖拽移动、最近文件 |
31+
32+
三条设计契约(v0.11 系列延续):**粒度对齐 DomainTag 拒绝大类聚合;组是学习单元;组结算防沼泽(禁止父子组)**——分区是展示层组织,不改变组模型。
33+
34+
### 2.2 图谱:A' 多关系分层(已裁决)
35+
36+
| 变体 | 结论 |
37+
|---|---|
38+
| A. Obsidian 同款全库图谱 | 毛线球风险——全库节点 + 单类型边必然乱 |
39+
| **A'. 多关系分层图谱** | ✅ 采纳——React Flow(已有依赖)实现,三类边分图层可开关,默认只开引用层 |
40+
| B. 体系内图谱 | 否决——覆盖不了"笔记 ↔ 体系"跨层关系 |
41+
42+
### 2.3 深度联动:v2 体验闭环(已裁决,用户澄清"不是性能卡,是使用体验")
43+
44+
初诊误判为性能问题(N 次全量拉取),用户澄清后确诊**体验断裂**:跨页操作不闭环、反馈不及时。修复目标=操作原地反馈 + 跨页即时同步 + 减少步骤。
45+
46+
## 3. 架构设计
47+
48+
### 3.1 C1 组侧栏(GroupSidebar 重构)
49+
50+
```
51+
GroupSidebar(重构)
52+
├── 最近使用区(最近 5 个访问组/笔记,点击直达)
53+
├── 收件箱 / 全部笔记 / 复习(保留,移出"组"概念区)
54+
├── 组分区(按 kind):
55+
│ ├── 课程(course)
56+
│ ├── 主题(topic)
57+
│ ├── 独立(standalone)
58+
│ └── feed(feed)
59+
├── 每个分区:折叠记忆(localStorage)+ 组行(色点/徽标收敛为 1-2 个)
60+
├── 组过滤(关键词过滤组名)
61+
└── 拖拽归组(拖笔记到组行 → move_note_to_group 命令)
62+
```
63+
64+
### 3.2 C2 多关系分层图谱
65+
66+
```
67+
知识图谱页(新/改造)
68+
├── React Flow 画布(已有 @xyflow/react ^12.11.3)
69+
├── 边图层开关:🔗 引用 / 🧬 溯源 / 📁 归属(默认仅引用)
70+
├── 局部聚焦:选中节点 → 1~2 度邻居展开,其余淡出
71+
├── 节点:笔记 / 概念 / 模型 / 组(按类型着色,用 B 子项目色板)
72+
└── 点击节点 → 跳转笔记页/体系页
73+
```
74+
75+
后端:`graph_snapshot()` 命令——聚合 note_links(引用)、session_artifacts(溯源)、note_groups(归属)三类边,单次拉取返回完整图谱数据。
76+
77+
### 3.3 C3 深度联动 v2
78+
79+
```
80+
笔记页(NoteLinkToSystem 增强)
81+
├── 挂接目标:node(问题)+ concept(概念)+ model(模型)三选一
82+
├── 挂接后可切换目标(不改实体,先改链接)
83+
└── 挂接成功原地反馈(不跳页)
84+
85+
体系页(KnowledgeLinkSection 增强)
86+
├── 反查:list_links_by_target(体系, 实体) —— 挂载实体与查看实体不一致时仍显示
87+
├── 聚合视图:该体系全部引用(按实体分组)
88+
└── 跨页同步:refreshToken 机制(挂接/删除后体系页即时刷新)
89+
```
90+
91+
## 4. 详细设计
92+
93+
### 4.1 C1 数据与交互
94+
95+
- **分区依据**:`NoteGroup.kind`(已有字段:course/topic/standalone/feed)
96+
- **折叠记忆**:localStorage `group-sidebar-folded:{kind}`(布尔)
97+
- **过滤**:纯函数 `filterGroups(groups, query)`(组名 contains,可单测)
98+
- **拖拽**:HTML5 DnD(组行为 drop target,笔记卡片为 drag source);复用 `move_note_to_group` 命令,失败 toast
99+
- **最近使用**:`recent_groups` 表或 localStorage(访问组时写入,上限 5,LRU)
100+
101+
### 4.2 C2 图谱数据契约
102+
103+
```ts
104+
interface GraphSnapshot {
105+
nodes: GraphNode[]; // { id, kind: note|concept|model|group, label, color }
106+
edges: GraphEdge[]; // { id, source, target, type: link|trace|belong }
107+
}
108+
// graph_snapshot() 返回;边类型三选一,前端按图层开关过滤
109+
```
110+
111+
- **局部聚焦纯函数**:`focusSubgraph(nodes, edges, centerId, degree=2)`(可单测)
112+
- **边图层过滤纯函数**:`filterEdges(edges, enabledLayers)`(可单测)
113+
114+
### 4.3 C3 命令与同步
115+
116+
- **新增命令**:`list_links_by_target(system_id, entity_id) -> Vec<KnowledgeLink>`(反查,现有 list_knowledge_links 是正查)
117+
- **增强命令**:`link_knowledge_target` 扩展 entity_type 参数(node/concept/model,兼容旧值)
118+
- **refreshToken**:挂接/删除命令成功后 `refresh_links_ts` 自增;体系页监听变化即刷新(轻量轮询或事件)
119+
120+
## 5. 错误处理
121+
122+
- 拖拽归组失败:toast 提示 + 组列表回滚(乐观更新回退)
123+
- graph_snapshot 超时/失败:图谱页显示空态 + 重试按钮(不阻塞其他功能)
124+
- 反查无结果:显示"无引用"空态(区别于加载失败)
125+
- 旧版本挂接数据(仅 node):自动兼容,UI 显示"问题"徽标
126+
127+
## 6. 测试计划
128+
129+
| 层 | 用例 |
130+
|---|---|
131+
| 纯函数 | `filterGroups` 关键词过滤;`focusSubgraph` 1/2 度邻居正确性;`filterEdges` 图层开关 |
132+
| 命令 | `graph_snapshot` 三类边聚合正确;`list_links_by_target` 反查命中/空;link_knowledge_target 三实体类型兼容 |
133+
| 组件 | 拖拽归组交互(happy path + 失败回滚);折叠记忆持久化;图谱图层切换 |
134+
| 联动 | 笔记挂 concept → 体系页即时可见(refreshToken 生效);切换目标后引用更新 |
135+
136+
## 7. 范围外
137+
138+
- Obsidian 双向链接语法 `[[...]]` 全量对齐(仅保留图谱视图对齐,用户裁决)
139+
- 图谱拖拽编辑(仅浏览/导航,编辑走体系页)
140+
- 组模型变更(父子组等——设计契约禁止)
141+
142+
## 8. 决策记录
143+
144+
| 决策 | 结论 | 理由 |
145+
|---|---|---|
146+
| 组侧栏 | 分区 + 过滤 + 拖拽 + 最近使用 | Obsidian 心智;纯分区不够 |
147+
| 图谱 | A' 多关系分层(三类边图层)| 避免毛线球;覆盖跨层关系 |
148+
| Obsidian 对齐范围 | 仅图谱视图 | 用户裁决(2026-08-28)|
149+
| 联动修复 | 体验闭环(反查 + 聚合 + refreshToken)| 用户澄清:非性能问题,是体验断裂 |
150+
| 图谱后端 | graph_snapshot() 单次聚合 | 避免 N 次全量拉取(初诊根因)|

0 commit comments

Comments
 (0)