数据模块 — 功能设计与页面规划
一、数据在 AI SaaS 中的角色
数据是模型的"燃料"。平台上所有涉及数据的场景:
1. 微调训练: 用户上传对话数据 → 训练专属模型
2. 评估测试: 用户上传测试集 → 评估模型效果
3. 批量推理: 用户上传待处理数据 → 批量跑模型 → 下载结果
4. RAG 知识库: 用户上传文档 → 向量化 → 检索增强生成
5. 数据标注: 用户标注数据 → 提升模型质量(高级功能)
二、功能清单
2.1 数据集管理(核心)
| 功能 |
说明 |
优先级 |
| 上传数据集 |
支持 JSONL/CSV/JSON/TXT/Parquet |
P0 |
| 格式自动识别 |
上传后自动检测文件格式和编码 |
P0 |
| 数据校验 |
格式校验、字段完整性、Token 长度检查 |
P0 |
| 数据预览 |
表格/JSON 形式展示前 N 条 |
P0 |
| 数据统计 |
条数、Token 分布、字段统计、数据质量评分 |
P0 |
| 版本管理 |
同一数据集多版本,支持回溯 |
P1 |
| 数据分割 |
自动拆分训练集/验证集/测试集 |
P1 |
| 数据增强 |
同义改写、翻译扩充(调用自身模型) |
P2 |
| 数据脱敏 |
自动识别并遮蔽手机号/身份证/姓名 |
P2 |
| 数据导出 |
下载原始数据或处理后数据 |
P1 |
| 批量删除 |
选中多个数据集批量操作 |
P1 |
| 存储配额 |
按套餐限制存储空间,超额提醒 |
P0 |
2.2 数据格式支持
微调数据格式(对话式)
{"messages":[
{"role":"system","content":"你是一个专业的客服助手"},
{"role":"user","content":"我想退货"},
{"role":"assistant","content":"好的,请提供您的订单号,我来帮您处理退货。退货流程如下:\n1. 确认订单信息\n2. 提交退货申请\n3. 寄回商品\n4. 退款到账(3-5个工作日)"}
]}
{"messages":[
{"role":"user","content":"发票怎么开"},
{"role":"assistant","content":"开票步骤:\n1. 登录账户\n2. 进入「订单管理」\n3. 点击「申请发票」\n4. 填写开票信息\n5. 提交后 1-3 个工作日出票"}
]}
微调数据格式(补全式)
{:,:}
{:,:}
评估数据格式
{"input":"用户问题","expected_output":"期望答案","tags":["category1"]}
批量推理数据格式
{"id":"req-001","messages":[{"role":"user","content":"总结以下文章:..."}]}
{"id":"req-002","messages":[{"role":"user","content":"翻译:..."}]}
RAG 知识库格式
支持:
- PDF → 自动解析提取文本
- Word (.docx) → 提取文本
- Markdown → 直接使用
- TXT → 直接使用
- 网页 URL → 爬取内容
2.3 数据处理能力
| 能力 |
输入 |
输出 |
场景 |
| Token 统计 |
原始文本 |
每条数据的 Token 数分布 |
评估训练成本 |
| 去重 |
完整数据集 |
去除重复/近似重复条目 |
提升数据质量 |
| 过滤 |
数据集 + 规则 |
满足条件的子集 |
Token 过长的去掉 |
| 采样 |
大数据集 |
随机/分层采样子集 |
快速验证 |
| 格式转换 |
CSV/JSON |
JSONL(微调格式) |
适配训练需求 |
| 数据分割 |
完整集 |
train/val/test |
训练前准备 |
| 质量评分 |
数据集 |
质量报告 |
识别低质量样本 |
2.4 知识库管理(RAG)
| 功能 |
说明 |
优先级 |
| 创建知识库 |
命名 + 选择 Embedding 模型 |
P1 |
| 上传文档 |
PDF/Word/MD/TXT,自动分块 |
P1 |
| 分块策略配置 |
chunk_size, overlap, 分隔符 |
P1 |
| 向量化 |
调用 Embedding 模型生成向量 |
P1 |
| 检索测试 |
输入问题 → 返回相关文档片段 |
P1 |
| 知识库关联模型 |
指定哪个模型使用哪个知识库 |
P1 |
| 文档管理 |
增删改文档,自动重新向量化 |
P1 |
| 向量数据库 |
Milvus / Qdrant / pgvector |
P1 |
三、页面设计
3.1 页面总览(数据相关)
控制台首页 (Dashboard)
│
├── 数据集管理
│ ├── 数据集列表页
│ ├── 上传数据集页
│ ├── 数据集详情页
│ │ ├── 数据预览 Tab
│ │ ├── 数据统计 Tab
│ │ ├── 数据校验 Tab
│ │ └── 版本历史 Tab
│ └── 数据处理页(去重/过滤/分割)
│
├── 知识库管理
│ ├── 知识库列表页
│ ├── 创建知识库页
│ ├── 知识库详情页
│ │ ├── 文档列表 Tab
│ │ ├── 检索测试 Tab
│ │ └── 配置 Tab
│ └── 上传文档页
│
├── 批量任务
│ ├── 批量推理列表页
│ ├── 创建批量任务页
│ └── 任务详情页(进度+结果下载)
│
└── 微调训练(数据部分)
├── 选择数据集步骤
└── 数据预检报告
3.2 数据集列表页
┌──────────────────────────────────────────────────────────────┐
│ 数据集管理 │
├──────────────────────────────────────────────────────────────┤
│ 搜索: 格式: 用途: │
├──────────────────────────────────────────────────────────────┤
│ │
│ ☐ 名称 格式 条数 大小 用途 创建时间 │
│ ─────────────────────────────────────────────────────────────│
│ ☐ customer-service JSONL 12,450 3.2MB 微调 04-09 │
│ └─ v2 (最新) │ v1 │
│ ☐ product-qa JSONL 5,230 1.1MB 微调 04-08 │
│ ☐ sentiment-test CSV 2,000 0.5MB 评估 04-07 │
│ ☐ articles-batch JSONL 50,000 15MB 批量 04-06 │
│ │
│ 已使用 19.8MB / 5GB 配额 │
│ │
│ 选中 0 项 第1/2页 > │
└──────────────────────────────────────────────────────────────┘
交互说明:
- 点击数据集名称 → 进入详情页
- 版本标签可展开切换
- 支持批量选择操作
- 存储配额可视化进度条
- 搜索支持名称/描述模糊匹配
3.3 上传数据集页
┌──────────────────────────────────────────────────────────────┐
│ 上传数据集 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 数据集名称: [customer-service-v2________] │
│ 描述: [客服对话数据,含退货退款场景__] │
│ 用途: ○ 微调训练 ○ 评估测试 ○ 批量推理 ○ 知识库 │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 拖拽文件到此处,或 [点击上传] │ │
│ │ │ │
│ │ 支持格式: JSONL, CSV, JSON, TXT, Parquet │ │
│ │ 单文件最大: 500MB │ │
│ │ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ── 或者从 URL 导入 ── │
│ URL: [https://example.com/data.jsonl____] [导入] │
│ │
│ ── 或者从已有数据集创建新版本 ── │
│ 基于: [customer-service v1 ▼] [创建新版本] │
│ │
├──────────────────────────────────────────────────────────────┤
│ 上传中... customer-service-v2.jsonl 3.2MB │
│ [████████████████████░░░░] 78
│ │
│ ✓ 格式检测: JSONL (对话格式) │
│ ✓ 编码: UTF-8 │
│ ⟳ 校验中... │
│ │
│ [取消] [确认上传] │
└──────────────────────────────────────────────────────────────┘
3.4 数据集详情页 — 数据预览 Tab
┌──────────────────────────────────────────────────────────────┐
│ ← 返回 customer-service v2 [下载] [删除] │
├──────────────────────────────────────────────────────────────┤
│ [数据预览] [数据统计] [校验报告] [版本历史] │
├──────────────────────────────────────────────────────────────┤
│ │
│ 格式: JSONL (对话式微调) 条数: 12,450 大小: 3.2MB │
│ 创建: 2026-04-09 15:30 更新: 2026-04-09 15:30 │
│ │
│ ── 数据预览 (前 10 条 / 共 12,450 条) ── │
│ │
│
│ ┌──────────────────────────────────────────────────────┐ │
│ │ System: 你是一个专业的客服助手 │ │
│ │ ─────────────────────────────────────────────────────│ │
│ │ User: 我想退货 │ │
│ │ ─────────────────────────────────────────────────────│ │
│ │ Assistant: 好的,请提供您的订单号,我来帮您处理退货。 │ │
│ │ 退货流程如下: │ │
│ │ 1. 确认订单信息 │ │
│ │ 2. 提交退货申请 ... │ │
│ │ Tokens: 128 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│
│ ┌──────────────────────────────────────────────────────┐ │
│ │ User: 发票怎么开 │ │
│ │ ─────────────────────────────────────────────────────│ │
│ │ Assistant: 开票步骤:... │ │
│ │ Tokens: 95 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ... 展示更多 第 1/1245 页 > >> │
└──────────────────────────────────────────────────────────────┘
3.5 数据集详情页 — 数据统计 Tab
┌──────────────────────────────────────────────────────────────┐
│ [数据预览] [数据统计] [校验报告] [版本历史] │
├──────────────────────────────────────────────────────────────┤
│ │
│ ── 基本统计 ── │
│ │
│ 总条数: 12,450 │
│ 总 Token 数: 1,532,800 │
│ 平均 Token/条: 123 │
│ 最短: 12 tokens │
│ 最长: 2,048 tokens │
│ 预估训练费用: ¥15.3 (基于 Qwen2.5-7B LoRA) │
│ │
│ ── Token 长度分布 ── │
│ │
│ 2000+ │ ▓ 2
│ 1000 │ ▓▓▓▓▓ 8
│ 500 │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 22
│ 200 │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 45
│ 100 │ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ 18
│ 50 │ ▓▓▓▓▓ 5
│ └────────────────────────────────────────── │
│ │
│ ── 角色分布 ── │
│ │
│ system: 8,200 条 (65.9
│ user: 12,450 条 (100
│ assistant: 12,450 条 (100
│ 多轮对话: 3,120 条 (25.1
│ │
│ ── 内容分析 ── │
│ │
│ 高频话题: │
│ 退货退款 3,200 条 25.7
│ 物流查询 2,800 条 22.5
│ 开票问题 2,100 条 16.9
│ 账户问题 1,850 条 14.9
│ 产品咨询 1,500 条 12.0
│ 其他 1,000 条 8.0
│ │
│ 语言: 中文 98.2
└──────────────────────────────────────────────────────────────┘
3.6 数据集详情页 — 校验报告 Tab
┌──────────────────────────────────────────────────────────────┐
│ [数据预览] [数据统计] [校验报告] [版本历史] │
├──────────────────────────────────────────────────────────────┤
│ │
│ 数据质量评分: 87/100 🟢 良好 │
│ │
│ ── 通过的检查 ── │
│ ✅ 格式正确: 所有行均为合法 JSON │
│ ✅ 必要字段: messages 字段存在 │
│ ✅ 角色合法: 所有 role 为 system/user/assistant │
│ ✅ 非空检查: 无空 content │
│ ✅ 编码正确: UTF-8 无乱码 │
│ │
│ ── 警告 ── │
│ ⚠️ 23 条数据 Token 超过 2048 (可能被截断) [查看] │
│ ⚠️ 156 条数据疑似重复 (相似度 > 95
│ ⚠️ 12 条数据 assistant 回复过短 (< 10 Token) [查看] │
│ │
│ ── 错误 (需要修复) ── │
│ ❌ 第 3,247 行: messages 不是数组 [定位] │
│ ❌ 第 8,901 行: content 含非法字符 \x00 [定位] │
│ │
│ ── 建议 ── │
│ 💡 去除 156 条重复数据可提升训练效果 │
│ 💡 23 条超长数据建议截断或拆分为多轮对话 │
│ 💡 建议补充更多"其他"类别数据,当前占比仅 8
│ │
│ [自动修复可修复项] [导出报告] │
└──────────────────────────────────────────────────────────────┘
3.7 数据处理页
┌──────────────────────────────────────────────────────────────┐
│ 数据处理 ← customer-service v2 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 选择处理操作: │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 🔄 去重 │ │ 🔍 过滤 │ │ ✂️ 分割 │ │ 📊 采样 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 🔄 格式 │ │ 🔒 脱敏 │ │ ➕ 增强 │ │
│ │ 转换 │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ═══════════════════════════════════════════════════════════ │
│ │
│ 去重配置: │
│ 相似度阈值: [0.95____] (0-1,越高越严格) │
│ 比较字段: ☑ user content ☑ assistant content │
│ 策略: ○ 保留第一条 ● 保留最长条 │
│ │
│ 预览结果: │
│ 原始: 12,450 条 │
│ 去重后: 12,294 条 (移除 156 条) │
│ [查看将被移除的数据] │
│ │
│ [取消] [保存为新版本 v3] │
└──────────────────────────────────────────────────────────────┘
3.8 知识库列表页
┌──────────────────────────────────────────────────────────────┐
│ 知识库管理 [+ 创建知识库] │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────┐ │
│ │ 📚 产品帮助文档 │ │
│ │ Embedding: text-embedding-3-small │ │
│ │ 文档: 45 篇 │ 向量: 1,230 chunks │ │
│ │ 最近更新: 2 小时前 │ │
│ │ 关联模型: qwen2.5-7b │ │
│ │ [管理] [测试] │ │
│ └─────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ 📚 内部规章制度 │ │
│ │ Embedding: bge-m3 │ │
│ │ 文档: 12 篇 │ 向量: 380 chunks │ │
│ │ 最近更新: 3 天前 │ │
│ │ 关联模型: company-cs-v1 (微调) │ │
│ │ [管理] [测试] │ │
│ └─────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
3.9 知识库检索测试页
┌──────────────────────────────────────────────────────────────┐
│ 检索测试 — 产品帮助文档 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 输入问题: [如何退换货?_____________________________] [检索] │
│ │
│ 返回 Top 3 相关文档片段: │
│ │
│ #1 相似度: 0.92 来源: 售后政策.pdf (第3页) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 退换货政策:自签收之日起 7 天内,商品未拆封可无理由 │ │
│ │ 退换。拆封后如存在质量问题,15 天内可申请换货。退货 │ │
│ │ 运费由平台承担(质量问题)或消费者承担(无理由退货)。 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ #2 相似度: 0.85 来源: FAQ.md (退换货章节) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Q: 退货流程是什么? │ │
│ │ A: 1. 在订单页面点击"申请退货" 2. 选择退货原因 │ │
│ │ 3. 等待审核(1个工作日)4. 寄回商品 ... │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ #3 相似度: 0.78 来源: 物流说明.docx │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 退货包裹请寄至:XX市XX区XX路XX号 退货仓库 │ │
│ │ 联系电话:400-XXX-XXXX │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ── 模型回答预览 (结合检索结果) ── │
│ │
│ 根据产品帮助文档,退换货流程如下: │
│ 1. 在订单页面点击"申请退货" │
│ 2. 选择退货原因 │
│ 3. 等待审核(1个工作日) │
│ ... │
│ │
│ 配置: Top-K [3] 相似度阈值 [0.7] Chunk大小 [512] │
└──────────────────────────────────────────────────────────────┘
3.10 批量推理任务页
┌──────────────────────────────────────────────────────────────┐
│ 创建批量任务 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 任务名称: [产品描述批量翻译___________] │
│ 模型: [qwen2.5-7b ▼] │
│ 数据集: [articles-batch (50,000条) ▼] │
│ │
│ 系统提示词: │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 你是一个专业的翻译助手。将用户给出的中文翻译成英文, │ │
│ │ 保持原文风格和专业术语准确。 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 参数: │
│ max_tokens: [512___] │
│ temperature: [0.3___] │
│ 并发数: [10____] │
│ │
│ 预估: │
│ 输入 Token: ~5,000,000 │
│ 输出 Token: ~3,000,000 │
│ 预估费用: ¥34.00 │
│ 预估时间: ~2.5 小时 │
│ │
│ [取消] [提交任务 (¥34)] │
└──────────────────────────────────────────────────────────────┘
提交后 → 任务详情页:
┌──────────────────────────────────────────────────────────────┐
│ 批量任务: 产品描述批量翻译 状态: 🟡 运行中 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 进度: [██████████████████░░░░░░] 72% 36,000 / 50,000 │
│ 已用时: 1小时48分 预计剩余: 42分钟 │
│ 已消耗: ¥24.50 │
│ │
│ 成功: 35,800 失败: 200 跳过: 0 │
│ │
│ ── 实时日志 ── │
│ 15:32:01 处理 #35801-#35810 成功 │
│ 15:31:58 处理 #35791-#35800 成功 │
│ 15:31:55 处理 #35781-#35790 #35788 超时重试 │
│ │
│ [暂停] [取消] [下载已完成部分] │
└──────────────────────────────────────────────────────────────┘
3.11 微调训练中的数据选择步骤
┌──────────────────────────────────────────────────────────────┐
│ 创建微调任务 步骤: ① 选择模型 → ② 选择数据 → ③ 配置 → ④ 提交│
├──────────────────────────────────────────────────────────────┤
│ │
│ ② 选择训练数据 │
│ │
│ 训练集: [customer-service v2 (12,294条) ▼] │
│ 验证集: ○ 自动从训练集拆分 10% │
│ ● 使用独立数据集 [customer-service-eval (500条) ▼] │
│ │
│ ── 数据预检报告 ── │
│ │
│ ✅ 格式兼容 qwen2.5-7b 微调要求 │
│ ✅ 条数充足 (建议 > 100, 当前 12,294) │
│ ⚠️ 23 条超过模型最大长度 4096 tokens (将被截断) │
│ ✅ 验证集与训练集无重叠 │
│ │
│ 预估: │
│ 训练数据 Token 总量: 1,512,800 │
│ 训练轮次 (3 epochs): 4,538,400 tokens 处理量 │
│ 预估训练时间: ~45 分钟 (A10 GPU) │
│ 预估费用: ¥3.75 │
│ │
│ [← 上一步] [下一步 →] │
└──────────────────────────────────────────────────────────────┘
四、数据流转全景
上传
用户本地文件 ─────────→ 对象存储 (S3/NFS)
│
┌────▼─────┐
│ 数据校验 │ → 校验报告
│ Token统计 │ → 统计信息
│ 格式检测 │ → 元数据
└────┬─────┘
│
┌──────────┼──────────┐
▼ ▼ ▼
┌─────────┐ ┌───────┐ ┌─────────┐
│ 微调训练 │ │ RAG │ │ 批量推理 │
│ (Job) │ │向量化 │ │ (Job) │
└────┬────┘ └───┬───┘ └────┬────┘
│ │ │
▼ ▼ ▼
模型产出 知识库 推理结果
│ (向量DB) (下载)
▼
部署为推理服务
五、技术实现要点
5.1 大文件上传
方案: 分片上传 (Multipart Upload)
前端:
1. 文件分片 (每片 5MB)
2. 计算每片 MD5
3. 并发上传 (3-5 片并行)
4. 断点续传 (记录已上传的片)
5. 全部上传完 → 通知后端合并
后端 API:
POST /api/v1/datasets/upload/init → 获取 upload_id
POST /api/v1/datasets/upload/part → 上传分片
POST /api/v1/datasets/upload/complete → 合并确认
存储:
小文件 (< 100MB): 直接存 NFS/S3
大文件 (> 100MB): S3 Multipart Upload
5.2 数据处理异步化
大数据集处理 (去重/统计/校验) 耗时较长,必须异步:
1. 用户发起处理请求
2. 后端创建任务记录 (status: "pending")
3. 放入消息队列 (Redis Stream / RabbitMQ)
4. Worker 消费任务,处理数据
5. 处理中实时更新进度 (WebSocket / SSE 推送)
6. 完成后更新状态,通知用户
K8s 实现:
小任务: 直接在 service Pod 中处理
大任务: 创建 K8s Job,处理完自动清理
5.3 Token 计算
import "github.com/pkoukk/tiktoken-go"
func CountTokens(text string, model string) int {
enc, _ := tiktoken.EncodingForModel(model)
tokens := enc.Encode(text, nil, nil)
return len(tokens)
}
5.4 数据安全
| 安全措施 |
说明 |
| 租户隔离 |
数据存储路径包含 org_id,API 层强制过滤 |
| 传输加密 |
HTTPS + TLS 1.3 |
| 存储加密 |
S3 SSE 或 NFS 上 LUKS 加密 |
| 访问审计 |
记录谁在什么时间访问了什么数据 |
| 自动脱敏 |
上传时扫描 PII(手机号/身份证/邮箱) |
| 数据过期 |
配置保留期限,到期自动删除 |
| GDPR 合规 |
提供数据导出和彻底删除能力 |
六、页面汇总
| 序号 |
页面 |
路由 |
优先级 |
| 1 |
数据集列表 |
/datasets |
P0 |
| 2 |
上传数据集 |
/datasets/upload |
P0 |
| 3 |
数据集详情-预览 |
/datasets/:id/preview |
P0 |
| 4 |
数据集详情-统计 |
/datasets/:id/stats |
P0 |
| 5 |
数据集详情-校验 |
/datasets/:id/validation |
P0 |
| 6 |
数据集详情-版本 |
/datasets/:id/versions |
P1 |
| 7 |
数据处理 |
/datasets/:id/process |
P1 |
| 8 |
知识库列表 |
/knowledge-bases |
P1 |
| 9 |
创建知识库 |
/knowledge-bases/create |
P1 |
| 10 |
知识库详情-文档 |
/knowledge-bases/:id/documents |
P1 |
| 11 |
知识库检索测试 |
/knowledge-bases/:id/test |
P1 |
| 12 |
批量推理列表 |
/batch-jobs |
P1 |
| 13 |
创建批量任务 |
/batch-jobs/create |
P1 |
| 14 |
批量任务详情 |
/batch-jobs/:id |
P1 |
| 15 |
微调-数据选择 |
/fine-tuning/create (step 2) |
P0 |
| 16 |
数据标注 |
/datasets/:id/annotate |
P2 |