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

761 lines
30 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.
# 陪练功能数据流程图
## 一、总体流程概览
```
┌─────────────────────────────────────────────────────────────────┐
│ 考培练系统 │
│ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ 陪练中心入口 │ │ 课程中心入口 │ │
│ │ (直接模式) │ │ (课程模式) │ │
│ └───────┬────────┘ └───────┬────────┘ │
│ │ │ │
│ │ 选择场景 │ 提取场景 │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ 陪练对话页面 (统一入口) │ │
│ │ - 实时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
**维护人**:考培练系统开发团队