ios-projects/docs/system-map/capabilities/04-知识库与知识点管理.md

323 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 04 知识库与知识点管理 — 跨项目完整能力分析
> 项目角色分类主链路参与者iOS、主 API、数据库、COS——知识库 CRUD 必须经过这些项目、上游支撑Python RAG Worker——异步处理导入资料不阻塞知识库管理操作、运维可观测Admin
> Rust Document Runtime 不参与知识库管理链路。Heavy Runtime 不参与此链路。
> 注意Python RAG Worker 在本能力中是上游支撑(知识库 CRUD 不依赖它);在"资料上传与处理"能力中是主链路参与者。
---
## 1. 能力目标
用户可以创建、组织、维护个人知识库,管理其中的知识点和来源资料,通过文件夹分类、排序、搜索、公开发现和订阅来高效组织和获取学习内容。
---
## 2. C 端入口
| 入口页面 | 触发方式 | 功能 |
|---------|---------|------|
| 知识库首页 | Tab "知识库" 默认 | 查看知识库列表、筛选、搜索入口、创建入口 |
| 知识库搜索页 | 搜索图标 | 搜索知识库和知识点 |
| 创建知识库页 | + 按钮 / 我的页学习资产 | 创建新知识库(封面、名称、描述) |
| 知识库详情页 | 点击知识库卡片 | 查看知识点列表/来源文件列表、管理操作 |
| 添加知识点页 | 操作菜单"添加" | 手动/文件模式添加知识点 |
| 知识点详情页 | 点击知识点条目 | 查看/收藏/笔记/原文 |
| 编辑知识点页 | 工具栏菜单 | 编辑标题和内容 |
| 文件夹管理 Sheet | 操作菜单"文件夹管理" | 创建/重命名/删除文件夹 |
| 导入资料页 | 操作菜单"上传" | 文件/相册/链接导入 |
| 导入候选审核页 | 导入完成后 | 审核 AI 提取的知识点候选 |
| 发现公开库页 | "我的"页"发现公开库" | 浏览/订阅公开知识库 |
---
## 3. 业务对象关系
```
知识库KnowledgeBase
├── 来源资料KnowledgeSource── 原始上传文件,含解析/索引/学习状态
├── 知识点KnowledgeItem── 知识库的基本内容单元
│ ├── 类型:章节(chapter)、课程(lesson)、概念(concept)、笔记(note)、导入文档(imported_doc)、AI生成(ai_generated)
│ ├── 层级:通过 parentId 形成树状结构
│ └── 关联:通过 sourceId 关联到来源资料
├── 文件夹KnowledgeFolder── 用于组织知识点
│ └── 同步创建 folder 类型的 KnowledgeItem保证 iOS 兼容)
├── 知识分块KnowledgeChunk── 来源资料的语义分块,含向量嵌入
├── 导入候选ImportCandidate── AI 提取的知识点候选,等待审核
├── 测验Quiz── 基于知识库内容生成的测验
├── 订阅关系KnowledgeBaseSubscription── 用户对公开知识库的订阅
└── AI 会话范围ChatScope── AI 对话可限定在知识库范围
```
---
## 4. 用户主流程
### 4.1 创建知识库
用户点击创建按钮 → 输入名称(必填)和描述(必填)→ 可选上传封面图(从相册选择,自动裁剪为 512×512→ 点击创建 → API 创建知识库记录(默认 private→ 用户可在列表中看到新知识库。每个用户最多创建 20 个知识库。
### 4.2 浏览与筛选
用户进入知识库首页 → 查看知识库卡片列表(封面、名称、描述、日期、置顶标记、公开标记)→ 可通过分类筛选(全部/我的/已订阅/官方)切换视图 → 滚动到底部自动加载更多(分页 20 条/页)→ 下拉刷新。
### 4.3 添加资料
用户进入知识库详情页 → 点击操作菜单"上传" → 选择文件/相册/链接导入 → 文件上传至 COS → API 创建 KnowledgeSource → 自动创建 DocumentImport 任务 → Python RAG Worker 异步处理 → 用户可查看 AI 处理状态 → 审核 AI 提取的候选知识点。
### 4.4 手动添加知识点
用户进入添加知识点页 → 选择"手动"模式 → 输入标题和内容文字 → 保存 → API 创建 KnowledgeItem。
### 4.5 编辑与删除知识点
用户在知识库详情页点击知识点 → 进入知识点详情页查看内容 → 工具栏菜单选择编辑 → 修改标题/内容 → 保存。滑动或长按可删除知识点(单个或批量)。
### 4.6 批量操作
用户进入批量选择模式 → 逐选或全选知识点 → 点击批量删除 → 确认弹窗 → API 批量软删除。
### 4.7 文件夹管理
用户打开文件夹管理 Sheet → 查看已有文件夹列表 → 新建(输入名称)→ 重命名(滑动操作)→ 删除(滑动操作)。创建文件夹时同步创建 folder 类型的 KnowledgeItem。注意重命名文件夹时仅更新 KnowledgeFolder 记录的 name 字段,不会同步更新对应 KnowledgeItem 的 title 字段。当前无文件夹数量上限。
### 4.8 排序
用户在知识库详情页点击排序菜单 → 选择排序方式(默认/文件大小/创建时间/更新时间)→ 知识点列表按所选方式重新排列。
### 4.9 搜索
用户点击搜索图标 → 进入搜索页 → 输入关键词。当前搜索逻辑未实现——搜索页仅展示空状态,输入关键词不触发 API 调用。
### 4.10 公开库发现与订阅
用户进入发现公开库页 → 查看所有公开知识库列表(含标题、描述、条目数)→ 点击订阅按钮 → API 创建订阅记录。用户可在知识库首页"已订阅"筛选中查看已订阅的知识库。用户不可订阅自己的知识库。取消订阅可随时操作。
### 4.11 删除知识库
用户在知识库详情页操作菜单点击"删除知识库"→ 确认弹窗 → API 软删除知识库(设置 deletedAt。删除后知识点和来源资料仍保留在数据库中软删除但不再对用户可见。
---
## 5. 项目职责
### iOS — 主链路参与者
- 知识库列表展示(卡片、筛选、分页、下拉刷新)
- 创建知识库(封面选择与裁剪、名称/描述输入)
- 知识库详情(双 Tab知识点 + 来源文件,排序,批量操作)
- 知识点详情(多格式渲染、收藏、笔记、原文)
- 添加/编辑知识点
- 文件夹管理 Sheet
- 搜索页(界面已搭建,逻辑未实现)
- 公开库发现与订阅
- 导入与候选审核
### 主 API — 主链路参与者
- 知识库 CRUD创建/列表/详情/更新/软删除)
- 知识库所有权校验(私有 KB 对非所有者返回 404
- 置顶切换
- 知识点 CRUD创建/列表/详情/更新/单个删除/批量删除)
- 知识点排序
- 公开库发现GET /knowledge-bases/discover含搜索参数
- 订阅管理(订阅/取消订阅/查看已订阅)
- 文件夹 CRUD创建/列表/更新/删除)
- 知识库数量限制(每用户最多 20 个)
- 内容安全检查KB 标题、标签)
### 数据库 — 主链路参与者
- 存储知识库、知识点、来源资料、文件夹、订阅、导入任务等核心业务数据
- 软删除支持deletedAt 字段)
- 唯一约束userId + knowledgeBaseId 订阅防重、userId + parentId + name 文件夹防重)
### COS — 主链路参与者
- 存储知识库封面图
- 存储知识点关联文件的内容(通过 COS URL 引用)
### Python RAG Worker — 上游支撑
- 不直接参与知识库 CRUD
- 异步处理导入资料,生成 KnowledgeChunk、ImportCandidate
- 用户在 RAG Worker 完成处理前即可查看和管理知识库及知识点
### Admin — 运维与可观测
- 知识库列表查看(全部 KB含所属用户、条目数
- 知识库详情抽屉(元数据 + 嵌套来源文件列表)
- 来源文件查看(全部来源,按 KB 和解析状态筛选)
- 来源文件引用追踪(查看哪些 AI 产物引用了该来源)
- 知识库删除
- 用户管理(查看/状态管理)
- 会员与配额管理
---
## 6. 权限与可见性
### 6.1 私有知识库
- **可见性:** 仅所有者可查看和操作。非所有者请求返回 404隐藏存在性
- **所有者操作:** 全部 CRUD + 置顶 + 可见性切换 + 删除。
- **非所有者操作:** 无任何操作权限。
### 6.2 公开知识库
- **可见性:** 任何人可通过发现页查看和搜索。所有者仍可正常管理。
- **所有者操作:** 同私有知识库。
- **非所有者操作:** 可查看详情、订阅。不可编辑或删除。
- **订阅:** 用户可订阅公开知识库。不可订阅自己的知识库。
### 6.3 官方知识库
- **当前状态:** API 和数据库模型支持 ownerType 字段,但 iOS 端"官方"筛选返回空数组TODO 注释:等后端支持)。
- **计划行为:** 由平台创建和维护的精选知识库,所有用户可查看和订阅。
### 6.4 删除权限
- **知识库删除:** 仅所有者可删除(软删除)。
- **知识点删除:** 所有者可单个或批量删除。
- **来源资料删除:** 服务层无所有权检查(代码缺陷),任何认证用户可通过 ID 删除任意来源。
- **文件夹删除:** 服务层无显式所有权检查(代码缺陷),但通过 KB 所有权间接保护。
### 6.5 资料访问权限
- **所有者:** 完整读写权限。可阅读原文件、使用 AI 对话(知识库范围)。
- **订阅者:** 可查看知识库内容。原文件阅读权限待确认(取决于 COS 文件访问控制)。
- **非所有者非订阅者:** 对私有 KB 无任何访问权限。对公开 KB 可查看详情和订阅。
---
## 7. 查询入口
### 用户查询
- **知识库列表:** iOS 知识库首页(卡片 + 筛选 + 分页)。
- **知识库详情:** iOS 知识库详情页(双 Tab + 排序)。
- **知识点详情:** iOS 知识点详情页(多格式渲染)。
- **搜索:** iOS 知识库搜索页(界面已搭建,逻辑未实现)。
- **公开库:** iOS 发现公开库页。
- **已订阅:** iOS 知识库首页"已订阅"筛选。
### Admin 查询
- **知识库列表:** Admin 知识库页(全部 KB含所属用户、条目数
- **知识库详情抽屉:** 元数据 + 嵌套来源文件列表 + 引用追踪。
- **来源文件列表:** Admin 来源文件页(按 KB 和解析状态筛选)。
- **引用追踪:** 查看特定来源被哪些 AI 产物(测验、摘要等)引用。
### 系统内部查询
- **RAG 对话上下文:** API 从 KnowledgeItem 表按知识库 ID 查询最多 30 条,构建对话上下文。
- **导入任务关联:** API 创建 KnowledgeSource 时自动关联 DocumentImport。
- **订阅关系:** API 在订阅和已订阅列表查询时使用。
---
## 8. 修改入口
### 用户修改
- **创建知识库:** iOS 创建知识库页 → POST /knowledge-bases。
- **更新知识库:** iOS 知识库设置 → PATCH /knowledge-bases/:id。
- **置顶/取消置顶:** iOS 知识库卡片操作 → POST /knowledge-bases/:id/pin。
- **创建知识点:** iOS 添加知识点页 → POST /knowledge-items。
- **编辑知识点:** iOS 编辑知识点页 → PATCH /knowledge-items/:id。
- **删除知识点:** iOS 知识库详情页(单个/批量) → DELETE /knowledge-items/:id 或 POST /knowledge-items/batch-delete。
- **文件夹操作:** iOS 文件夹管理 Sheet → POST/PATCH/DELETE /knowledge-bases/:id/folders。
- **订阅/取消订阅:** iOS 发现公开库页 → POST/DELETE /knowledge-bases/:id/subscribe。
- **删除知识库:** iOS 知识库详情页 → DELETE /knowledge-bases/:id。
### Admin 修改
- **删除知识库:** Admin 知识库页删除按钮(危险确认弹窗)。
- **删除文件:** Admin 文件管理页。
- **重试导入:** Admin 导入监控页。
### 系统自动修改
- **itemCount 维护:** 创建/删除知识点时自动更新知识库的 itemCount。
- **软删除传播:** 删除文件夹时自动软删除子文件夹和对应的 KnowledgeItem。
- **内容安全检查:** KB 标题和标签自动进行敏感词匹配。
---
## 9. 删除影响
### 9.1 删除知识库
- **影响范围:** 知识库本身被软删除(设置 deletedAt
- **知识点:** 保留在数据库中(不被级联删除),但用户不可见。
- **来源资料:** 保留但关联的 KB 不可访问。
- **订阅:** 保留但已删除 KB 不出现在已订阅列表中。
- **测验:** 保留但关联的 KB 不可访问。
- **AI 会话:** 保留但知识库范围对话可能无法加载上下文。
### 9.2 删除来源资料
- **影响范围:** 来源资料被软删除。
- **关联知识点:** 保留sourceId 变为悬空引用)。
- **关联分块:** KnowledgeChunk 保留Qdrant 向量需手动或通过软删除标记清理。
- **关联候选:** ImportCandidate 保留但关联的 sourceId 不可访问。
### 9.3 删除知识点
- **影响范围:** 知识点被软删除itemCount 递减。
- **子知识点:** 保留在数据库中parentId 变为悬空引用)。
- **关联笔记:** 知识点详情页的笔记入口不可用。
- **AI 对话上下文:** 已删除知识点不再出现在上下文加载结果中。
### 9.4 删除文件夹
- **影响范围:** 文件夹被软删除,对应的 folder 类型 KnowledgeItem 也被软删除。
- **子文件夹:** 级联软删除。
- **文件夹内知识点:** 保留在数据库中parentId 引用可能变为悬空)。
### 9.5 取消订阅
- **影响范围:** 订阅记录被删除。
- **已订阅列表:** 知识库从用户的已订阅筛选中消失。
- **其他数据:** 无影响。用户之前查看的知识库内容仍可查看(只要知识库保持公开)。
---
## 10. 当前完成状态
| 组件 | 状态 | 说明 |
|------|------|------|
| iOS 创建知识库 | 已完成 | 封面、名称、描述API 创建 |
| iOS 知识库列表与筛选 | 部分完成 | 全部/我的/已订阅可用;"官方"筛选返回空 |
| iOS 知识库详情(双 Tab | 已完成 | 知识点列表 + 来源文件列表 |
| iOS 手动添加知识点 | 已完成 | 标题 + 内容编辑 |
| iOS 文件模式添加知识点 | 已完成 | COS 上传 + 创建知识点 |
| iOS 知识点详情(多格式渲染) | 已完成 | 文本/Markdown/文件 |
| iOS 编辑知识点 | 已完成 | 标题 + 内容修改 |
| iOS 删除知识点(单个+批量) | 已完成 | 单个软删除 + 批量选择删除 |
| iOS 文件夹管理 | 已完成 | 创建/重命名/删除 |
| iOS 排序 | 已完成 | 4 种排序方式 |
| iOS 搜索 | 未完成 | 搜索页界面已搭建,搜索逻辑未实现 |
| iOS 公开库发现与订阅 | 已完成 | 查看/订阅/取消订阅 |
| iOS 删除知识库 | 已完成 | 确认弹窗 + API 软删除 |
| iOS 收藏知识点 | 部分完成 | UI 切换存在,后端 API 未支持TODO |
| iOS 重命名知识点 | 未完成 | 菜单项存在但 action 为空TODO |
| iOS 移动到文件夹 | 未完成 | 菜单项存在但 action 为空TODO |
| iOS 知识库管理页 | 未完成 | 操作菜单"知识库管理"按钮 action 为空TODO |
| API 知识库 CRUD | 已完成 | 创建/列表/详情/更新/软删除 |
| API 知识库所有权校验 | 已完成 | 私有 KB 对非所有者返回 404 |
| API 知识库数量限制 | 已完成 | 每用户最多 20 个 |
| API 置顶切换 | 已完成 | |
| API 公开库发现与搜索 | 已完成 | 支持标题+描述搜索 |
| API 订阅管理 | 已完成 | 订阅/取消订阅/已订阅列表 |
| API 知识点 CRUD | 已完成 | 创建/列表/详情/更新/单个删除/批量删除 |
| API 知识点排序 | 已完成 | createdAt/updatedAt/fileSize/orderIndex |
| API 文件夹 CRUD | 已完成 | 含 folder 类型 KnowledgeItem 同步;当前无文件夹数量限制 |
| API 内容安全检查 | 已完成 | KB 标题 + 标签 + 候选内容 |
| Admin 知识库查看 | 已完成 | 列表 + 详情抽屉 |
| Admin 来源文件查看 | 已完成 | 按 KB 和解析状态筛选 |
| Admin 来源文件引用追踪 | 已完成 | 查看 AI 产物引用了哪些来源 |
| Admin 知识库删除 | 已完成 | |
| 官方知识库 | 未完成 | API 模型支持但后端筛选未实现 |
| API 来源资料删除权限校验 | 暂未确认 | 代码中无所有权检查(疑似缺陷) |
| API 文件夹更新/删除权限校验 | 暂未确认 | 代码中无显式所有权检查 |