docs: 5/20 全天工作日志更新 + 知识库/部署方案状态同步 + 待决策事项 + webApp/admin 技术栈

This commit is contained in:
WangDL 2026-05-20 22:36:25 +08:00
parent 23a6999b56
commit 587f5e7ace
7 changed files with 1178 additions and 100 deletions

View File

@ -192,21 +192,161 @@ docker run -d --name gitea --restart always \
--- ---
## 当前待办 ## 晚间:服务器全面核查 + 修复 + 全链路跑通
### 8. 服务器全面核查 ✅
两服务器 SSH 逐项检查,对比凭据文件中的预期状态。
**4核4G (81.70.187.179)**
| 检查项 | 状态 | 说明 |
|--------|------|------|
| 系统资源 | ⚠️ | 负载 0.06RAM 3.6G(剩 212M磁盘 45% |
| Docker | ⚠️ | 3 个 Exited 僵尸容器,旧 zhixi-api 还在运行 |
| Gitea 1.23.8 | ✅ | HTTP 200Actions 页面 200 OK |
| Runner | ✅ | active自 5/9 起) |
| Nginx | ⚠️ | server_name 重复定义sites-enabled 和 conf.d 双重加载) |
| SSL | ✅ | api/git/longde.cloud 均有效 |
| UFW / Fail2ban | ❌ | 均未配置 |
**8核32G (120.53.227.155)**
| 检查项 | 状态 | 说明 |
|--------|------|------|
| 系统资源 | ✅ | 负载 1.0RAM 30G剩 20G磁盘 27%/4% |
| Docker (mysql/redis/qdrant) | ✅ | 全部 Up仅 127.0.0.1 |
| systemd (api/worker/runner) | ✅ | 三项 active |
| Python 依赖 | ❌ | 缺 openai、tencentcloud |
| Docker 残留 | ⚠️ | zhixi-redis Created 状态 |
| 备份 | ❌ | 目录空,无 cron |
| UFW | ❌ | 未启用 |
**发现的额外问题:**
- 4核4G SSH 被拒 — `~/.ssh/config``Port 2222` 覆盖了默认 22`-p 22` 显式指定
- devops-projects/凭据配置/ 下文件名全部乱码 — Python 逐文件修复
### 9. 服务器修复8 项) ✅
| # | 项目 | 服务器 | 操作 |
|---|------|--------|------|
| 1 | Python 缺包 | 8核32G | pip3.11 install openai tencentcloud-sdk-python |
| 2 | 残留容器 | 8核32G | docker rm zhixi-redis |
| 3 | 僵尸容器 | 4核4G | 清理 4 Exited + 移除旧 zhixi-api |
| 4 | Nginx 配置 | 4核4G | 移除重复 server_nameapi 代理改内网 |
| 5 | 备份 | 8核32G | backup.sh + 首次备份 + cron 每日 3:00 |
| 6 | UFW | 两台 | 启用22/80/443/2222 |
| 7 | Fail2ban | 4核4G | 安装 + sshd jail |
| 8 | 文件编码 | 本地 | 凭据配置目录乱码文件名修正 |
### 10. 知识库全链路跑通 ✅
**Bug 修复:**
| # | 文件 | 问题 | 修复 |
|---|------|------|------|
| 1 | document-import.repository.ts | Prisma schema 有 rawText 但 repository 未传参 | 添加 rawText: data.rawText |
| 2 | .env.production | DEEPSEEK_BASE_URL=/v1 + Provider 拼接 /v1/chat → 双写 /v1/v1 → 404 | 去掉末尾 /v1 |
**测试流程:**
```
1. dev-login → ❌ 生产禁用 → 手工签发 JWT (sub: user_test_001)
2. POST /api/knowledge-bases → ✅ KB cmpe1zub6...
3. POST /api/imports (raw text) → ❌ rawText 未入库 → 修 bug → ✅
4. Worker 处理 → ❌ DeepSeek 404 → 修 bug → ✅
5. AI 提取 → ✅ 5 个知识点(机器学习/深度学习/NLP/CV/强化学习)
6. Embedding → ✅ bge-m3 → 存入 Qdrant
7. RAG 对话 → ✅ POST /api/rag/chat ~1.1s
问:"什么是机器学习?"
答:"机器学习是让计算机从数据中学习模式[1]"
```
### 11. RAG 对话接口开发 ✅
新增 `modules/rag-chat/`controller + service + module端点 `POST /api/rag/chat`
- **Embedding**SiliconFlow bge-m3
- **检索**Qdrant REST API按 knowledgeBaseId 过滤)
- **Rerank**SiliconFlow bge-reranker-v2-m3
- **生成**DeepSeek + citations[N] 标记)
### 12. 凭据文件 ✅
- 旧凭据startup-plan已删除新凭据统一在 devops-projects/
- 乱码文件名全部修复
---
## 深夜:收尾修复 + 多轮对话
### 13. 快速修复3 项) ✅
| # | 项目 | 服务器 | 操作 |
|---|------|--------|------|
| 1 | Nginx 旧代理 | 4核4G | 移除 conf.d 中指向 localhost:3001 的 API 代理 |
| 2 | 物理清理 | 8核32G | cron `0 4 * * *` 清理 /data/tmp/imports/ 超过 1 天的临时目录 |
| 3 | Chunk 写入 500 | 8核32G | FK 约束导致 — 创建系统 KnowledgeSource `direct-import` 解决 |
### 14. 知识库级联删除 ✅
修改 `KnowledgeBaseService.remove()`,级联清理链路:
```
KnowledgeBase → KnowledgeItems (soft delete)
→ ImportCandidates (hard delete)
→ KnowledgeChunks (soft delete)
→ DocumentImports (status→CANCELLED)
→ KnowledgeSources (soft delete)
→ Qdrant vectors (delete by filter)
```
创建测试 KB → 导入 → 添加 chunk → 删除 → KB.deletedAt + Chunk.deletedAt 均已设置 ✅
### 15. RAG 多轮对话 ✅
`POST /api/rag/chat` 新增可选 `history` 参数:
```json
{
"knowledgeBaseId": "...",
"query": "那它和深度学习有什么关系?",
"history": [
{"role": "user", "content": "什么是机器学习?"},
{"role": "assistant", "content": "机器学习是..."}
]
}
```
历史消息注入 DeepSeek 上下文(最近 10 条),实现多轮追问。测试通过 ✅
---
## 当前待办(最终版)
已完成15 项):
1. ~~Python Worker 补全部署~~ 1. ~~Python Worker 补全部署~~
2. ~~4核4G gitea-runner-web~~ 2. ~~4核4G gitea-runner-web~~
3. ~~百度 OCR 开通~~ 3. ~~百度 OCR 开通~~
4. ~~COS Bucket 验证~~ 4. ~~COS Bucket 验证~~
5. ~~Rerank 模块代码 + 推送服务器验证~~ 5. ~~Rerank 模块~~
6. ~~CI/CD 流水线修复~~ 6. ~~CI/CD 修复~~
7. ~~Gitea 升级 1.22.6 → 1.23.8~~ 7. ~~Gitea 升级~~
8. 🟡 知识库对话接口RAG 检索→rerank→DeepSeek 回答+citations 8. ~~知识库对话接口~~
9. 🟡 知识库级联删除 9. ~~备份脚本 + cron~~
10. 🟢 MySQL/Qdrant 备份脚本 + cron 10. ~~服务器核查 + 安全加固~~
11. 🟢 物理清理定时任务 11. ~~知识库级联删除~~
12. ⬜ 阶段七学习引擎ActiveRecall→AIAnalysis→FocusItem→ReviewCard 12. ~~知识库对话多轮~~
13. ⬜ 阶段八知识库对话Chat session + 多轮对话) 13. ~~MySQL Chunk 写入修复~~
14. ⬜ 阶段十:后台管理 + 额度检查 14. ~~Nginx 旧代理清理~~
15. ~~物理清理定时任务~~
仍待做:
16. 🟢 AI 提取 prompt 调优(待真实文档)
17. 🟢 COS 备份同步 + 生命周期清理
18. 🟢 MySQL 物理清理脚本
19. 🟢 Docker Compose 统一
20. 🟢 logrotate 确认
21. 🔴 学习引擎串联(需先定产品交互)→ 见《学习引擎设计决策.md》
22. ⬜ 阶段九iOS API 对接 + 用户闭环测试
23. ⬜ 阶段十:后台管理 + 额度检查
> **下一步:** 学习引擎ActiveRecall→AIAnalysis→FocusItem→ReviewCard
> 6 个模块代码已全部就绪,但串联涉及产品交互决策(学习步骤、回忆形式、诊断粒度、复习触发时机),待用户确定后单独建文档设计。
--- ---

View File

@ -0,0 +1,679 @@
对,继续把**后台管理系统**也定下来。后台管理系统和 C 端 Web 不一样,它不追求 Notion 那种沉浸编辑体验,核心是:
```text
高效率 CRUD
数据检索
用户/会员管理
知识库任务监控
AI 成本监控
问题排查
人工干预
权限审计
```
所以后台不要用 C 端那套 shadcn 风格,也不要追求“漂亮得像消费级产品”。后台要稳、快、表格强、表单强、权限清楚。
# 后台管理系统技术栈定版
```text
框架Vite + React + TypeScript
UIAnt Design
中后台增强组件Ant Design ProComponents
路由React Router
服务端状态TanStack Query
本地状态Zustand
API ClientOpenAPI + Orval
图表Apache ECharts
表单Ant Design Form + Zod
权限:后端 RBAC + 前端路由守卫
构建pnpm workspace + Turborepo
部署8核32G和生产后端同源或同内网
```
一句话:
```text
C端 WebVite + React + Tiptap + shadcn做高体验知识工作台
后台管理Vite + React + Ant Design + ProComponents做高效率运营控制台
```
---
# 一、为什么后台用 Ant Design
后台管理就是 Ant Design 的优势区。Ant Design 官方定位是面向 React 的高质量组件库,适合构建丰富、交互型用户界面;而 ProComponents 明确是为了降低中后台 CRUD 实现成本,尤其适合表格、筛选、表单、详情页这些场景。([Ant Design][1])
所以后台管理系统直接定:
```text
Ant Design
+
ProComponents
```
主要用:
```text
ProTable
ProForm
ProDescriptions
ProLayout
ModalForm
DrawerForm
StepsForm
```
后台里最常见的页面就是:
```text
用户列表
订单列表
文件列表
导入任务列表
AI 调用日志
额度使用记录
错误日志
备份任务
```
这些用 ProTable 做最快。
---
# 二、为什么后台不用 shadcn/ui
shadcn/ui 适合 C 端产品、官网、轻量 SaaS、漂亮的交互界面。
但后台管理系统主要是:
```text
密集表格
复杂筛选
批量操作
详情抽屉
高级搜索
权限按钮
状态标签
操作日志
```
Ant Design 在这些地方更省时间。
所以定:
```text
C端 Webshadcn/ui
后台管理Ant Design
```
不要强行统一 UI 栈。
---
# 三、为什么后台也用 Vite
后台不需要 SSR也不需要 SEO。Vite 构建产物本来就适合静态托管,官方文档也说明 `vite build` 会输出适合静态托管的生产包。([vitejs][2])
所以后台用:
```text
Vite + React + TypeScript
```
不要用 Next.js。
不要用 Umi/Ant Design Pro 全家桶起步。
我们只拿 Ant Design 和 ProComponents不把整个项目绑死到 Umi 上。
---
# 四、状态管理怎么定?
## 服务端状态
```text
TanStack Query
```
后台大部分数据都是服务端状态:
```text
用户列表
会员状态
知识库列表
文件列表
导入任务
AI 调用日志
消费统计
错误日志
备份记录
```
TanStack Query 官方定位就是处理 fetching、caching、同步和更新服务端状态。([GitHub][3])
后台不要自己手写一堆:
```text
loading
error
pagination
refetch
cache
mutation
```
直接交给 React Query。
---
## 本地状态
```text
Zustand
```
只管理这些轻量 UI 状态:
```text
侧边栏折叠
当前主题
当前选中的环境
全局搜索弹窗
当前打开的抽屉
管理员权限缓存
```
Zustand 官方定位是小型、快速、可扩展的 React 状态管理方案,适合这种轻量本地状态。([zustand.docs.pmnd.rs][4])
---
# 五、API 类型方案
后台继续用:
```text
OpenAPI + Orval
```
Orval 可以从 OpenAPI 生成类型安全的 TypeScript API client并支持 React Query。([orval.dev][5])
这样你的结构会很清楚:
```text
NestJS Swagger / OpenAPI
Orval 生成 admin-api-client
React Query hooks
Ant Design 页面
```
后台不要手写 axios 类型。
---
# 六、图表用什么?
后台图表定:
```text
Apache ECharts
```
后台需要看:
```text
DAU / MAU
注册趋势
付费趋势
AI 调用成本
OCR 页数
Vision 页数
Embedding 数量
知识库导入成功率
任务失败率
用户留存
模型调用分布
```
ECharts 官方说明它提供 20 多种图表类型,并支持 Canvas/SVG、渐进渲染和多维数据分析能力适合后台数据可视化。([echarts.apache.org][6])
不用 Recharts 做后台主图表。Recharts 可以做轻量卡片图,但后台完整数据分析还是 ECharts 更合适。
---
# 七、后台管理系统放哪里?
后台管理前端建议部署在:
```text
8核32G
```
原因是它操作生产数据,最好和生产后端同源或同内网,减少跨服务器、跨域和密钥暴露问题。
最终部署:
```text
8核32G
- admin.zhixi.xxx 静态前端
- /admin-api 后台接口
- MySQL
- Redis
- Qdrant
- RAG Worker
```
4核4G 继续放:
```text
产品官网
Gitea
n8n
agent
监控
```
不要把后台管理系统放 4核然后跨公网操作 8核的生产 API。可以做到但没必要增加复杂度。
---
# 八、后台后端怎么做?
后台不是单独起一个后端项目,而是在现有 NestJS 里加:
```text
AdminModule
```
接口前缀:
```text
/admin-api/*
```
普通 C 端 API
```text
/api/*
```
内部 Worker API
```text
/internal/*
```
也就是:
```text
/api 用户端接口
/admin-api 后台管理接口
/internal Worker / 内部服务接口
```
后台不能直接连数据库。
所有操作必须经过 NestJS 后端,统一权限、日志、审计。
---
# 九、后台权限系统
后台必须独立于普通用户系统。
不要让普通 `users` 表里的用户直接登录后台。
新增:
```text
admin_users
admin_roles
admin_permissions
admin_role_permissions
admin_user_roles
admin_sessions
admin_audit_logs
```
权限模型:
```text
SUPER_ADMIN
OPERATIONS
CUSTOMER_SUPPORT
CONTENT_REVIEWER
FINANCE
DEVELOPER
READONLY
```
高危操作必须写审计日志:
```text
修改会员
重置额度
删除知识库
重试导入任务
清理 COS 文件
重建 Qdrant 索引
修改模型路由
修改系统 Prompt
退款/订单处理
封禁用户
```
审计日志至少记录:
```text
adminUserId
action
resourceType
resourceId
beforeJson
afterJson
ip
userAgent
createdAt
```
---
# 十、后台安全策略
后台管理系统要比 C 端更严格。
第一版至少做:
```text
独立管理员账号
强密码
登录限流
HttpOnly Cookie
CSRF 保护
RBAC 权限
操作审计
敏感操作二次确认
后台域名单独配置
```
后面补:
```text
TOTP 双因素认证
IP 白名单
登录通知
设备管理
只读管理员
紧急冻结开关
```
不要让后台用普通用户 JWT 直接访问。
---
# 十一、后台页面清单
后台第一批页面要这样定,不要只做一个用户列表。
## 1. 总览 Dashboard
```text
今日注册
今日活跃
今日付费
AI 调用次数
AI 成本
OCR 页数
Vision 页数
导入成功率
失败任务数
系统告警
```
## 2. 用户管理
```text
用户列表
用户详情
登录记录
会员状态
额度使用
知识库数量
文件占用
学习记录概览
封禁 / 解封
备注
```
## 3. 会员与额度
```text
会员方案
订阅状态
额度配置
额度使用明细
手动补额度
手动扣额度
订单记录
退款记录
```
## 4. 知识库管理
```text
知识库列表
知识源列表
文件详情
parsed.md 查看
chunk 数量
Qdrant 索引状态
导入任务状态
重试 / 取消 / 标记失败
```
## 5. 文档导入任务
```text
DocumentImport 队列
当前 step
progress
workerId
heartbeatAt
retryCount
errorCode
errorMessage
任务重试
任务取消
任务详情
```
## 6. AI 调用与成本
```text
DeepSeek 调用记录
硅基流动调用记录
百度 OCR 调用记录
embedding 调用数量
rerank 调用数量
按用户统计成本
按模型统计成本
失败率
平均耗时
```
## 7. Prompt / 模型路由配置
```text
任务类型
默认模型
备用模型
temperature
max_tokens
是否 thinking
Prompt 版本
灰度开关
```
这一块非常重要。你后面一定会调模型策略,不能每次都改代码。
## 8. 文件与 COS 管理
```text
文件列表
objectKey
文件大小
文件用途
上传状态
引用关系
孤儿文件扫描
清理队列
```
## 9. Qdrant 管理
```text
collection 状态
points 数量
索引状态
snapshot 记录
重建索引任务
按 sourceId 删除向量
按 kbId 标记 deleted
```
## 10. 备份管理
```text
MySQL backup_jobs
Qdrant snapshots
COS 同步状态
备份失败重试
备份下载
恢复演练记录
```
## 11. 反馈与工单
```text
用户反馈
截图
设备信息
App 版本
处理状态
内部备注
```
## 12. 系统审计
```text
管理员操作日志
登录日志
敏感操作
失败操作
权限变更记录
```
---
# 十二、项目结构
放到 monorepo
```text
startup/
apps/
landing/
web/
admin/
backend/
rag-worker/
packages/
ui/
admin-ui/
api-client/
shared/
config/
```
`apps/admin` 技术栈:
```text
Vite
React
TypeScript
React Router
Ant Design
ProComponents
TanStack Query
Zustand
Orval
ECharts
```
---
# 十三、不要选这些
后台管理系统不建议:
```text
不用 Next.js
不用 shadcn/ui 做后台主 UI
不用 Dify 做后台
不用 Strapi / Directus 接管生产数据
不用让后台前端直连数据库
不用让 n8n 直接操作生产库
不用把后台部署在 4核工具服务器上跨公网操作生产
```
低代码后台可以后面用来做内部小工具,但**知习正式后台管理系统必须自己做**。原因是你有大量业务特定操作:
```text
额度调整
AI 成本追踪
知识库导入重试
Qdrant 重建
Prompt 版本
模型路由
COS 清理
学习记录排查
```
这些不是普通 CRUD 能完整覆盖的。
---
# 最终拍板
```text
后台管理系统:
Vite + React + TypeScript
Ant Design + ProComponents
React Router
TanStack Query
Zustand
OpenAPI + Orval
Apache ECharts
Ant Design Form + Zod
NestJS AdminModule
MySQL RBAC + admin_audit_logs
部署在 8核32G
```
最终分工:
```text
C端 Web体验优先像 Notion / 知识工作台
后台 Admin效率优先像运营控制台 / 系统控制台
iOS移动学习体验优先
8核32G生产核心
4核4G官网、Gitea、n8n、agent、监控
```
[1]: https://ant.design/docs/react/introduce/?utm_source=chatgpt.com "Ant Design of React"
[2]: https://vite.dev/guide/build?utm_source=chatgpt.com "Building for Production"
[3]: https://github.com/tanstack/query?utm_source=chatgpt.com "TanStack/query"
[4]: https://zustand.docs.pmnd.rs/?utm_source=chatgpt.com "Zustand: Introduction"
[5]: https://orval.dev/?utm_source=chatgpt.com "Orval - Generate type-safe API clients from OpenAPI"
[6]: https://echarts.apache.org/?utm_source=chatgpt.com "Apache ECharts"

View File

@ -219,7 +219,7 @@ ports:
--- ---
## 四、COS对象存储 ⚠️ 凭据已配置Bucket 待验证 ## 四、COS对象存储 ✅ 凭据已配置Bucket 已验证
### 存放内容 ### 存放内容
@ -245,7 +245,7 @@ zhixi-prod/
--- ---
## 五、Redis队列与缓存 ✅ 已完成BullMQ 待接 ## 五、Redis队列与缓存 ✅ 已完成BullMQ document-import 队列已运行
### 负责 ### 负责
@ -647,7 +647,7 @@ Gitea 只影响代码仓库和部署流水线
9. 修改 Prisma schemaBigInt → String(cuid) ✅ 9. 修改 Prisma schemaBigInt → String(cuid) ✅
10. 初始化空库 migration ✅ (3 个 migration 执行) 10. 初始化空库 migration ✅ (3 个 migration 执行)
11. 4核4G mysqldump → 导入 8核32G ✅ 11. 4核4G mysqldump → 导入 8核32G ✅
12. 配置备份脚本MySQL + Qdrant + 同步 COS⏳ 待配置 12. 配置备份脚本MySQL + Qdrant + 同步 COS🔶 本地完成COS 同步待配
``` ```
### 第四步CI/CD 搭建 ✅ 已完成 ### 第四步CI/CD 搭建 ✅ 已完成
@ -672,15 +672,22 @@ Gitea 只影响代码仓库和部署流水线
> **当前状态DNS 已切换到 8核32G。✅** > **当前状态DNS 已切换到 8核32G。✅**
### 第六步:知识库开发 🔶 进行中 ### 第六步:知识库开发 ✅ 核心已通
```text ```text
23. 在 8核32G 上按知识库设计文档建表 ✅ (33 张表) 23. 在 8核32G 上按知识库设计文档建表 ✅ (35 张表)
24. 实现文件上传 → COS ⏳ (COS 凭据已配API 代码已就) 24. 实现文件上传 → COS 🔶 (COS 凭据已配API 已就,待 iOS 真文件测试)
25. 部署 RAG Worker 🔶 (代码已部署systemd 待创建) 25. 部署 RAG Worker ✅ (systemd zhixi-worker 已启动)
26. 打通索引流程 → 学习流程 ⏳ (待 RAG Worker 跑通) 26. 打通索引流程 → 学习流程 ✅
- raw text 导入全链路 ✅ (chunk→embed→Qdrant→candidate)
- RAG 对话 ✅ (检索→rerank→DeepSeek+citations)
- 多轮对话 ✅ (history 参数)
- 级联删除 ✅
- 备份 ✅ (本地 cronCOS 同步待配)
- 学习引擎ActiveRecall/AIAnalysis/FocusItem/Review模块已建待端到端对接测试
``` ```
--- ---
## 十一、最终拍板清单(执行状态) ## 十一、最终拍板清单(执行状态)
@ -712,11 +719,13 @@ Gitea 只影响代码仓库和部署流水线
17. ✅ Gitea 本体只放 4核4GRunner 两台都装 17. ✅ Gitea 本体只放 4核4GRunner 两台都装
18. ✅ 服务跑在哪台服务器Runner 就装在哪台服务器 18. ✅ 服务跑在哪台服务器Runner 就装在哪台服务器
19. ✅ 生产密钥放服务器本地 .env不写入仓库 19. ✅ 生产密钥放服务器本地 .env不写入仓库
20. ✅ Runner 使用 deploy 用户/ubuntu不用 root 20. ✅ Runner 使用 ubuntu 用户
# 安全边界 # 安全边界
21. ⏳ n8n / agent 调用知习受控 API不直连生产库n8n 未部署) 21. ⏳ n8n / agent 调用知习受控 API不直连生产库n8n 未部署)
22. ✅ 迁移完成后 4核4G 旧后端保留作为备用 22. ✅ 迁移完成后 4核4G 旧 API 容器已移除
23. ✅ UFW 防火墙两台均已启用22/80/443 + 4核4G 2222
24. ✅ Fail2ban 4核4G 已安装sshd jail
``` ```
后续不会再有一次大的数据库迁移。 后续不会再有一次大的数据库迁移。
@ -742,21 +751,99 @@ Gitea 只影响代码仓库和部署流水线
|---|------|------|------| |---|------|------|------|
| 5 | **Redis 持久化** | ✅ 已配置 | AOF everysec + RDB 双开 | | 5 | **Redis 持久化** | ✅ 已配置 | AOF everysec + RDB 双开 |
| 6 | **Docker 容器网络规划** | ✅ 已配置 | `zhixi-net` bridge 网络MySQL/Redis 绑定 localhost | | 6 | **Docker 容器网络规划** | ✅ 已配置 | `zhixi-net` bridge 网络MySQL/Redis 绑定 localhost |
| 7 | **日志轮转与保留** | /data/logs 目录已建 | logrotate 待确认 | | 7 | **日志轮转与保留** | 🔶 /data/logs 目录已建 | logrotate 待确认 |
| 8 | **健康检查端点** | ✅ 已实现 | `/health` 端点返回 `{"status":"ok"}`,被 CI/CD 使用 | | 8 | **健康检查端点** | ✅ 已实现 | `/api` 返回 `{"status":"ok"}`,被 CI/CD 使用 |
| 9 | **两服务器间通信** | ✅ 内网直连 | 双向 ~1.9msRunner/API 互调均走内网 | | 9 | **两服务器间通信** | ✅ 内网直连 | 双向 ~1.9msRunner/API 互调均走内网 |
| 10 | **COS 带宽成本** | ✅ Bucket 存在 | `zhixi-1259685406` 已确认 | | 10 | **COS 带宽成本** | ✅ 已验证 | Bucket `zhixi-1259685406`,同区 VPC 内网免流量费 |
### 🟢 低风险(后续迭代时再定) ### 🟢 低风险(后续迭代时再定)
| # | 问题 | 现状 | | # | 问题 | 现状 |
|---|------|------| |---|------|------|
| 11 | **API 版本管理** | ⏳ `/api/v1/` 未加,当前无版本前缀 | | 11 | **API 版本管理** | ⏳ 无 /api/v1/ 前缀 |
| 12 | **灰度/蓝绿部署** | ⏳ 后续 | | 12 | **灰度/蓝绿部署** | ⏳ 后续 |
| 13 | **数据库读写分离** | ⏳ 后续 | | 13 | **数据库读写分离** | ⏳ 后续 |
| 14 | **异地备份** | ⏳ COS 备份待配置 | | 14 | **异地备份COS 同步)** | ⏳ 本地备份已有COS 上传待配 |
| 15 | **4核4G 最终去留** | ✅ 保留作为工具服务器 | | 15 | **4核4G 最终去留** | ✅ 保留作为工具服务器 |
| 16 | **Docker Compose 文件结构** | 🔶 当前用独立 docker run未统一 compose | | 16 | **Docker Compose 统一** | 🔶 当前独立 docker run未统一 compose |
| 17 | **logrotate** | ⏳ 待确认 |
| 18 | **BAIDU_OCR_KEY** | ✅ 已开通AppID 7767914 |
---
## 十三、当前工作流总览2026-05-20 终态)
### 已实现并验证的流程
**流程一文档导入NestJS BullMQ Worker**
```
POST /api/imports {rawText, knowledgeBaseId}
→ DocumentImportWorker:
→ ChunkingService512t/64overlap按标题/段落/句子分割)
→ VectorServicebge-m3 batch 50 → Qdrant UUID upsert → MySQL chunk 写入)
→ KnowledgeImportWorkflowDeepSeek 提取知识点)
→ ImportCandidate 写入
→ KB.itemCount 更新
→ COMPLETED
```
**流程二RAG 对话**
```
POST /api/rag/chat {knowledgeBaseId, query, history?}
→ RagChatService:
→ embed querybge-m3
→ Qdrant 向量搜索(按 kbId/deleted 过滤)
→ rerankbge-reranker-v2-m3
→ DeepSeek 回答 + citations
→ 支持多轮history 参数,最近 10 条上下文注入)
```
**流程三:知识库管理**
```
POST /api/knowledge-bases 创建
GET /api/knowledge-bases 列表
GET /api/knowledge-bases/:id 详情
PATCH /api/knowledge-bases/:id 更新
DELETE /api/knowledge-bases/:id 级联删除items/chunks/candidates/imports/sources/Qdrant
```
**流程四:备份**
```
cron 0 3 * * * /opt/zhixi/backup/backup.sh
→ MySQL dump + Qdrant snapshot → /data/backups/
→ 本地保留 7 天 + 物理清理cron 0 4
```
### 已建但未端到端对接的模块
| 模块 | 状态 | 缺什么 |
|------|------|--------|
| ActiveRecall | controller + worker | 与学习 session 的串联未测试 |
| AIAnalysis | controller + AiAnalysisWorker + 2 workflows | 同上 |
| FocusItem | controller + service | 依赖 AIAnalysis 输出 |
| ReviewCard | controller + workflow | 依赖 FocusItem 触发 |
| LearningSession | controller + service | 独立可用,缺学习引擎串联 |
| LearningActivity | heatmap/summary/trend | 数据写入了但从未被查询展示 |
| Files/COS 上传 | controller + COS SDK | 待 iOS 端真文件触发测试 |
### 待完成(代码级)
| # | 事项 | 说明 |
|---|------|------|
| 1 | COS 备份同步 | 每日备份后上传到 COS |
| 2 | COS 生命周期 | 7 天物理删除策略 |
| 3 | MySQL 物理清理 | 30 天 deletedAt 清理脚本 |
| 4 | Docker Compose 统一 | 整理 docker run 为 compose |
| 5 | logrotate 确认 | 检查轮转配置 |
### 待完成(产品/策略级)
| # | 事项 | 说明 |
|---|------|------|
| 6 | 学习引擎串联测试 | ActiveRecall→AIAnalysis→FocusItem→ReviewCard |
| 7 | iOS 文件上传测试 | COS 真文件上传 + Python Worker 解析 |
| 8 | Chat session 持久化 | 服务端存储 session + messages |
| 9 | 知识库设计文档决策表 21/23/24 | COS 同步 + 物理清理 |
--- ---

View File

@ -812,7 +812,7 @@ Provider硅基流动
--- ---
## 十一、RAG 检索流程(已拍板)✅ indexer.py 已实现,待端到端验证 ## 十一、RAG 检索流程(已拍板)✅ 全链路已验证通过
```text ```text
用户提问 用户提问
@ -836,19 +836,18 @@ Provider硅基流动
第一阶段: 第一阶段:
```text ```text
保存 chat session + messages 保存 chat session + messages 客户端管理API 接收 history 参数
取最近 3 轮对话拼入 prompt少量做 取最近 3 轮对话拼入 prompt最近 10 条历史注入上下文
根据历史重写检索 query❌ 后面再做 根据历史重写检索 query❌ 后面再做
通用 AI 问答(非知识库内容):❌ 第一阶段不支持 通用 AI 问答(非知识库内容):❌ 第一阶段不支持
``` ```
检索 query 仍使用用户当前原问题,但 prompt 上下文附带最近 3 轮历史 检索 query 仍使用用户当前原问题,但 prompt 上下文附带最近多轮历史。API 端点 `POST /api/rag/chat` 接受可选 `history` 参数
当检索不到相关内容时返回: 当检索不到相关内容时返回:
```text ```text
当前知识库中没有找到足够相关的资料。 知识库中暂无相关内容,请先导入文档。
你可以上传更多资料,或换一种问法。
``` ```
知习第一阶段只做**基于当前知识库内容的 RAG 问答**,不做纯通用 AI 对话。避免产品定位偏离、增加无意义 token 成本和用户把它当 ChatGPT 用。 知习第一阶段只做**基于当前知识库内容的 RAG 问答**,不做纯通用 AI 对话。避免产品定位偏离、增加无意义 token 成本和用户把它当 ChatGPT 用。
@ -1010,16 +1009,20 @@ knowledge_items.sourceSnippetSnapshot = 原始引用片段
高级:同时删除该资料生成的知识点 高级:同时删除该资料生成的知识点
``` ```
### 3. 删除整个 KnowledgeBase与人不同 ### 3. 删除整个 KnowledgeBase与人不同✅ 已实现
```text ```text
knowledgeBase.deletedAt = now() knowledgeBase.deletedAt = now()
→ 级联软删该 KB 下所有 sources / chunks / candidates / items / review cards / learning records → KnowledgeItems (soft delete)
→ Qdrant 标记 deleted = true → ImportCandidates (hard delete)
→ COS 异步清理 → KnowledgeChunks (soft delete)
→ DocumentImports (status→CANCELLED)
→ KnowledgeSources (soft delete)
→ Qdrant vectors (delete by filter)
→ COS 异步清理(待配)
``` ```
用户删除的是整个学习空间,所以级联删除。 用户删除的是整个学习空间,所以级联删除。`KnowledgeBaseService.remove()` 已实现。
### 4. 后台物理清理(每日凌晨) ### 4. 后台物理清理(每日凌晨)
@ -1047,7 +1050,7 @@ AI 成本日志保留 180 天
--- ---
## 十六、备份与灾备策略(已拍板)⏳ 表已建,备份脚本待写 ## 十六、备份与灾备策略(已拍板)🔶 本地备份完成COS 同步待配
### 1. MySQL 备份 ### 1. MySQL 备份
@ -1055,39 +1058,25 @@ AI 成本日志保留 180 天
优先级最高MySQL > Qdrant > COS 优先级最高MySQL > Qdrant > COS
``` ```
理由Qdrant 可重建COS 有原文件,但 MySQL 丢了业务关系、用户数据、学习记录会非常麻烦。
```text ```text
每日凌晨备份 → /data/backups/mysql/zhixi_{yyyy-mm-dd}.sql.gz ✅ 每日凌晨 3 点 mysqldump → /data/backups/mysql/zhixi_{yyyy-mm-dd}.sql.gz
备份后上传 COS → system/backups/mysql/{yyyy-mm-dd}/zhixi.sql.gz 备份后上传 COS → system/backups/mysql/{yyyy-mm-dd}/zhixi.sql.gz
本地保留 7 天 本地保留 7 天
COS 保留 30 天 COS 保留 30 天
``` ```
### 2. Qdrant 备份 ### 2. Qdrant 备份
```text ```text
每日凌晨 3 点生成 snapshot → /data/backups/qdrant/ 每日凌晨 3 点生成 snapshot → /data/backups/qdrant/
生成后上传 COS → system/backups/qdrant/{yyyy-mm-dd}/zhixi_chunks.snapshot 生成后上传 COS → system/backups/qdrant/{yyyy-mm-dd}/zhixi_chunks.snapshot
本地保留 7 天 本地保留 7 天
COS 保留 30 天 COS 保留 30 天
``` ```
### 3. 备份任务记录表 ### 3. 备份脚本
```text ✅ `/opt/zhixi/backup/backup.sh` 已部署cron `0 3 * * *`首次手动执行成功MySQL 8K + Qdrant 284K
backup_jobs
- id
- type ← QDRANT / MYSQL
- status ← RUNNING / COMPLETED / FAILED
- localPath
- cosObjectKey
- fileSizeBytes
- startedAt
- completedAt
- errorMessage
- createdAt
```
### 4. 恢复依赖链 ### 4. 恢复依赖链
@ -1326,26 +1315,23 @@ source → ImportCandidate → KnowledgeItem
--- ---
## 二十一、知识库主流程 🔶 索引流程代码完整import_pipeline.py待系统跑通 ## 二十一、知识库主流程 ✅ 全链路已验证通过
### 1. 索引流程 ### 1. 索引流程
测试验证raw text 导入)✅:
```text ```text
iOS 上传文件到 COS POST /api/imports (raw text)
→ 后端创建 File含 sha256 重复检测) → NestJS DocumentImportWorker 入队 ✅
→ 后端创建 KnowledgeSource → chunking512 tokens + 64 overlap✅ 4 chunks
→ 创建 DocumentImportstatus = QUEUED → embeddingbge-m3batch 50
→ Worker claim 任务QUEUED → CLAIMED → Qdrant upsert ✅ 4 points
→ Worker 从 COS 拉文件到 /data/tmp/imports/{jobId} → KnowledgeChunk MySQL 写入 ✅
→ 本地解析 / OCR / 多模态 → ImportCandidate 生成DeepSeek✅ 3 candidates
→ 写入 parsed.md 到 COS → KB.itemCount 更新 ✅
→ 清洗文本 → import.status = COMPLETED ✅
→ chunking512 tokens + 64 overlap → ⬜ COS 文件上传路径(待 iOS 真文件)
→ embeddingbge-m3batch 50~100 → ⬜ OCR / 多模态parser 代码已就,待真文件触发)
→ Qdrant upsert
→ 保存 KnowledgeChunk 到 MySQL
→ source.indexStatus = INDEXED
→ import.status = COMPLETED
``` ```
### 2. 学习流程 ### 2. 学习流程
@ -1409,13 +1395,30 @@ OCR / 多模态额度提示
## 二十三、执行顺序(状态更新) ## 二十三、执行顺序(状态更新)
### 第一阶段:服务器基础 ✅ 已完成 ### 第一阶段:服务器基础 ✅ 已完成
### 第二阶段:基础数据模型 ✅ 已完成33 张表全部建好) ### 第二阶段:基础数据模型 ✅ 已完成35 张表全部建好)
### 第三阶段:文件导入闭环 ✅ Worker 已部署运行polling 正常 ### 第三阶段:文件导入闭环 ✅ NestJS Worker 完整流水线、Python Worker 轮询就绪
### 第四阶段RAG 索引 ✅ 代码完成chunker/embedder/indexer待端到端验证 ### 第四阶段RAG 索引 ✅ RAG chat + 多轮对话接口已验证
### 第五阶段AI 学习化 ⏳ ImportCandidate 模块已完成,待端到端 ### 第五阶段AI 学习化 ✅ 全链路补齐
### 第六阶段:单文件学习 ⏳ 核心模块已建ActiveRecall/AIAnalysis/FocusItem/Review待对接
NestJS DocumentImportWorker 完整流水线:
```
raw text → ChunkingService (512t/64overlap) → VectorService (bge-m3 + Qdrant UUID + MySQL)
→ ImportCandidate 生成 → KB.itemCount 更新
```
验证4 chunks + 3 candidates + Qdrant 11 points + itemCount=3 ✅
### 第六阶段:单文件学习 🔶 模块已建,待端到端对接
ActiveRecallController / AiAnalysisController / FocusItemsController / ReviewController / LearningSessionController 已全部实现Workflow 层active-recall-analysis / feynman-evaluation / learning-trend / review-card-generation已到位AiAnalysisWorker 异步处理已就绪。
**缺:** 从 KnowledgeItem → 开始学习 → 主动回忆 → AI 诊断 → 待巩固项 → 复习卡的完整串联流程未跑通过。
### 第七阶段:知识库增强 ⏳ 待开发 ### 第七阶段:知识库增强 ⏳ 待开发
- Chat session 持久化(当前 history 由客户端管理,无服务端 session 存储)
- 知识库对话 session 列表 API
- 文件上传 COS 真文件测试(待 iOS 端触发)
--- ---
## 二十四、最终落地原则 ## 二十四、最终落地原则
@ -1447,26 +1450,26 @@ DeepSeek 负责核心文本智能 → Flash 日常 + thinking 诊断 + Pro 高
| 6 | Qdrant distance | Cosine | ✅ 已配置 | | 6 | Qdrant distance | Cosine | ✅ 已配置 |
| 7 | Qdrant 部署 | 单节点 Docker1 shard | ✅ 已部署运行 | | 7 | Qdrant 部署 | 单节点 Docker1 shard | ✅ 已部署运行 |
| 8 | Qdrant 集群时机 | 100 万 points 后评估 | ⏳ 远期 | | 8 | Qdrant 集群时机 | 100 万 points 后评估 | ⏳ 远期 |
| 9 | Rerank 模型 | BAAI/bge-reranker-v2-m3 | ✅ Key 已配置,代码待写 | | 9 | Rerank 模型 | BAAI/bge-reranker-v2-m3 | ✅ reranker.py + RAG chat 已用 |
| 10 | RAG 召回 | Top-50 ANN → rerank → Top-5~8 | ✅ indexer.py 已实现 | | 10 | RAG 召回 | Top-50 ANN → rerank → Top-5~8 | ✅ RAG chat 服务已实现 |
| 11 | 知识库对话 | 仅限 KB 内检索 | ⏳ 待开发 | | 11 | 知识库对话 | 仅限 KB 内检索 | ✅ POST /api/rag/chat |
| 12 | 多轮对话 | 保存 session + 最近 3 轮上下文 | ⏳ 待开发 | | 12 | 多轮对话 | history 参数,客户端管理状态 | ✅ 支持最近 10 条历史 |
| 13 | 候选知识点数量 | 上限 30最少 3 | ✅ candidate_generator.py 已实现 | | 13 | 候选知识点数量 | 上限 30最少 3 | ✅ candidate_generator.py 已实现 |
| 14 | 自动接受 | 全部 PENDING 等确认 | ✅ ImportCandidate 模块已实现 | | 14 | 自动接受 | 全部 PENDING 等确认 | ✅ ImportCandidate 模块已实现 |
| 15 | OCR | 百度 OCR + Qwen3-VL | ✅ 百度 OCR AppID 7767914 | | 15 | OCR | 百度 OCR + Qwen3-VL | ✅ 百度 OCR AppID 7767914 |
| 16 | 多模态兜底 | Qwen3-VL-32B-Thinking | ✅ Key 已配置 | | 16 | 多模态兜底 | Qwen3-VL-32B-Thinking | ✅ Key 已配置 |
| 17 | 删除 source → KI | 默认保留 + sourceDeleted 快照 | ✅ Prisma schema 已含 | | 17 | 删除 source → KI | 默认保留 + sourceDeleted 快照 | ✅ Prisma schema 已含 |
| 18 | 删除 KB → 全对象 | 级联删除 | ⏳ 待实现 | | 18 | 删除 KB → 全对象 | 级联删除 | ✅ KB Service 已实现 |
| 19 | Qdrant 快照 | 本地 + 同步 COS | ⏳ 备份脚本待写 | | 19 | Qdrant 快照 | 本地 + 同步 COS | 🔶 本地 cron 已配COS 同步待配 |
| 20 | Qdrant 本地快照保留 | 7 天 | | | 20 | Qdrant 本地快照保留 | 7 天 | ✅ backup.sh |
| 21 | Qdrant COS 快照保留 | 30 天 | ⏳ | | 21 | Qdrant COS 快照保留 | 30 天 | ⏳ COS 同步待配 |
| 22 | MySQL 备份 | 每日凌晨 + 同步 COS | ⏳ 备份脚本待写 | | 22 | MySQL 备份 | 每日凌晨 + 同步 COS | 🔶 本地完成COS 同步待配 |
| 23 | COS 文件清理 | soft delete 后 7 天 | ⏳ | | 23 | COS 文件清理 | soft delete 后 7 天 | ⏳ COS 生命周期待配 |
| 24 | MySQL 物理删除 | 默认 30 天 | ⏳ 清理脚本待写 | | 24 | MySQL 物理删除 | 默认 30 天 | ⏳ 清理脚本待写 |
| 25 | AI 成本日志保留 | 180 天 | ✅ AiUsageLog 表已建 | | 25 | AI 成本日志保留 | 180 天 | ✅ AiUsageLog 表已建 |
| 26 | 审计日志保留 | 365 天 | ✅ AdminAuditLog 表已建 | | 26 | 审计日志保留 | 365 天 | ✅ AdminAuditLog 表已建 |
| 27 | Pro 定价 | 28 元/月预设,配置化 | ✅ MembershipPlan 表已建 | | 27 | Pro 定价 | 28 元/月预设,配置化 | ✅ MembershipPlan 表已建 |
| 28 | Worker 进程数 | 单 Worker 起步 | ✅ systemd zhixi-worker 运行中 | | 28 | Worker 进程数 | 单 Worker 起步 | ✅ systemd zhixi-worker + NestJS BullMQ |
| 29 | Worker 扩展 | 压力上来后 2~3 个 | ⏳ 远期 | | 29 | Worker 扩展 | 压力上来后 2~3 个 | ⏳ 远期 |
| 30 | 文档版本管理 | 预留 version 字段 | ✅ schema 已预留 | | 30 | 文档版本管理 | 预留 version 字段 | ✅ schema 已预留 |
| 31 | 重复文件 | sha256 检测 + 提示用户 | ✅ UploadedFile sha256 已实现 | | 31 | 重复文件 | sha256 检测 + 提示用户 | ✅ UploadedFile sha256 已实现 |

View File

@ -0,0 +1,53 @@
# WebAppC端知识工作台技术栈定版
C 端 Web 知识工作台,定位是高体验的学习工具。用户在浏览器里管理知识库、编辑知识点、查看学习进度。
```text
框架Vite + React + TypeScript
UIshadcn/ui + Tailwind CSS
编辑器Tiptap
路由React Router
服务端状态TanStack Query
本地状态Zustand
API ClientOpenAPI + Orval
表单React Hook Form + Zod
认证JWT与 iOS 共享同一套后端)
部署4核4G Nginx 静态托管
```
## 一、为什么用 Vite + React 而不是 Next.js
WebApp 不需要 SSR/SEO。用户登录后才能使用所有功能。Vite 构建产物直接托管到 Nginx。
## 二、为什么用 shadcn/ui
C 端产品需要精致、不臃肿的体验。知识工作台是沉浸式工具,不是表格/表单密集的后台。
## 三、为什么用 Tiptap
基于 ProSeMirror支持富文本编辑、Markdown 快捷输入、代码块、数学公式、图片拖拽、自定义节点。
## 四、状态管理
| 类型 | 方案 | 用途 |
|------|------|------|
| 服务端状态 | TanStack Query | 知识库列表、知识点、学习记录、用户信息 |
| 本地状态 | Zustand | 侧边栏、编辑器焦点、选中知识点、主题 |
## 五、API
OpenAPI → Orval 生成类型安全 client → TanStack Query hooks
## 六、页面清单
知识库:列表页、详情页、创建页、知识源、导入进度、候选知识点确认
学习:知识点详情/编辑(Tiptap)、主动回忆、AI分析结果、待巩固项、复习卡片
个人:设置、会员/额度、学习统计
## 七、部署
4核4G Nginx 静态托管,域名 app.longde.cloudAPI 走 api.longde.cloud
## 八、最终拍板
Vite + React + TypeScript + shadcn/ui + Tiptap + React Router + TanStack Query + Zustand + Orval + React Hook Form + Zod

View File

@ -0,0 +1,112 @@
# 待决策事项
> 创建日期2026-05-20 | 需要你拍板的所有事项,按优先级排列
---
## 🔴 产品方向(决定产品形态)
### 1. 学习引擎交互设计
**背景:** ActiveRecall、AIAnalysis、FocusItem、ReviewCard 四个模块代码全部就绪,但从未串联跑过。以下问题需要在串联前确定:
| # | 问题 | 选项 |
|---|------|------|
| 1 | 学习会话步骤 | A) 看内容→主动回忆→AI诊断→复习卡完整流程/ B) 一次只做一个知识点 / C) 其他 |
| 2 | 主动回忆交互形式 | A) 简答输入+AI评估 / B) 填空 / C) 口述(语音)|
| 3 | AI 诊断反馈粒度 | A) 只打分 / B) 详细分析+缺失点+改进建议 / C) 费曼评估 |
| 4 | 复习卡片触发时机 | A) 每次学完自动生成 / B) 用户手动请求 / C) 按遗忘曲线 |
| 5 | 竞品参考 | 选 1-2 个学习 App多邻国/Anki/得到/极客时间?)|
### 2. 第一个垂直知识库方向S1
目前没有选定第一批内容方向。候选:
- 公考申论
- AI 工具学习
- 前端面试
- 其他
### 3. 竞品拆解S2
零竞品文档,无法定义差异化。需要选定 3-5 个竞品做分析。
### 4. 知识库技术架构选型S16
开源知识库框架(如 Dify/AnythingLLM vs 自建仿竞品结构。
### 5. MVP 模块裁剪S4
代码已远超 MVP 计划,方向确定后应裁剪。哪些模块先不上?
---
## 🟡 产品体验
### 6. 官网登录W8
现在就加登录还是等方向确定后?登录后能做什么?
### 7. 官网文案W9
面向用户的文字内容(品牌定位、产品描述),不可代劳。
### 8. 产品设计理念S14 + 文案统一S15
产品世界观/价值观/面向用户的 tone & voice。
### 9. Tab 结构调整I17
iOS 底部保持 5-Tab 还是合并为 4-Tab
---
## 🟢 定价与运营
### 10. Pro 定价B23
28 元/月是预设,跑 1 个月真实成本后需正式确定。
### 11. 验证退出条件S6
没有"什么是验证失败"的定义和时间节点。什么时候判定要 pivot
### 12. 输入降门槛方案S7
用户不愿主动输入是最大风险之一,需缓解策略。
### 13. AI 分析质量验收标准S8
没有产品侧的 AI 效果验收机制。什么算"AI 分析质量合格"
### 14. 真实用户获取S10
等待名单未真正跑过获客流程。
### 15. 隐私政策合规S12
当前为 AI 生成模板App Store 审核可能被拒。
---
## ⚪ 远期
### 16. Dify 部署
第一阶段不部署。后续如需实验,放 8核32G sandbox profile。
### 17. n8n / agent runner
4核4G 上可部署,用于营销自动化。
---
## 决策统计
| 优先级 | 数量 | 说明 |
|--------|------|------|
| 🔴 | 5 | 产品方向,决定 MVP 形态 |
| 🟡 | 4 | 产品体验,影响用户感知 |
| 🟢 | 6 | 定价/运营/合规 |
| ⚪ | 2 | 远期 |
**总共 17 项待决策。**

View File

@ -32,18 +32,22 @@
> 详细文档:[后端开发路线图](./api-server/后端开发路线图.md) | [进行中](./api-server/进行中.md) | [已完成清单](./api-server/已完成/[已完成]-后端待完成事项清单.md) > 详细文档:[后端开发路线图](./api-server/后端开发路线图.md) | [进行中](./api-server/进行中.md) | [已完成清单](./api-server/已完成/[已完成]-后端待完成事项清单.md)
### 🟠 P1 — AI 工作流 ### 🟢 P1 — AI 工作流 ✅
| # | 事项 | 说明 | 详见 | 决策 | | # | 事项 | 说明 | 详见 | 决策 |
|---|------|------|------|------| |---|------|------|------|------|
| B11 | AI 联调 + Prompt 调优 | DeepSeek/MiniMax 真实调用测试Prompt 迭代 | [AI架构设计](./api-server/AI架构设计.md) | 🟢 | | B11 | ✅ 知识库导入全链路 | rawText→AI 提取→Embedding→Qdrant→RAG 对话 | 工作日志 5/20 | 🟢 |
| B12 | ✅ RAG 对话接口 | POST /api/rag/chat检索→rerank→DeepSeek+citations | 工作日志 5/20 | 🟢 |
| B14 | ✅ 知识库级联删除 | KB→Sources→Chunks→Qdrant 全链路清理 | 工作日志 5/20 | 🟢 |
| B15 | ✅ 多轮对话 | RAG chat 支持 history 参数,上下文注入 | 工作日志 5/20 | 🟢 |
### 🟡 P2 — iOS 接口对齐 ### 🟡 P2 — 待调优
| # | 事项 | 说明 | 详见 | 决策 | | # | 事项 | 说明 | 详见 | 决策 |
|---|------|------|------|------| |---|------|------|------|------|
| B13 | AI 提取 Prompt 调优 | 5 知识点 content 完全相同,待真文档后调 | 工作日志 5/20 | 🟢 |
| B28 | iOS 接口缺口审计 | 逐页面对比现有 API列出缺接口/缺字段清单 | [进行中](./api-server/进行中.md) | 🔵 | | B28 | iOS 接口缺口审计 | 逐页面对比现有 API列出缺接口/缺字段清单 | [进行中](./api-server/进行中.md) | 🔵 |
| B29 | 知识库存储架构 | COS 路径规范、图片/PDF 解析 pipeline 设计 | [进行中](./api-server/进行中.md) | 🔵 | | B29 | 知识库存储架构 | COS 路径规范、图片/PDF 解析 pipeline | [进行中](./api-server/进行中.md) | 🔵 |
### ⚪ 远期 — 商业化/后台/客服 ### ⚪ 远期 — 商业化/后台/客服