Files
mnote/design/design3.0.md
T
2025-12-06 16:47:17 +08:00

188 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.
```markdown
# 开发集成笔记、思维导图、OCR 和 AI 问答软件的全面蓝图(v3.0 — 前后端分离 + MinerU + LightRAG 版)
**目标**:深度复刻 Wolai 的块编辑体验 + MindManager 级别的思维导图 + Supabase 在线实时协作 + 高精度 MinerU OCR + 基于 LightRAG 的知识图谱 + 向量双模检索 AI 问答,形成真正的「统一工作流」生产力工具。
**当前版本日期**2025 年 11 月 17 日
**核心变更摘要(给 AI 编码助手直接看)**
- 彻底前后端分离:前端纯 Next.js 网页(零重计算),所有 OCR、向量化、知识图谱构建全部后端 Python 完成
- OCR 更换为 MinerU(精度最高、尤其中文支持完美,已在 2025 年成为 PDF 提取事实标准)
- RAG 系统更换为 LightRAG(性能/成本/精度三者最优,支持 KG + Vector 混合检索,纯 Python,原生支持 pgvector
- 重计算任务全部后台队列化(Celery + Redis),杜绝实时阻塞,支持任务优先级与并发限制
- 客户端只负责 UI + 实时协作 + 轻量查询,前端首屏 < 800ms,编辑零卡顿
## 0. 全新架构总览(必须严格遵守)
| 组件 | 技术栈 | 职责 | 部署方式 |
|--------------|-------------------------------------|----------------------------------------------------------------------|---------------------------|
| 前端 | Next.js 15 App Router + TypeScript + Tailwind + shadcn/ui | UI、BlockNote 编辑器、实时协作(Yjs + Supabase Realtime)、轻量 AI 问答调用 | Vercel / Cloudflare Pages |
| 后端 | FastAPI (Python 3.11+) + LightRAG + MinerU + Celery + Redis | PDF/文件 OCR、文本提取、知识图谱构建、向量/图混合检索、后台任务队列、AI 问答接口 | Railway / Fly.io / Docker 自部署(推荐与自托管 Supabase 同机) |
| 数据库/存储 | Supabase(托管或自托管 Docker+ pgvector + Storage + Realtime + Redis(队列) | 文档树、块内容、向量、知识图谱实体/关系(LightRAG 可直接操作 pgvector) | 自托管推荐(隐私 + 成本) |
| 认证 | Supabase AuthJWT | 前后端共享同一 authFastAPI 使用 supabase-py 验证 JWT | — |
| 实时协作 | Supabase Realtime + Yjs @hocuspocus/provider | 多人光标、并发编辑(只针对笔记内容,不涉及 RAG) | — |
**数据流关键路径(给 Codex/Claude 直接复制的 Prompt 用)**
1. 用户上传 PDF → 前端上传 Supabase Storage → 调用后端 `/api/v1/tasks/ocr`(传 file_url + document_id
2. 后端放入 Celery 队列 → Worker 执行 MinerU → 得到高质量 Markdown/JSON → 存回 document.content + 触发 LightRAG.update_index(document_id, text)
3. 用户保存笔记 / 上传文件 → 触发 LightRAG incremental update(只更新增量 chunk
4. 用户 AI 问答 → 前端调用后端 `/api/v1/chat` → LightRAG.query(query, user_id) → 流式返回带来源引用
## 1. 功能拆解(最终验收标准保持不变,仅实现路径调整)
| 模块 | 核心功能 | 验收标准(可直接写测试用例) | 实现位置 |
|---------------|-----------------------------------------------|-----------------------------------------------------------|----------|
| 笔记 | 块编辑器、嵌套页面、双向链接、模板、斜杠命令 | 可无限嵌套、可拖拽排序、实时多人光标、斜杠命令完整 | 前端 |
| 思维导图 | 拖拽节点、折叠分支、自定义样式、双向同步笔记 | 导图修改 ↔ 笔记大纲实时同步,可导出 PNG/PDF/Markdown | 前端 |
| 在线查看/协作 | 实时同步、共享链接、权限控制、公共只读页 | 延迟 < 800ms,支持 20 人同时编辑无明显冲突 | 前端 + Supabase |
| 文件 OCR | PDF/图片上传 → MinerU 高精度提取 → 自动成笔记块 | 中英文混排准确率 > 97%2025 年 MinerU v2+),进度条 + 重试 | 后端队列 |
| AI 问答 | LightRAGKG + Vector 混合)+ GPT-4o 流式回答 | 回答必须带来源引用,支持多跳推理、总结、对比等复杂任务 | 后端 |
## 2. 最终技术栈(2025 年 11 月 17 日最新推荐)
| 层级 | 选型 | 理由(2025 年实测) | 关键集成点 |
|---------------|-------------------------------------------|----------------------------------------------------------|------------|
| 前端框架 | Next.js 15App Router + RSC | 依旧最强,RSC 可直接调用后端 API,首屏极快 | — |
| UI/样式 | Tailwind + shadcn/ui + Radix + lucide-react | 保持不变,直接 `npx shadcn@latest add` | — |
| 笔记编辑器 | @blocknote/react + @blocknote/core(免费版足以)| 已验证与 Yjs + hocuspocus + Supabase Realtime 最稳定 | 前端 |
| 思维导图 | simple-mind-map + 自研 KMindRenderer | 直接复用 Wolai 风格交互,兼容现有 KMind 主题 & 快照 | 前端 |
| 后端框架 | FastAPI + Uvicorn + Celery[redis] + Redis | 最高性能 Python Web 框架,Celery 队列成熟 | 后端 |
| OCR | MinerU (opendatalab/MinerU latest) | 2025 年 PDF 提取精度最高(尤其数学公式、表格、中文) | 后端 |
| RAG / KG | LightRAGlatest+ pgvector | 支持 KG + Vector 混合检索最强,增量更新极快,成本最低 | 后端,直接操作同一 Supabase pgvector 表 |
| 队列 | Celery + RedisUpstash Redis 兼容) | 任务优先级、失败重试、并发限制(默认 max 3 个 OCR 任务) | 后端 |
| 其他 Python 包 | mineru, lightrag, pgvector-python, supabase-py, python-dotenv, langchain-openai(仅用于调用 GPT | 全部 2025-11 最新版 | — |
## 3. 数据库表结构(新增任务队列表)
```sql
-- 文档树(保持不变)
create table documents (
id uuid primary key default uuid_generate_v4(),
user_id uuid references auth.users not null,
parent_id uuid references documents(id),
title text default '无标题',
content jsonb default '{}', -- BlockNote 格式
mindmap_data jsonb,
raw_text text, -- MinerU 提取后的纯文本(供 LightRAG 使用)
index_status text default 'pending', -- pending / processing / completed / failed
created_at timestamptz default now(),
updated_at timestamptz default now()
);
-- 后台任务表(Celery 不需要表,但我们加一张方便前端查进度)
create table background_tasks (
id uuid primary key default uuid_generate_v4(),
user_id uuid references auth.users,
document_id uuid references documents(id),
task_type text, -- 'ocr' | 'index'
status text default 'pending',
progress integer default 0,
message text,
created_at timestamptz default now()
);
```
LightRAG 会自动在 Supabase pgvector 中创建自己的表(embeddings、entities、relationships 等),我们直接复用,无需手动建。
### 3.1 协同表格数据面(参考 `design/表格方案.md`
```sql
-- 表格元信息(与文档 1:N
create table document_tables (
id uuid primary key default gen_random_uuid(),
workspace_id uuid not null references workspaces(id) on delete cascade,
document_id uuid not null references documents(id) on delete cascade,
title text not null default '未命名表格',
schema jsonb not null default '{}'::jsonb, -- 列定义/格式
view_preferences jsonb not null default '{}'::jsonb,
is_archived boolean not null default false,
snapshot jsonb,
last_synced_at timestamptz,
created_by uuid references profiles(id) on delete set null,
updated_by uuid references profiles(id) on delete set null,
created_at timestamptz not null default timezone('utc', now()),
updated_at timestamptz not null default timezone('utc', now())
);
-- 表格行级数据(大表解耦,支持 Yjs SubDoc 持久化)
create table document_table_rows (
id uuid primary key default gen_random_uuid(),
workspace_id uuid not null references workspaces(id) on delete cascade,
document_id uuid not null references documents(id) on delete cascade,
table_id uuid not null references document_tables(id) on delete cascade,
row_index integer not null,
row_data jsonb not null default '{}'::jsonb, -- 单元格字典
row_hash text,
is_deleted boolean not null default false,
updated_by uuid references profiles(id) on delete set null,
created_at timestamptz not null default timezone('utc', now()),
updated_at timestamptz not null default timezone('utc', now())
);
```
- `workspace_id + RLS`:沿用 `workspace_members` 策略,任何读写都需要加入同一 Workspace。
- 触发器:`ensure_document_table_workspace``sync_document_table_row_meta` 在写入时同步 Workspace/Document`set_*_updated_at` 负责时间戳。
- 行级 diff`row_index` + `row_hash` 提供后续优化空间,满足大表局部同步、快照/导出等需求。
- 这两张表已通过 Supabase (`supabase_local`) 执行创建,对应迁移 `20250222_add_document_tables.sql`,是 Luckysheet × Yjs × Supabase 表格 MVP 的数据面基础。
## 4. 分阶段实施计划(v3.0 更新版 · 含后端)
| 阶段 | 目标 | 核心任务 | 预估人天 | 推荐给 AI 编码助手的 Prompt 示例 |
|------|--------------------------------|--------------------------------------------------------------------------|----------|----------------------------------|
| 0 | 项目骨架 | 前端 Next.js + Supabase 初始化<br>后端 FastAPI + Celery + Redis + LightRAG 模板 | 2 天 | “Create a Next.js 15 App Router project with Supabase auth + shadcn/ui AND a separate FastAPI project with Celery+Redis queue, supabase-py client, MinerU, LightRAG initialized to use pgvector.” |
| 1 | 前端 Wolai 核心 + 实时协作 | 递归侧边栏 + BlockNote + Yjs + Supabase Realtime(参考 ui_react.md 严格实现) | 5-7 天 | “Build full Wolai-like document tree sidebar + BlockNote editor with real-time collaboration using @hocuspocus/provider and Supabase Realtime. Follow ui_react.md 所有样式必须 100% 复刻。” |
| 2 | 后端基础 API + MinerU OCR 队列 | 文件上传 → Storage → 调用 /tasks/ocr → Celery worker 执行 MinerU → 更新 document.raw_text + index_status | 3-4 天 | “FastAPI endpoint that accepts Supabase signed URL, downloads PDF, runs MinerU magic_pdf(..., ocr=True), saves markdown to document.content and raw_text, updates index_status.” |
| 3 | LightRAG 索引管道 | 笔记保存或 OCR 完成 → Celery 任务 LightRAG.index(document_id, text, user_id)(增量更新) | 3 天 | “Use LightRAG with PGVectorStore, implement incremental update when document.updated_at changes, support user-level isolation.” |
| 4 | AI 问答侧边栏(流式) | 前端调用后端 /chat stream → LightRAG.query() → SSE 返回带来源引用 | 2-3 天 | “FastAPI SSE endpoint /api/v1/chat that uses LightRAG.query(query, user_id) and streams token + sources.” |
| 5 | 思维导图 + 双向同步 | 基于 simple-mind-map 的 KMindRenderer,与 BlockNote outline 实时同步、导出/预览 | 3 天 | 同 v2.0 |
> **进度提示**simple-mind-map 渲染器已在前端切换完成,但与 BlockNote 大纲的双向同步、导出为 PNG/PDF/Markdown 以及思维导图 ↔ 笔记互跳等能力仍属于未完成事项,需要在阶段 5 内继续收敛。
| 6 | 任务进度实时推送 | Supabase Realtime 监听 background_tasks 表变化 → 前端显示进度条 | 1 天 | — |
| 7 | 性能优化 + 测试 + 部署 | 前端 skeleton + lazy,后端 rate limit + concurrency=3Cypress + pytest | 4 天 | — |
**总预估**:单人全职 4-5 周(得益于前后端分离 + MinerU/LightRAG 开箱即用,实际比 v2 更快)
### 4.1 表格方案专项里程碑(摘自 `design/表格方案.md`
| 阶段 | 目标 | 关键任务 | 产出 / 验收 |
|------|------|----------|-------------|
| P0 需求巩固 | 明确体验 & 数据需求 | 共识 Luckysheet 交互、BlockNote 预览范围、列类型 MVP、AI/MinerU 接口 | PRD + 交互稿 |
| P1 数据面准备 | 建 Supabase 表 & API | 执行 SQL(见 3.1)、配置 RLS、FastAPI 新增 `/tables` `/tables/{id}/rows` CRUD、单测 | 后端分支 + Swagger |
| P2 Yjs/Luckysheet 骨架 | 协同内核跑通 | 引入 `@dream-num/luckysheet``luckysheet-yjs-binding`,实现 `<LuckysheetProvider>` 与独立编辑页 | 协同 demo(多端无冲突) |
| P3 BlockNote 表格块 & 预览 | 文档内插入/缩略展示 | Slash 命令、自定义 block schema、预览组件(前 5 行 + hover toolbar)、BlockNote ↔ Supabase 建删同步 | 文档里可插入并跳转全屏 |
| P4 全屏编辑器 & 工具栏 | 飞书式编辑体验 | `<FullScreenTableEditor>`、合并/冻结/条件格式/基础公式、协作者状态、暗黑模式 | 500×50 表格流畅,工具栏齐全 |
| P5 持久化 & 性能 | 数据安全 & 优化 | SubDoc → Supabase 节流、行级 diff、定时写入 `table_versions` 快照、预览虚拟滚动 | 重连不丢数据、大表不卡顿 |
| P6 高级扩展 | 导入导出 & AI | CSV/Excel 导入导出、MinerU OCR 写表、表格引用共享、权限 UI、E2E 测试 | 导入导出/AI 流程验证通过 |
> 上述阶段与 v3.0 总体里程碑并行推进,优先完成 P0-P4 组成表格 MVP,再与 MinerU / LightRAG 联动。
## 5. 常见陷阱与解决方案(2025-11 最新)
| 陷阱 | 解决方案 |
|---------------------------------|--------------------------------------------------------------------------|
|
| MinerU OCR 耗时长(大 PDF >100 页) | Celery concurrency 限制 3 + 优先级队列(OCR 高优先)+ 进度实时推送 |
| LightRAG 首次全量索引慢 | 首次启动时加 `--init-index` 参数后台全量重建,只在生产环境跑一次 |
| 前后端跨域 + 认证 | 前端携带 Supabase JWT → 后端使用 supabase-py 验证 token.user_id |
| Supabase Storage 签名 URL 过期 | 后端使用 service_role key 下载(安全,普通用户只能生成短时 signed URL |
| LightRAG 多租户隔离 | 每个 user_id 建立独立 index name(如 `user_{user_id}`)或使用 LightRAG 的 namespace 功能 |
| Redis 在 Vercel 无状态环境 | 推荐 Railway / Fly.io + Upstash Redis(兼容 Celery |
## 6. 立即启动命令(2025-11-17 最新)
```bash
# 前端
npx create-next-app@latest wolai-frontend --ts --app --eslint --tailwind --src-dir --import-alias "@/*"
cd wolai-frontend
npx shadcn@latest init
# 后端
python -m venv venv && source venv/bin/activate
pip install fastapi uvicorn[standard] celery[redis] redis lightrag mineru supabase-py python-dotenv pgvector openai
# 创建 app/main.py + celery -A app.celery worker --loglevel=info
```
**结论**:此 v3.0 架构彻底解决客户端卡顿、OCR 精度、RAG 成本三大痛点,MinerU + LightRAG 组合在 2025 年实测是中文知识库最强方案,强烈推荐立即执行。
编码愉快!
```