Files
AIclinicalresearch/docs/03-业务规则/核心业务规则总览.md
2025-10-10 15:14:54 +08:00

14 KiB
Raw Blame History

核心业务规则总览

版本: 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过滤
  • 实现:
    WHERE user_id = currentUser.id
    

BR-P003: 项目权限验证

  • 规则:修改/删除项目前,验证所有权
  • 实现:
    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个文档/知识库
  • 检查时机:上传文档前
  • 实现:
    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: 统一错误格式

{
  "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分钟
  • Keyuser:{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
维护者: 产品经理 + 技术负责人