docs: add implementation plan for digital employee platform

5 batches, 15 tasks: scaffold→models→tenants→employees→providers→
conversation SSE→RAG pipeline→integration tests+security hardening.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
root 2026-05-05 09:50:50 +08:00
parent 5c13f08c03
commit a8e3ad8e16
2 changed files with 254 additions and 0 deletions

View File

@ -0,0 +1,248 @@
# 数字员工平台实施计划
> 日期2026-05-05
> 依据设计文档docs/plans/2026-05-05-digital-employee-design.md
> 状态:待批准
## 总览
MVP 共分 5 个批次,每批次 3 个任务,预计总工时 ~15 人天。
| 批次 | 范围 | 任务数 |
|------|------|--------|
| B1 | 项目脚手架 + 数据模型 + 租户管理 | 3 |
| B2 | 数字员工配置 + LLM Provider 抽象层 | 3 |
| B3 | 对话接口SSE 流式)+ 对话历史 | 3 |
| B4 | RAG 知识库 + 文档处理 | 3 |
| B5 | 集成测试 + 错误处理 + 启动脚本 | 3 |
---
## 批次 B1项目脚手架 + 数据模型 + 租户管理
### Task 1.1:初始化项目脚手架
- **修改目标**创建项目目录结构、Python 依赖配置、FastAPI 入口
- **涉及文件**
- `backend/pyproject.toml` — 依赖声明
- `backend/app/__init__.py`
- `backend/app/main.py` — FastAPI app 工厂
- `backend/app/config.py` — Settingspydantic-settings
- `backend/app/database.py` — async SQLAlchemy 引擎 + session
- `backend/.env.example`
- `backend/tests/conftest.py` — pytest fixturesasync client + test DB
- **验证方式**`uv run uvicorn app.main:app --reload` 启动无报错,`/docs` 可访问
- **完成判定**:服务启动 + Swagger UI 可访问 + test DB fixture 可用
### Task 1.2:创建 SQLAlchemy 数据模型
- **修改目标**:定义全部核心 ORM 模型Tenant, TenantConfig, DigitalEmployee, Conversation, Message, KnowledgeBase, Document
- **涉及文件**
- `backend/app/models/__init__.py`
- `backend/app/models/tenant.py` — Tenant, TenantConfig
- `backend/app/models/employee.py` — DigitalEmployee
- `backend/app/models/conversation.py` — Conversation, Message
- `backend/app/models/knowledge.py` — KnowledgeBase, Document
- `backend/app/database.py` — 添加 `Base.metadata.create_all` 初始化逻辑
- **验证方式**:启动时自动建表,`sqlite` 文件包含全部表
- **完成判定**`sqlite3 test.db .tables` 输出全部 7 张表
### Task 1.3:租户管理 APICRUD + LLM 配置)
- **修改目标**:实现租户 CRUD 端点 + LLM 配置更新端点,含 AES-256 加密存储 API Key
- **涉及文件**
- `backend/app/schemas/tenant.py` — Pydantic request/response schemas
- `backend/app/api/deps.py` — DB session 依赖注入
- `backend/app/api/v1/__init__.py` — v1 router
- `backend/app/api/v1/tenants.py` — 5 个端点
- `backend/app/services/tenant_service.py` — 业务逻辑 + 加密
- `backend/app/middleware/tenant.py` — 租户上下文中间件(预留)
- **验证方式**
- RED`test_tenants.py` 先写失败测试(创建/读取/更新/删除/配置更新)
- GREEN实现端点让测试通过
- **完成判定**全部租户测试通过API Key 写入后数据库为密文
---
## 批次 B2数字员工配置 + LLM Provider 抽象层
### Task 2.1:数字员工配置 API
- **修改目标**:实现数字员工 CRUD 端点,支持关联知识库
- **涉及文件**
- `backend/app/schemas/employee.py`
- `backend/app/api/v1/employees.py`
- `backend/app/services/employee_service.py`
- `backend/tests/test_employees.py`
- **验证方式**TDD — RED/GREEN/REFACTOR
- **完成判定**:全部员工测试通过,创建时可关联知识库 ID 列表
### Task 2.2LLM Provider 抽象层
- **修改目标**:实现 BaseLLMProvider 接口 + OpenAIProvider + QwenProvider
- **涉及文件**
- `backend/app/providers/__init__.py`
- `backend/app/providers/base.py` — BaseLLMProvider ABC + LLMMessage/LLMResponse
- `backend/app/providers/openai_provider.py` — chat / chat_stream / embed
- `backend/app/providers/qwen_provider.py` — 兼容 OpenAI SDK 格式
- `backend/tests/test_providers.py`
- **验证方式**TDD — mock LLM API 响应,验证接口一致性和 Provider 注册表路由
- **完成判定**:两个 Provider 的 chat/chat_stream/embed 单测通过mock 模式)
### Task 2.3Provider 集成到租户配置
- **修改目标**tenant_service 根据 tenant_config 动态实例化 ProviderAPI 端点可验证 Provider 可用性
- **涉及文件**
- `backend/app/services/tenant_service.py` — 新增 `get_provider_for_tenant()`
- `backend/app/api/v1/tenants.py` — 新增 `POST /tenants/{id}/test-provider` 端点
- `backend/tests/test_providers.py` — 补充集成验证测试
- **验证方式**TDD — mock Provider 测试路由正确性
- **完成判定**test-provider 端点根据租户配置返回正确的 Provider 实例信息
---
## 批次 B3对话接口SSE 流式)+ 对话历史
### Task 3.1:对话与消息数据模型 + API
- **修改目标**:实现 Conversation / Message CRUD + 消息发送端点(非流式先实现)
- **涉及文件**
- `backend/app/schemas/conversation.py`
- `backend/app/api/v1/conversations.py`
- `backend/app/services/conversation_service.py`
- `backend/tests/test_conversations.py`
- **验证方式**TDD — 创建对话 / 发送消息 / 获取历史
- **完成判定**:全部对话基础测试通过
### Task 3.2SSE 流式响应
- **修改目标**:实现 SSE 事件流message_start / token / sources / message_end / error集成 Provider.chat_stream
- **涉及文件**
- `backend/app/api/v1/conversations.py` — 改造 messages 端点为 SSE
- `backend/app/services/conversation_service.py` — 流式处理 + 持久化
- `backend/tests/test_conversations.py` — 补充 SSE 测试
- **验证方式**TDD — 用 TestClient 验证 SSE 事件格式;手动用 curl 验证流式输出
- **完成判定**SSE 事件格式正确token 按序到达message_end 含 token_count
### Task 3.3:会话上下文管理
- **修改目标**:实现 max_context_messages 窗口裁剪、system_prompt 注入、对话历史加载
- **涉及文件**
- `backend/app/services/conversation_service.py` — 新增 `build_messages()`
- `backend/tests/test_conversations.py` — 补充上下文窗口测试
- **验证方式**TDD — 验证消息超过 max_context_messages 时自动裁剪
- **完成判定**上下文窗口裁剪正确system_prompt 始终在首位
---
## 批次 B4RAG 知识库 + 文档处理
### Task 4.1:知识库 CRUD + 文档上传 API
- **修改目标**:实现知识库和文档的 CRUD 端点,含文件上传
- **涉及文件**
- `backend/app/schemas/knowledge.py`
- `backend/app/api/v1/knowledge.py`
- `backend/app/services/knowledge_service.py`
- `backend/tests/test_knowledge.py`
- **验证方式**TDD — 创建知识库 / 上传文档 / 列出 / 删除
- **完成判定**:知识库 CRUD 测试通过,文件上传持久化到本地存储
### Task 4.2:文档解析与分块
- **修改目标**:实现 PDF/DOCX/TXT/MD 文件解析 → RecursiveCharacterTextSplitter 分块
- **涉及文件**
- `backend/app/services/knowledge_service.py` — 新增解析与分块逻辑
- `backend/tests/test_knowledge.py` — 补充文档解析测试(用小文件 fixture
- **验证方式**TDD — 上传小 PDF/TXT验证分块结果数量和内容
- **完成判定**4 种文件类型均能正确解析分块chunk_size=500, overlap=50
### Task 4.3RAG Pipeline嵌入 + 检索 + 注入)
- **修改目标**:实现嵌入生成 → ChromaDB 存储 → 相似度检索 → 上下文注入对话
- **涉及文件**
- `backend/app/services/rag_service.py` — RAG 全流程
- `backend/app/services/conversation_service.py` — 集成 RAG 检索
- `backend/tests/test_knowledge.py` — 补充 RAG 检索测试mock embedding
- `backend/tests/test_conversations.py` — 补充 RAG 注入测试
- **验证方式**TDD — mock embedding验证 ChromaDB 写入/检索/上下文注入逻辑
- **完成判定**:上传文档后对话能检索到相关知识片段并注入 prompt
---
## 批次 B5集成测试 + 错误处理 + 启动脚本
### Task 5.1:端到端集成测试
- **修改目标**:编写完整链路集成测试:创建租户 → 配置员工 → 上传知识库 → 对话
- **涉及文件**
- `backend/tests/test_integration.py`
- **验证方式**运行集成测试mock LLM Provider验证全链路数据流正确
- **完成判定**:集成测试全部通过
### Task 5.2:统一错误处理 + 安全加固
- **修改目标**
- 全局异常处理器Provider 错误、数据库错误、校验错误)
- 租户隔离校验(所有查询强制 tenant_id 过滤)
- 输入限制(文件大小、消息长度、速率限制)
- **涉及文件**
- `backend/app/middleware/tenant.py` — 租户隔离中间件实现
- `backend/app/main.py` — 注册异常处理器
- `backend/app/api/deps.py` — 租户上下文注入
- `backend/tests/test_tenants.py` — 补充越权测试
- **验证方式**TDD — 验证租户 A 无法访问租户 B 资源、错误返回正确状态码
- **完成判定**:安全测试通过,越权返回 403
### Task 5.3:启动脚本 + README + .env.example
- **修改目标**:提供一键启动脚本和开发文档
- **涉及文件**
- `backend/.env.example` — 环境变量模板
- `scripts/dev.sh` — 一键启动脚本
- `README.md` — 项目说明与快速开始
- **验证方式**:从零 `pip install` → 配置 `.env``./scripts/dev.sh` 启动成功
- **完成判定**:按 README 步骤能成功启动服务Swagger UI 可访问
---
## 依赖关系
```
B1 ──→ B2 ──→ B3 ──→ B4 ──→ B5
│ │
└── Provider ──┘
```
- B2 依赖 B1数据模型
- B3 依赖 B2需要 Provider 调用 LLM
- B4 依赖 B2需要 Provider 生成嵌入)
- B5 依赖 B1-B4集成测试覆盖全部模块
## 验证命令
```bash
# 单测
cd backend && uv run pytest tests/ -v
# 集成测试
cd backend && uv run pytest tests/test_integration.py -v
# Lint
cd backend && uv run ruff check app/ tests/
# Type check
cd backend && uv run mypy app/
# 启动开发服务
cd backend && uv run uvicorn app.main:app --reload --port 8000
```
## 风险与待确认项
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| ChromaDB 嵌入式版本并发性能有限 | 多租户同时上传文档可能阻塞 | MVP 阶段文档上传串行处理V1 迁移 pgvector |
| OpenAI/通义 API 不稳定 | 对话功能不可用 | 重试 + 降级提示 |
| SSE 在测试中验证较复杂 | 测试覆盖可能不足 | 使用 TestClient 的 stream 模式 + 事件格式断言 |
| SQLite 写并发锁 | 多并发写入可能超时 | MVP 阶段 WAL 模式缓解V1 迁移 PostgreSQL |

View File

@ -39,6 +39,12 @@
- P2用量统计/计费、权限控制
- P3对话质量评估、模板市场、多渠道接入、审批工作流、审计日志
## 计划
- 实施计划已生成docs/plans/2026-05-05-digital-employee-plan.md
- 5 批次 15 个任务B1 脚手架+模型+租户 → B2 员工+Provider → B3 对话SSE → B4 RAG → B5 集成+安全
- 每任务严格 TDDRED/GREEN/REFACTOR单步 2-5 分钟粒度
## 问题与修复
(暂无)