Files
012-kaopeilian/docs/规划/全链路联调/Ai工作流/coze/陪练功能数据流程图.md
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

30 KiB
Raw Blame History

陪练功能数据流程图

一、总体流程概览

┌─────────────────────────────────────────────────────────────────┐
│                         考培练系统                               │
│                                                                 │
│  ┌────────────────┐              ┌────────────────┐            │
│  │  陪练中心入口   │              │  课程中心入口   │            │
│  │  (直接模式)    │              │  (课程模式)    │            │
│  └───────┬────────┘              └───────┬────────┘            │
│          │                                │                     │
│          │ 选择场景                        │ 提取场景            │
│          │                                │                     │
│          ▼                                ▼                     │
│  ┌────────────────────────────────────────────────────┐        │
│  │          陪练对话页面 (统一入口)                     │        │
│  │       - 实时SSE对话                                 │        │
│  │       - 消息展示                                    │        │
│  │       - 对话控制                                    │        │
│  └────────────────────────────────────────────────────┘        │
└─────────────────────────────────────────────────────────────────┘

二、陪练中心入口流程(直接模式)

2.1 场景选择流程

┌──────┐
│ 学员  │
└───┬──┘
    │
    │ 1. 访问陪练中心
    ▼
┌─────────────────────────┐
│  陪练中心页面             │
│  /trainee/ai-practice-center │
└───────┬─────────────────┘
        │
        │ 2. 获取场景列表
        ▼
    ┌───────────────────────────┐
    │ GET /api/v1/practice/scenes│
    │ 参数:筛选条件、分页        │
    └───────┬───────────────────┘
            │
            │ 3. 查询数据库
            ▼
    ┌──────────────────────┐
    │ MySQL: practice_scenes│
    │ WHERE status='active' │
    │   AND is_deleted=false│
    └───────┬──────────────┘
            │
            │ 4. 返回场景列表
            ▼
    ┌──────────────────────┐
    │ 场景卡片展示          │
    │ - 名称、描述          │
    │ - 类型、难度标签      │
    │ - 统计信息           │
    └───────┬──────────────┘
            │
            │ 5. 点击"开始陪练"
            ▼
    ┌──────────────────────┐
    │ 跳转到对话页面        │
    │ 携带场景参数          │
    └──────────────────────┘

2.2 对话流程

┌──────┐
│ 学员  │
└───┬──┘
    │
    │ 1. 进入对话页面
    ▼
┌───────────────────────────┐
│ 陪练对话页面               │
│ /trainee/ai-practice       │
│ query: sceneId, mode=direct│
└───────┬───────────────────┘
        │
        │ 2. 加载场景详情
        ▼
    ┌─────────────────────────────┐
    │ GET /api/v1/practice/scenes/1│
    └───────┬─────────────────────┘
            │
            │ 3. 返回场景完整信息
            │   (background, ai_role, objectives)
            ▼
    ┌──────────────────────┐
    │ 显示场景背景和目标    │
    └───────┬──────────────┘
            │
            │ 4. 用户输入第一条消息
            ▼
    ┌────────────────────────────┐
    │ POST /api/v1/practice/start│
    │ 请求体:                    │
    │ - scene_id: 1             │
    │ - scene_name              │
    │ - scene_description       │
    │ - scene_background        │
    │ - scene_ai_role           │
    │ - scene_objectives        │
    │ - scene_keywords          │
    │ - user_message            │
    │ - is_first: true          │
    └───────┬───────────────────┘
            │
            │ 5. ⚠️ 后端构建完整场景提示词
            │    (关键步骤)
            ▼
    ┌──────────────────────────────┐
    │ 构建Markdown格式场景文本    │
    │ # 陪练场景设定                │
    │ ## 场景名称                   │
    │ 初次电话拜访客户              │
    │ ## 场景背景                   │
    │ 你是一名销售专员...           │
    │ ## AI角色要求                 │
    │ AI扮演一位忙碌的采购经理...   │
    │ ## 练习目标                   │
    │ 1. 学会专业的电话开场白       │
    │ 2. 快速建立信任关系           │
    │ ---                          │
    │ 现在开始陪练对话...           │
    │ 学员的第一句话:您好...       │
    └───────┬──────────────────────┘
            │
            │ 6. 发送完整提示词给Coze
            ▼
    ┌──────────────────────────┐
    │ Python FastAPI后端        │
    │ coze_service.py          │
    └───────┬─────────────────┘
            │
            │ 7. 调用Coze API发送场景提示词
            ▼
    ┌─────────────────────────────┐
    │ Coze Chat API (流式)         │
    │ https://api.coze.cn         │
    │ Bot ID: 7560643598174683145 │
    │                             │
    │ Message.build_user_question_text(│
    │   完整的场景提示词 Markdown  │
    │ )                           │
    └───────┬─────────────────────┘
            │
            │ 8. Coze AI理解场景并生成回复
            │    (AI根据场景扮演角色)
            ▼
    ┌──────────────────────────┐
    │ AI推理生成对话内容        │
    │ - 理解场景背景           │
    │ - 扮演指定角色           │
    │ - 符合难度设定           │
    └───────┬─────────────────┘
            │
            │ 9. SSE流式返回
            ▼
    ┌──────────────────────────┐
    │ SSE事件流                 │
    │ event: message.delta     │
    │ data: {"content":"您"}   │
    │                          │
    │ event: message.delta     │
    │ data: {"content":"好"}   │
    │                          │
    │ event: message.completed │
    │ event: done              │
    └───────┬─────────────────┘
            │
            │ 10. 前端实时显示
            ▼
    ┌──────────────────────┐
    │ AI消息打字效果展示    │
    │ (AI已理解场景角色)   │
    └───────┬──────────────┘
            │
            │ 11. 用户继续对话(后续消息)
            ▼
    ┌────────────────────────────┐
    │ POST /api/v1/practice/start│
    │ 请求体:                    │
    │ - user_message            │
    │ - conversation_id         │
    │ - is_first: false         │
    │ (⚠️不再包含场景信息)       │
    └───────┬───────────────────┘
            │
            │ 12. 直接发送用户消息
            │    (重复步骤7-11)
            ▼
    ┌──────────────────────┐
    │ 多轮对话交互          │
    │ 使用conversation_id   │
    │ 保持对话上下文        │
    │ AI持续扮演角色        │
    └──────────────────────┘

三、课程中心入口流程(课程模式)

3.1 场景提取流程

┌──────┐
│ 学员  │
└───┬──┘
    │
    │ 1. 访问课程中心
    ▼
┌─────────────────────────┐
│ 课程中心页面              │
│ /trainee/course-center   │
└───────┬─────────────────┘
        │
        │ 2. 点击课程卡片"陪练"按钮
        ▼
    ┌───────────────────────────────┐
    │ POST /api/v1/practice/extract-scene│
    │ 请求体:                           │
    │ { "course_id": 5 }                │
    └───────┬───────────────────────────┘
            │
            │ 3. 调用Dify工作流
            ▼
    ┌──────────────────────────────────┐
    │ Dify API (流式)                   │
    │ POST /v1/workflows/run            │
    │ URL: dify.ireborn.com.cn          │
    │ API Key: app-rYP6LNM4iPmNjIHns... │
    │ Workflow ID: 待确认                │
    └───────┬──────────────────────────┘
            │
            │ 4. Dify从数据库获取课程信息
            ▼
    ┌──────────────────────────┐
    │ MySQL: courses           │
    │ - 课程名称               │
    │ - 课程描述               │
    │ - 关联的知识点           │
    │ - 学习资料               │
    └───────┬─────────────────┘
            │
            │ 5. Dify AI分析生成场景
            │   (大模型推理)
            ▼
    ┌──────────────────────────┐
    │ Dify SSE事件流            │
    │ event: workflow_started  │
    │ event: text_chunk        │
    │ event: workflow_finished │
    └───────┬─────────────────┘
            │
            │ 6. 后端消费SSE聚合结果
            ▼
    ┌──────────────────────────┐
    │ 解析场景JSON数据          │
    │ {                        │
    │   name: "场景名称",       │
    │   description: "...",    │
    │   background: "...",     │
    │   ai_role: "...",        │
    │   objectives: [...],     │
    │   keywords: [...]        │
    │ }                        │
    └───────┬─────────────────┘
            │
            │ 7. 返回场景数据给前端
            ▼
    ┌──────────────────────────┐
    │ 前端接收场景数据          │
    └───────┬─────────────────┘
            │
            │ 8. 跳转到对话页面
            ▼
    ┌──────────────────────────┐
    │ /trainee/ai-practice     │
    │ query:                   │
    │ - mode=course            │
    │ - courseId=5             │
    │ - sceneData=JSON.stringify(scene)│
    └──────────────────────────┘

3.2 课程模式对话流程

课程模式的对话流程与直接模式基本相同,区别在于:

  1. 场景数据来自URL参数Dify生成而非数据库查询
  2. 首次消息会带上课程上下文信息
┌──────┐
│ 学员  │
└───┬──┘
    │
    │ 1. 从URL解析场景数据
    ▼
┌──────────────────────────┐
│ const sceneData =        │
│   JSON.parse(            │
│     route.query.sceneData│
│   )                      │
└───────┬─────────────────┘
        │
        │ 2. 显示Dify生成的场景
        ▼
    ┌──────────────────────┐
    │ 场景背景和目标展示    │
    │ (来自Dify)           │
    └───────┬──────────────┘
            │
            │ 3-9. 对话流程
            │ (同直接模式)
            ▼
    ┌──────────────────────┐
    │ SSE流式对话交互       │
    └──────────────────────┘

四、场景管理流程Manager

4.1 创建场景流程

┌──────┐
│管理员 │
└───┬──┘
    │
    │ 1. 访问场景管理页面
    ▼
┌────────────────────────────────┐
│ 场景管理页面                    │
│ /manager/practice-scene-management│
└───────┬────────────────────────┘
        │
        │ 2. 点击"新增场景"
        ▼
    ┌──────────────────────┐
    │ 打开创建场景表单      │
    │ - 场景名称           │
    │ - 场景描述           │
    │ - 类型、难度         │
    │ - 场景背景           │
    │ - AI角色描述         │
    │ - 练习目标(数组)     │
    │ - 关键词(数组)       │
    └───────┬──────────────┘
            │
            │ 3. 填写并提交表单
            ▼
    ┌──────────────────────────────┐
    │ POST /api/v1/manager/practice-scenes│
    │ 请求体CreateSceneRequest    │
    └───────┬──────────────────────┘
            │
            │ 4. 后端验证数据
            ▼
    ┌──────────────────────┐
    │ 字段验证:            │
    │ - 必填字段检查        │
    │ - 长度限制           │
    │ - 类型枚举验证       │
    │ - 名称唯一性         │
    └───────┬──────────────┘
            │
            │ 5. 写入数据库
            ▼
    ┌──────────────────────┐
    │ INSERT INTO          │
    │ practice_scenes      │
    │ VALUES (...)         │
    └───────┬──────────────┘
            │
            │ 6. 返回创建的场景
            ▼
    ┌──────────────────────┐
    │ 前端刷新列表          │
    │ 提示创建成功          │
    └──────────────────────┘

4.2 场景列表查询流程

┌──────┐
│管理员 │
└───┬──┘
    │
    │ 1. 访问场景管理页面
    ▼
┌────────────────────────────────┐
│ GET /api/v1/manager/practice-scenes│
│ 参数:                          │
│ - page, size (分页)             │
│ - type, difficulty (筛选)      │
│ - search (关键词)               │
└───────┬────────────────────────┘
        │
        │ 2. 构建查询条件
        ▼
    ┌──────────────────────────┐
    │ SELECT * FROM            │
    │ practice_scenes          │
    │ WHERE is_deleted = false │
    │   AND type = ?           │
    │   AND difficulty = ?     │
    │   AND name LIKE ?        │
    │ ORDER BY created_at DESC │
    │ LIMIT ? OFFSET ?         │
    └───────┬─────────────────┘
            │
            │ 3. 返回分页数据
            ▼
    ┌──────────────────────────┐
    │ {                        │
    │   items: [...],          │
    │   total: 15,             │
    │   page: 1,               │
    │   page_size: 20          │
    │ }                        │
    └───────┬─────────────────┘
            │
            │ 4. 前端渲染列表
            ▼
    ┌──────────────────────────┐
    │ 场景列表展示              │
    │ - 筛选器                 │
    │ - 场景卡片               │
    │ - 分页器                 │
    │ - 操作按钮               │
    └──────────────────────────┘

五、SSE流式通信详细流程

5.1 SSE连接建立

┌────────┐                 ┌────────┐                 ┌──────────┐
│ 前端    │                 │ 后端    │                 │ Coze API │
└───┬────┘                 └───┬────┘                 └─────┬────┘
    │                          │                            │
    │ 1. fetch POST /practice/start                        │
    ├─────────────────────────>│                            │
    │                          │                            │
    │                          │ 2. 构建场景上下文           │
    │                          │    (background + ai_role)  │
    │                          │                            │
    │                          │ 3. coze.chat.stream()      │
    │                          ├───────────────────────────>│
    │                          │                            │
    │                          │                            │ 4. 开始流式处理
    │                          │<───────────────────────────┤
    │                          │ event: conversation.chat.created
    │<─────────────────────────┤                            │
    │ 5. 设置conversation_id   │                            │
    │                          │                            │
    │                          │<───────────────────────────┤
    │<─────────────────────────┤ event: message.delta       │
    │ 6. 追加内容: "您"         │ data: {"content":"您"}     │
    │                          │                            │
    │                          │<───────────────────────────┤
    │<─────────────────────────┤ event: message.delta       │
    │ 7. 追加内容: "好"         │ data: {"content":"好"}     │
    │                          │                            │
    │                          │<───────────────────────────┤
    │<─────────────────────────┤ event: message.delta       │
    │ 8. 追加内容: ""         │ data: {"content":""}     │
    │                          │                            │
    │        ... (持续接收增量) ...                          │
    │                          │                            │
    │                          │<───────────────────────────┤
    │<─────────────────────────┤ event: message.completed   │
    │ 9. 消息完成标记           │                            │
    │                          │                            │
    │                          │<───────────────────────────┤
    │<─────────────────────────┤ event: conversation.completed│
    │ 10. 对话完成              │ data: {"token_count":156}  │
    │                          │                            │
    │<─────────────────────────┤                            │
    │ event: done              │                            │
    │ 11. 关闭SSE连接           │                            │
    │                          │                            │

5.2 SSE错误处理流程

┌────────┐                 ┌────────┐                 ┌──────────┐
│ 前端    │                 │ 后端    │                 │ Coze API │
└───┬────┘                 └───┬────┘                 └─────┬────┘
    │                          │                            │
    │ 1. SSE连接正常            │                            │
    │                          │                            │
    │                          │                            │ 2. 网络错误
    │                          │<───────────────────────────┤
    │                          │ Exception: Network Error   │
    │                          │                            │
    │                          │ 3. 捕获异常                │
    │<─────────────────────────┤                            │
    │ event: error             │                            │
    │ data: {"error":"..."}    │                            │
    │                          │                            │
    │ 4. 前端显示错误提示       │                            │
    │    ElMessage.error(...)  │                            │
    │                          │                            │
    │ 5. 关闭SSE连接            │                            │
    │                          │                            │

六、数据流转汇总

6.1 数据流向图

┌─────────────────────────────────────────────────────────────────┐
│                        数据流向总览                              │
└─────────────────────────────────────────────────────────────────┘

用户输入
  │
  ▼
前端Vue页面
  │
  ├─ 陪练中心: 从MySQL读取场景 ────> practice_scenes表
  │                                   │
  │                                   ▼
  └─ 课程中心: Dify提取场景 ────> courses表 + knowledge_points表
                                      │
                                      ▼
                                  Dify工作流分析
                                      │
                                      ▼
                                  生成场景JSON
  
  场景数据
  │
  ▼
前端对话页面
  │
  │ 用户消息 + 场景上下文
  ▼
后端FastAPI
  │
  │ 构建完整Prompt
  ▼
Coze Chat API
  │
  │ AI推理
  ▼
SSE流式响应
  │
  ├─ message.delta (增量)
  ├─ message.completed (完成)
  └─ conversation.completed (结束)
  │
  ▼
前端实时展示
  │
  └─ 对话历史由Coze管理不存MySQL

6.2 核心数据对象流转

1. 场景数据 (PracticeScene)
   MySQL practice_scenes表
   ↓
   Python Model (SQLAlchemy)
   ↓
   Pydantic Schema
   ↓
   JSON Response
   ↓
   TypeScript Interface
   ↓
   Vue Reactive Data

2. 对话消息 (Message)
   用户输入 (Frontend)
   ↓
   HTTP Request Body
   ↓
   Python Request Model
   ↓
   Coze Message Object
   ↓
   Coze API Request
   ↓
   AI Response (SSE Stream)
   ↓
   Frontend Message Array

3. Dify场景 (ExtractedScene)
   Course Data (MySQL)
   ↓
   Dify Workflow Input
   ↓
   AI Analysis
   ↓
   Workflow Output (JSON)
   ↓
   Python Response Model
   ↓
   Frontend Scene Object

七、关键时序说明

7.1 用户完整陪练流程时序

时刻T0: 用户访问陪练中心
       ↓ (立即)
时刻T1: 加载场景列表 (MySQL查询 ~100ms)
       ↓ (用户浏览场景 ~30s)
时刻T2: 用户选择场景
       ↓ (立即)
时刻T3: 跳转到对话页面
       ↓ (立即)
时刻T4: 加载场景详情 (MySQL查询 ~100ms)
       ↓ (用户阅读背景 ~20s)
时刻T5: 用户输入第一条消息
       ↓ (立即)
时刻T6: 发送SSE请求到后端 (网络延迟 ~50ms)
       ↓
时刻T7: 后端调用Coze API (网络延迟 ~100ms)
       ↓
时刻T8: 开始接收AI响应流 (首字节延迟 ~500ms)
       ↓ (流式传输 ~2-5s)
时刻T9: AI回复完成
       ↓ (用户阅读 ~10s)
时刻T10: 用户继续输入下一条消息
       ↓ (重复T5-T10)

7.2 Dify场景提取时序

时刻T0: 用户点击课程"陪练"按钮
       ↓ (立即)
时刻T1: 前端显示"提取场景中..."
       ↓ (立即)
时刻T2: 发送HTTP请求到后端 (网络延迟 ~50ms)
       ↓
时刻T3: 后端调用Dify工作流 (网络延迟 ~100ms)
       ↓
时刻T4: Dify查询数据库 (MySQL ~200ms)
       ↓
时刻T5: Dify AI分析推理 (大模型 ~10-30s)
       ↓
时刻T6: 后端接收完整场景数据
       ↓ (立即)
时刻T7: 返回给前端 (网络延迟 ~50ms)
       ↓ (立即)
时刻T8: 跳转到对话页面

八、异常流程处理

8.1 网络异常流程

正常流程
  │
  ▼
发送SSE请求
  │
  ├─ 成功 ──> 接收流式数据
  │
  └─ 失败 ──> catch Error
                │
                ▼
              判断错误类型
                │
                ├─ NetworkError ──> 提示"网络错误,请检查连接"
                │                    └─> 提供重试按钮
                │
                ├─ TimeoutError ──> 提示"请求超时,请稍后重试"
                │                    └─> 自动重试(最多3次)
                │
                └─ ServerError ──> 提示"服务器错误,请联系管理员"
                                    └─> 记录错误日志

8.2 Coze API异常流程

后端调用Coze
  │
  ▼
coze.chat.stream()
  │
  ├─ 成功 ──> 正常SSE流
  │
  └─ 失败 ──> catch CozePyError
                │
                ▼
              判断错误
                │
                ├─ Token过期 ──> 刷新Token + 重试
                │
                ├─ 余额不足 ──> 通知管理员 + 提示用户稍后重试
                │
                ├─ Bot不存在 ──> 检查Bot配置 + 使用备用Bot
                │
                └─ API限流 ──> 等待重试 + 记录日志

九、性能优化要点

9.1 数据库查询优化

场景列表查询
  │
  ├─ 使用索引: idx_type, idx_difficulty, idx_status
  ├─ 分页限制: LIMIT + OFFSET
  ├─ 只查必要字段: SELECT id, name, description, type...
  └─ 缓存热门场景 (可选)

9.2 SSE连接优化

SSE流式传输
  │
  ├─ 使用HTTP/2 (多路复用)
  ├─ 合理设置超时: 180秒
  ├─ 心跳保活: ping event
  └─ 断线重连: 保存conversation_id

9.3 前端渲染优化

消息列表展示
  │
  ├─ 虚拟滚动 (消息数 > 100)
  ├─ 防抖输入: debounce 300ms
  ├─ 消息缓存: localStorage
  └─ 懒加载历史消息

文档版本v1.0 最后更新2025-10-13 维护人:考培练系统开发团队