323 lines
16 KiB
Markdown
323 lines
16 KiB
Markdown
# 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 文件夹更新/删除权限校验 | 暂未确认 | 代码中无显式所有权检查 |
|