Files
AIclinicalresearch/docs/03-业务规则/核心业务规则总览.md
AI Clinical Dev Team 9acbb0ae2b feat: complete Dify platform deployment (Day 18)
## Dify 閮ㄧ讲瀹屾垚 鉁?
### 瀹屾垚鐨勫伐浣?1. Docker 闀滃儚鍔犻€熷櫒閰嶇疆
   - 閰嶇疆 5 涓浗鍐呴暅鍍忔簮
   - 澶у箙鎻愬崌涓嬭浇閫熷害鍜屾垚鍔熺巼

2. Dify 闀滃儚鎷夊彇 (鍏?11 涓湇鍔?
   - langgenius/dify-api:1.9.1
   - langgenius/dify-web:1.9.1
   - postgres, redis, weaviate, nginx 绛?   - 鎬诲ぇ灏忕害 2GB锛岃€楁椂绾?15 鍒嗛挓

3. Dify 鏈嶅姟鍚姩
   - 鉁?nginx (80/443)
   - 鉁?api, worker, worker_beat
   - 鉁?web (3000)
   - 鉁?db (PostgreSQL), redis
   - 鉁?weaviate (鍚戦噺鏁版嵁搴?
   - 鉁?sandbox, plugin_daemon, ssrf_proxy

4. Dify 鍒濆鍖栭厤缃?   - 鍒涘缓绠$悊鍛樿处鍙?   - 鍒涘缓搴旂敤: AI Clinical Research
   - 鑾峰彇 API Key: app-VZRn0vMXdmltEJkvatHVGv5j

5. 鍚庣鐜閰嶇疆
   - DIFY_API_URL=http://localhost/v1
   - DIFY_API_KEY 宸查厤缃?
### 鏂囨。鏇存柊
- 鏂板: docs/05-姣忔棩杩涘害/Day18-Dify閮ㄧ讲瀹屾垚.md
- 鏇存柊: docs/04-寮€鍙戣鍒?寮€鍙戦噷绋嬬.md (Day 18 鏍囪涓哄畬鎴?

### 涓嬩竴姝?Day 19-24: 鐭ヨ瘑搴撶郴缁熷紑鍙?- Dify 瀹㈡埛绔皝瑁?- 鐭ヨ瘑搴撶鐞?CRUD
- 鏂囨。涓婁紶涓庡鐞?- @鐭ヨ瘑搴撻泦鎴?- RAG 闂瓟楠岃瘉

---
Progress: 閲岀▼纰?1 (MVP) 85% -> 鐭ヨ瘑搴撶郴缁熷紑鍙戜腑
2025-10-11 08:58:41 +08:00

595 lines
14 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.
# 核心业务规则总览
> **版本:** v1.0
> **创建日期:** 2025-10-10
> **适用范围:** 整个系统
---
## 📋 目录
1. [用户管理规则](#用户管理规则)
2. [项目管理规则](#项目管理规则)
3. [智能体管理规则](#智能体管理规则)
4. [对话管理规则](#对话管理规则)
5. [知识库管理规则](#知识库管理规则)
6. [权限控制规则](#权限控制规则)
7. [配额限制规则](#配额限制规则)
---
## 用户管理规则
### 注册规则
**BR-U001: 邮箱唯一性**
- 规则:每个邮箱只能注册一个账号
- 验证时机:注册时
- 错误提示:"该邮箱已被注册"
**BR-U002: 邮箱格式验证**
- 规则:必须是有效的邮箱格式
- 正则:`^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$`
- 错误提示:"邮箱格式不正确"
**BR-U003: 密码强度**
- 规则密码至少8位包含字母和数字
- 正则:`^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$`
- 错误提示:"密码至少8位需包含字母和数字"
**BR-U004: 默认试用期**
- 规则新用户默认获得30天试用期
- 实现:`trial_ends_at = now() + 30天`
### 登录规则
**BR-U005: 账户状态检查**
- 规则只有status=active的用户可以登录
- 状态:
- `active` - 可登录
- `inactive` - 未激活,不可登录
- `suspended` - 已暂停,不可登录
**BR-U006: 密码错误次数限制**
- 规则5分钟内最多5次错误尝试
- 超过次数临时锁定账户15分钟
- 实现使用Redis记录失败次数
**BR-U007: JWT Token有效期**
- Access Token7天
- Refresh Token30天
- 过期后需要重新登录
---
## 项目管理规则
### 创建规则
**BR-P001: 项目数量无限制**
- 规则:用户可以创建任意数量的项目
- 理由:项目是核心功能,不应限制
**BR-P002: 项目名称必填**
- 规则:项目名称不能为空
- 长度1-200字符
- 错误提示:"项目名称不能为空"
**BR-P003: 项目描述必填**
- 规则:项目描述不能为空(用于上下文注入)
- 最小长度10字符
- 错误提示:"请输入项目背景信息至少10个字符"
### 更新规则
**BR-P004: 项目背景动态更新**
- 规则:用户可以随时编辑项目描述
- 规则:可以"固定"AI回复到项目描述中
- 实现追加到description字段末尾
**BR-P005: 项目所有权验证**
- 规则:只能修改/删除自己的项目
- 验证:`project.userId === currentUser.id`
- 错误提示:"无权限操作该项目"
### 删除规则
**BR-P006: 级联删除**
- 规则:删除项目时,级联删除其所有对话和消息
- 实现数据库ON DELETE CASCADE
- 确认:前端需要二次确认
**BR-P007: 软删除(可选)**
- 规则重要项目可以先软删除保留30天
- 实现添加deleted_at字段
- 备注:当前版本暂不实现
---
## 智能体管理规则
### 智能体配置
**BR-A001: 智能体配置化管理**
- 规则:智能体配置存储在`config/agents.yaml`
- 规则:不通过数据库管理
- 规则:修改配置后需要重启服务
**BR-A002: 智能体状态**
- `active` - 可用,用户可以选择
- `inactive` - 不可用,隐藏
- `testing` - 测试中,仅管理员可见
**BR-A003: 智能体分类**
- 选题阶段:选题评价、科学问题梳理
- 研究设计PICOS构建、观察指标设计、CRF制定、样本量计算、临床研究方案撰写
- 论文阶段:论文润色、论文翻译、方法学评审、期刊方法学评审、期刊稿约评审
### Prompt管理
**BR-A004: Prompt文件管理**
- 规则Prompt存储在`backend/prompts/`目录
- 命名:`{agent_id}_system.txt``{agent_id}_user.txt`
- 版本通过Git管理版本
**BR-A005: Prompt变量注入**
- 规则Prompt中可以使用变量
- 格式:`{variable_name}`
- 示例:`{project_description}`, `{user_question}`
### 模型配置
**BR-A006: 模型参数配置**
- 规则:每个智能体可以配置不同模型的参数
- 参数:
- `temperature`: 0.0-1.0
- `max_tokens`: 最大输出token数
- `top_p`: 0.0-1.0
**BR-A007: 模型切换**
- 规则:用户可以在对话中切换模型
- 可选模型:
- `deepseek-v3` (默认)
- `qwen3-72b`
- `gemini-2.0-flash` (可选)
---
## 对话管理规则
### 创建对话
**BR-C001: 对话归属**
- 规则:对话可以属于项目,也可以是全局快速问答
- 项目对话:`projectId` 不为null
- 全局快速问答:`projectId` 为null
**BR-C002: 对话标题自动生成**
- 规则:首次创建对话时,标题为"与{智能体名称}的对话"
- 规则:可以手动修改标题
### 上下文管理
**BR-C003: 项目背景自动注入**
- 规则如果对话属于项目自动将项目description注入上下文
- 注入位置System prompt之后
- 格式:`# 项目背景\n{project.description}`
**BR-C004: 历史对话管理**
- 规则保留最近10轮对话作为上下文
- 规则超过10轮的对话进行摘要压缩
- Token限制上下文总token数不超过6000
**BR-C005: 知识库引用**
- 规则:用户可以通过`@知识库名称`引用知识库
- 规则最多同时引用3个知识库
- 检索数量每个知识库检索Top 5结果
### 消息固定
**BR-C006: 固定消息到项目背景**
- 规则只有AI回复可以被固定
- 规则:只有项目内对话可以固定(全局对话不可)
- 实现追加到project.description末尾
- 格式:
```
--- 来自对话的补充 ---
{message.content}
```
**BR-C007: 固定消息标记**
- 规则被固定的消息isPinned字段设为true
- 规则:固定后不可取消(简化实现)
### 流式输出
**BR-C008: Server-Sent Events**
- 规则使用SSE实现流式输出
- 事件类型:
- `start`: 开始生成
- `token`: 每个token
- `done`: 完成
- `error`: 错误
**BR-C009: 流式输出超时**
- 规则单个请求最长60秒
- 超时后:返回已生成的内容
- 错误提示:"生成超时,请重试"
---
## 知识库管理规则
### 数量限制
**BR-K001: 知识库数量限制**
- 规则每个用户最多创建3个知识库
- 验证时机:创建知识库时
- 错误提示:"已达到知识库数量上限3个"
**BR-K002: 文档数量限制**
- 规则每个知识库最多上传50个文档
- 验证时机:上传文档时
- 错误提示:"该知识库文档数量已达上限50个"
### 文档上传
**BR-K003: 文件格式限制**
- 规则只支持PDF和DOCX格式
- MIME类型
- `application/pdf`
- `application/vnd.openxmlformats-officedocument.wordprocessingml.document`
- 错误提示:"仅支持PDF和DOCX格式"
**BR-K004: 文件大小限制**
- 规则单个文件最大50MB
- 验证时机:上传前(前端)和上传后(后端)
- 错误提示:"文件大小超过限制最大50MB"
**BR-K005: 文件名唯一性**
- 规则:同一知识库内,文件名不能重复
- 验证:检查是否已存在同名文件
- 处理:自动重命名(添加时间戳)
### 文档处理
**BR-K006: 文档处理状态**
- 状态流转:
1. `uploading` - 上传中
2. `processing` - Dify处理中
3. `completed` - 处理完成
4. `failed` - 处理失败
**BR-K007: 处理失败重试**
- 规则:处理失败的文档不自动重试
- 规则:用户可以删除后重新上传
- 错误信息记录在error_message字段
**BR-K008: 异步处理**
- 规则:文档上传后立即返回
- 规则后台异步提交到Dify处理
- 规则:前端轮询获取处理状态
### 知识库检索
**BR-K009: 混合检索**
- 规则:使用关键词检索 + 语义检索
- 规则启用Reranking重排序
- Top K5个结果
- 相似度阈值0.5
**BR-K010: 检索结果引用**
- 规则AI回答必须注明引用来源
- 格式:`[文档名] 内容...`
- 规则:前端显示可点击的引用标记
---
## 权限控制规则
### 用户权限
**BR-P001: 角色定义**
- `user` - 普通用户
- 可以使用所有功能
- 受配额限制
- `admin` - 管理员
- 所有user权限
- 可以访问运营后台
- 可以查看所有用户数据
### 数据隔离
**BR-P002: 用户数据隔离**
- 规则:用户只能访问自己创建的数据
- 验证所有查询必须包含userId过滤
- 实现:
```sql
WHERE user_id = currentUser.id
```
**BR-P003: 项目权限验证**
- 规则:修改/删除项目前,验证所有权
- 实现:
```typescript
const project = await prisma.project.findFirst({
where: { id: projectId, userId: currentUser.id }
})
if (!project) throw new UnauthorizedError()
```
### 管理员权限
**BR-P004: 用户管理权限**
- 规则只有admin可以查看用户列表
- 规则只有admin可以修改用户状态
- 规则admin不能删除用户只能暂停
**BR-P005: 对话查看权限**
- 规则只有admin可以查看用户对话
- 规则:必须记录审计日志
- 规则:敏感信息需要脱敏(如邮箱、手机号)
---
## 配额限制规则
### 知识库配额
**BR-Q001: 知识库数量配额**
- 默认配额3个知识库
- 记录字段:`users.kb_quota`, `users.kb_used`
- 更新时机:创建/删除知识库时
**BR-Q002: 文档数量配额**
- 默认配额50个文档/知识库
- 检查时机:上传文档前
- 实现:
```sql
SELECT COUNT(*) FROM documents
WHERE kb_id = ? AND status != 'failed'
```
### 存储配额(预留)
**BR-Q003: 存储空间配额**
- 默认配额1GB/用户
- 当前版本:不强制限制
- 未来:可以根据实际需求启用
### API限流
**BR-Q004: API请求频率限制**
- 普通用户100次/分钟
- 管理员500次/分钟
- 实现使用Redis + 滑动窗口算法
**BR-Q005: 登录接口限流**
- 规则5次/分钟
- 规则IP和账户双重限制
- 超过后临时封禁15分钟
---
## 业务流程
### 完整的对话流程
```
1. 用户选择智能体
2. 创建对话(可选关联项目)
3. 用户发送消息(可选引用知识库)
4. 后端组装上下文:
- 项目背景(如有)
- 智能体System Prompt
- 历史对话最近10轮
- 知识库检索结果(如有)
- 当前用户问题
5. 调用LLM流式输出
6. 保存消息到数据库
7. 用户可选:固定消息到项目背景
```
### 知识库文档处理流程
```
1. 用户上传文档
2. 验证:
- 文件格式
- 文件大小
- 数量限制
3. 上传到对象存储OSS
4. 创建document记录status: uploading
5. 异步提交到Dify
- 调用Dify上传API
- 获取dify_document_id
6. 轮询处理状态每2秒
- processing → 更新progress
- completed → 更新status, segments_count, tokens_count
- failed → 更新status, error_message
7. 更新知识库统计:
- file_count
- total_size_bytes
```
---
## 数据一致性规则
### 统计字段更新
**BR-D001: 项目对话数统计**
- 字段:`projects.conversation_count`
- 更新时机:创建/删除对话时
- 实现:使用事务保证一致性
**BR-D002: 知识库文档数统计**
- 字段:`knowledge_bases.file_count`
- 更新时机文档状态变为completed或删除时
- 计算只统计status='completed'的文档
**BR-D003: 用户知识库数统计**
- 字段:`users.kb_used`
- 更新时机:创建/删除知识库时
- 验证创建前检查是否超过quota
### 级联删除
**BR-D004: 用户删除级联**
- 规则:删除用户时,级联删除所有关联数据
- 包括projects, conversations, messages, knowledge_bases, documents
- 实现数据库ON DELETE CASCADE
**BR-D005: 项目删除级联**
- 规则:删除项目时,级联删除所有对话和消息
- 实现数据库ON DELETE CASCADE
**BR-D006: 知识库删除级联**
- 规则:删除知识库时:
1. 级联删除数据库中的documents
2. 调用Dify API删除dataset
3. 删除对象存储中的文件
---
## 异常处理规则
### 错误类型
**BR-E001: 业务错误**
- 验证失败HTTP 422
- 资源不存在HTTP 404
- 权限不足HTTP 403
- 配额超限HTTP 403
**BR-E002: 系统错误**
- 数据库错误HTTP 500
- 网络错误HTTP 503
- Dify服务错误HTTP 503
### 错误响应
**BR-E003: 统一错误格式**
```json
{
"success": false,
"error": {
"code": "QUOTA_EXCEEDED",
"message": "知识库数量已达上限",
"details": {
"resource": "knowledge_base",
"quota": 3,
"used": 3
}
},
"timestamp": "2025-10-10T10:00:00.000Z"
}
```
---
## 安全规则
### 密码安全
**BR-S001: 密码加密**
- 算法bcrypt
- 成本因子12
- 规则:永不存储明文密码
**BR-S002: Token安全**
- 规则Token包含用户ID和角色
- 规则Token签名使用JWT_SECRET
- 规则过期Token自动失效
### SQL注入防护
**BR-S003: 使用ORM**
- 规则所有数据库操作使用Prisma ORM
- 规则禁止拼接SQL语句
- 规则:使用参数化查询
### XSS防护
**BR-S004: 输入转义**
- 规则:所有用户输入在显示前转义
- 规则使用React默认转义
- 规则禁止使用dangerouslySetInnerHTML除非必要
---
## 性能优化规则
### 缓存规则
**BR-O001: 智能体列表缓存**
- 规则智能体列表缓存1小时
- 实现Redis缓存
- 失效修改agents.yaml后需清除缓存
**BR-O002: 用户信息缓存**
- 规则用户信息缓存5分钟
- Key`user:{userId}`
- 失效:用户信息更新时
### 查询优化
**BR-O003: 分页查询**
- 规则:列表查询必须分页
- 默认20条/页
- 最大100条/页
**BR-O004: 索引使用**
- 规则:频繁查询的字段必须建立索引
- 包括email, userId, projectId, conversationId
- 定期:检查慢查询日志
---
## 数据保留规则
### 数据归档
**BR-R001: 对话归档(未来)**
- 规则超过6个月的对话自动归档
- 归档表conversations_archive
- 查询:默认不查询归档数据
**BR-R002: 日志清理**
- 规则admin_logs保留3个月
- 执行:定时任务每月清理
---
## 业务规则变更流程
1. **提出变更**:填写变更申请
2. **影响评估**:评估对系统的影响
3. **Review**技术团队Review
4. **更新文档**:同步更新本文档
5. **实施变更**:修改代码
6. **测试验证**:测试新规则
7. **上线发布**:发布到生产
---
**文档维护:** 业务规则变更需同步更新
**Review频率** 每个里程碑Review一次
**最后更新:** 2025-10-10
**维护者:** 产品经理 + 技术负责人