You've already forked DataMate
init datamate
This commit is contained in:
522
frontend/src/mock/mock-seed/data-synthesis.cjs
Normal file
522
frontend/src/mock/mock-seed/data-synthesis.cjs
Normal file
@@ -0,0 +1,522 @@
|
||||
const Mock = require("mockjs");
|
||||
const API = require("../mock-apis.cjs");
|
||||
|
||||
// 合成类型枚举
|
||||
const SynthesisTypes = [
|
||||
"INSTRUCTION_TUNING",
|
||||
"COT_DISTILLATION",
|
||||
"DIALOGUE_GENERATION",
|
||||
"TEXT_AUGMENTATION",
|
||||
"MULTIMODAL_SYNTHESIS",
|
||||
"CUSTOM"
|
||||
];
|
||||
|
||||
// 任务状态枚举
|
||||
const JobStatuses = ["PENDING", "RUNNING", "COMPLETED", "FAILED", "CANCELLED"];
|
||||
|
||||
// 模型配置
|
||||
function modelConfigItem() {
|
||||
return {
|
||||
modelName: Mock.Random.pick([
|
||||
"gpt-3.5-turbo",
|
||||
"gpt-4",
|
||||
"claude-3",
|
||||
"llama-2-70b",
|
||||
"qwen-max"
|
||||
]),
|
||||
temperature: Mock.Random.float(0.1, 1.0, 2, 2),
|
||||
maxTokens: Mock.Random.pick([512, 1024, 2048, 4096]),
|
||||
topP: Mock.Random.float(0.1, 1.0, 2, 2),
|
||||
frequencyPenalty: Mock.Random.float(0, 2.0, 2, 2)
|
||||
};
|
||||
}
|
||||
|
||||
// 合成模板数据
|
||||
function synthesisTemplateItem() {
|
||||
const type = Mock.Random.pick(SynthesisTypes);
|
||||
return {
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
name: Mock.Random.ctitle(5, 20),
|
||||
description: Mock.Random.csentence(5, 30),
|
||||
type,
|
||||
category: Mock.Random.pick([
|
||||
"教育培训", "对话系统", "内容生成", "代码生成", "多模态", "自定义"
|
||||
]),
|
||||
modelConfig: modelConfigItem(),
|
||||
enabled: Mock.Random.boolean(),
|
||||
promptTemplate: type === "INSTRUCTION_TUNING"
|
||||
? "请根据以下主题生成一个指令:{topic}\n指令应该包含:\n1. 明确的任务描述\n2. 具体的输入要求\n3. 期望的输出格式"
|
||||
: type === "COT_DISTILLATION"
|
||||
? "问题:{question}\n请提供详细的推理步骤,然后给出最终答案。\n推理过程:\n1. 分析问题的关键信息\n2. 应用相关知识和规则\n3. 逐步推导出结论"
|
||||
: "请根据以下模板生成内容:{template}",
|
||||
parameters: {
|
||||
maxLength: Mock.Random.integer(100, 2000),
|
||||
diversity: Mock.Random.float(0.1, 1.0, 2, 2),
|
||||
quality: Mock.Random.float(0.7, 1.0, 2, 2)
|
||||
},
|
||||
examples: new Array(Mock.Random.integer(2, 5)).fill(null).map(() => ({
|
||||
input: Mock.Random.csentence(10, 30),
|
||||
output: Mock.Random.csentence(20, 50),
|
||||
explanation: Mock.Random.csentence(5, 20)
|
||||
})),
|
||||
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
|
||||
updatedAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss")
|
||||
};
|
||||
}
|
||||
|
||||
const synthesisTemplateList = new Array(25).fill(null).map(synthesisTemplateItem);
|
||||
|
||||
// 合成任务数据
|
||||
function synthesisJobItem() {
|
||||
const template = Mock.Random.pick(synthesisTemplateList);
|
||||
const targetCount = Mock.Random.integer(100, 10000);
|
||||
const generatedCount = Mock.Random.integer(0, targetCount);
|
||||
const progress = targetCount > 0 ? (generatedCount / targetCount) * 100 : 0;
|
||||
|
||||
return {
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
name: Mock.Random.ctitle(5, 20),
|
||||
description: Mock.Random.csentence(5, 30),
|
||||
templateId: template.id,
|
||||
template: {
|
||||
id: template.id,
|
||||
name: template.name,
|
||||
type: template.type
|
||||
},
|
||||
status: Mock.Random.pick(JobStatuses),
|
||||
progress: Math.round(progress * 100) / 100,
|
||||
targetCount,
|
||||
generatedCount,
|
||||
startTime: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
|
||||
endTime: progress >= 100 ? Mock.Random.datetime("yyyy-MM-dd HH:mm:ss") : null,
|
||||
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
|
||||
updatedAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss"),
|
||||
statistics: {
|
||||
totalGenerated: generatedCount,
|
||||
successfulGenerated: Math.floor(generatedCount * Mock.Random.float(0.85, 0.98, 2, 2)),
|
||||
failedGenerated: Math.floor(generatedCount * Mock.Random.float(0.02, 0.15, 2, 2)),
|
||||
averageLength: Mock.Random.integer(50, 500),
|
||||
uniqueCount: Math.floor(generatedCount * Mock.Random.float(0.8, 0.95, 2, 2))
|
||||
},
|
||||
samples: new Array(Math.min(10, generatedCount)).fill(null).map(() => ({
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
content: Mock.Random.cparagraph(1, 3),
|
||||
score: Mock.Random.float(0.6, 1.0, 2, 2),
|
||||
metadata: {
|
||||
length: Mock.Random.integer(50, 500),
|
||||
model: template.modelConfig.modelName,
|
||||
timestamp: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss")
|
||||
},
|
||||
createdAt: Mock.Random.datetime("yyyy-MM-dd HH:mm:ss")
|
||||
}))
|
||||
};
|
||||
}
|
||||
|
||||
const synthesisJobList = new Array(30).fill(null).map(synthesisJobItem);
|
||||
|
||||
// 生成指令数据
|
||||
function generatedInstructionItem() {
|
||||
return {
|
||||
instruction: Mock.Random.csentence(10, 30),
|
||||
input: Mock.Random.csentence(5, 20),
|
||||
output: Mock.Random.csentence(10, 40),
|
||||
quality: Mock.Random.float(0.7, 1.0, 2, 2)
|
||||
};
|
||||
}
|
||||
|
||||
// COT 示例数据
|
||||
function cotExampleItem() {
|
||||
return {
|
||||
question: Mock.Random.csentence(10, 25) + "?",
|
||||
reasoning: Mock.Random.cparagraph(2, 4),
|
||||
answer: Mock.Random.csentence(5, 15)
|
||||
};
|
||||
}
|
||||
|
||||
// 蒸馏COT数据
|
||||
function distilledCOTDataItem() {
|
||||
return {
|
||||
question: Mock.Random.csentence(10, 25) + "?",
|
||||
reasoning: Mock.Random.cparagraph(2, 4),
|
||||
answer: Mock.Random.csentence(5, 15),
|
||||
confidence: Mock.Random.float(0.7, 1.0, 2, 2)
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = function (router) {
|
||||
// 获取合成模板列表
|
||||
router.get(API.querySynthesisTemplatesUsingGet, (req, res) => {
|
||||
const { page = 0, size = 20, type } = req.query;
|
||||
let filteredTemplates = synthesisTemplateList;
|
||||
|
||||
if (type) {
|
||||
filteredTemplates = synthesisTemplateList.filter(
|
||||
(template) => template.type === type
|
||||
);
|
||||
}
|
||||
|
||||
const startIndex = page * size;
|
||||
const endIndex = startIndex + parseInt(size);
|
||||
const pageData = filteredTemplates.slice(startIndex, endIndex);
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: {
|
||||
content: pageData,
|
||||
totalElements: filteredTemplates.length,
|
||||
totalPages: Math.ceil(filteredTemplates.length / size),
|
||||
size: parseInt(size),
|
||||
number: parseInt(page)
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 创建合成模板
|
||||
router.post(API.createSynthesisTemplateUsingPost, (req, res) => {
|
||||
const newTemplate = {
|
||||
...synthesisTemplateItem(),
|
||||
...req.body,
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
enabled: true,
|
||||
createdAt: new Date().toISOString(),
|
||||
updatedAt: new Date().toISOString()
|
||||
};
|
||||
synthesisTemplateList.push(newTemplate);
|
||||
|
||||
res.status(201).send({
|
||||
code: "0",
|
||||
msg: "Synthesis template created successfully",
|
||||
data: newTemplate
|
||||
});
|
||||
});
|
||||
|
||||
// 获取合成模板详情
|
||||
router.get(API.querySynthesisTemplateByIdUsingGet, (req, res) => {
|
||||
const { templateId } = req.params;
|
||||
const template = synthesisTemplateList.find((t) => t.id === templateId);
|
||||
|
||||
if (template) {
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: template
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Synthesis template not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 更新合成模板
|
||||
router.put(API.updateSynthesisTemplateByIdUsingPut, (req, res) => {
|
||||
const { templateId } = req.params;
|
||||
const index = synthesisTemplateList.findIndex((t) => t.id === templateId);
|
||||
|
||||
if (index !== -1) {
|
||||
synthesisTemplateList[index] = {
|
||||
...synthesisTemplateList[index],
|
||||
...req.body,
|
||||
updatedAt: new Date().toISOString()
|
||||
};
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Synthesis template updated successfully",
|
||||
data: synthesisTemplateList[index]
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Synthesis template not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 删除合成模板
|
||||
router.delete(API.deleteSynthesisTemplateByIdUsingDelete, (req, res) => {
|
||||
const { templateId } = req.params;
|
||||
const index = synthesisTemplateList.findIndex((t) => t.id === templateId);
|
||||
|
||||
if (index !== -1) {
|
||||
synthesisTemplateList.splice(index, 1);
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Synthesis template deleted successfully",
|
||||
data: null
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Synthesis template not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 获取合成任务列表
|
||||
router.get(API.querySynthesisJobsUsingGet, (req, res) => {
|
||||
const { page = 0, size = 20, status } = req.query;
|
||||
let filteredJobs = synthesisJobList;
|
||||
|
||||
if (status) {
|
||||
filteredJobs = synthesisJobList.filter((job) => job.status === status);
|
||||
}
|
||||
|
||||
const startIndex = page * size;
|
||||
const endIndex = startIndex + parseInt(size);
|
||||
const pageData = filteredJobs.slice(startIndex, endIndex);
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: {
|
||||
content: pageData,
|
||||
totalElements: filteredJobs.length,
|
||||
totalPages: Math.ceil(filteredJobs.length / size),
|
||||
size: parseInt(size),
|
||||
number: parseInt(page)
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 创建合成任务
|
||||
router.post(API.createSynthesisJobUsingPost, (req, res) => {
|
||||
const { templateId } = req.body;
|
||||
const template = synthesisTemplateList.find(t => t.id === templateId);
|
||||
|
||||
const newJob = {
|
||||
...synthesisJobItem(),
|
||||
...req.body,
|
||||
id: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
templateId,
|
||||
template: template ? {
|
||||
id: template.id,
|
||||
name: template.name,
|
||||
type: template.type
|
||||
} : null,
|
||||
status: "PENDING",
|
||||
progress: 0,
|
||||
generatedCount: 0,
|
||||
createdAt: new Date().toISOString(),
|
||||
updatedAt: new Date().toISOString()
|
||||
};
|
||||
synthesisJobList.push(newJob);
|
||||
|
||||
res.status(201).send({
|
||||
code: "0",
|
||||
msg: "Synthesis job created successfully",
|
||||
data: newJob
|
||||
});
|
||||
});
|
||||
|
||||
// 获取合成任务详情
|
||||
router.get(API.querySynthesisJobByIdUsingGet, (req, res) => {
|
||||
const { jobId } = req.params;
|
||||
const job = synthesisJobList.find((j) => j.id === jobId);
|
||||
|
||||
if (job) {
|
||||
const template = synthesisTemplateList.find(t => t.id === job.templateId);
|
||||
const jobDetail = {
|
||||
...job,
|
||||
template: template || null
|
||||
};
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: jobDetail
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Synthesis job not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 删除合成任务
|
||||
router.delete(API.deleteSynthesisJobByIdUsingDelete, (req, res) => {
|
||||
const { jobId } = req.params;
|
||||
const index = synthesisJobList.findIndex((j) => j.id === jobId);
|
||||
|
||||
if (index !== -1) {
|
||||
synthesisJobList.splice(index, 1);
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Synthesis job deleted successfully",
|
||||
data: null
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Synthesis job not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 执行合成任务
|
||||
router.post(API.executeSynthesisJobUsingPost, (req, res) => {
|
||||
const { jobId } = req.params;
|
||||
const job = synthesisJobList.find((j) => j.id === jobId);
|
||||
|
||||
if (job) {
|
||||
job.status = "RUNNING";
|
||||
job.startTime = new Date().toISOString();
|
||||
job.updatedAt = new Date().toISOString();
|
||||
|
||||
// 模拟异步执行
|
||||
setTimeout(() => {
|
||||
job.status = Mock.Random.pick(["COMPLETED", "FAILED"]);
|
||||
job.progress = job.status === "COMPLETED" ? 100 : Mock.Random.float(10, 90, 2, 2);
|
||||
job.generatedCount = Math.floor((job.progress / 100) * job.targetCount);
|
||||
job.endTime = new Date().toISOString();
|
||||
}, Mock.Random.integer(2000, 5000));
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Synthesis job execution started",
|
||||
data: {
|
||||
executionId: Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, ""),
|
||||
status: "RUNNING",
|
||||
message: "Job execution started successfully"
|
||||
}
|
||||
});
|
||||
} else {
|
||||
res.status(404).send({
|
||||
code: "1",
|
||||
msg: "Synthesis job not found",
|
||||
data: null
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 指令调优数据合成
|
||||
router.post(API.instructionTuningUsingPost, (req, res) => {
|
||||
const { baseInstructions, targetDomain, count, modelConfig, parameters } = req.body;
|
||||
|
||||
const jobId = Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, "");
|
||||
const generatedInstructions = new Array(count).fill(null).map(() => generatedInstructionItem());
|
||||
|
||||
const statistics = {
|
||||
totalGenerated: count,
|
||||
averageQuality: Mock.Random.float(0.8, 0.95, 2, 2),
|
||||
diversityScore: Mock.Random.float(0.7, 0.9, 2, 2)
|
||||
};
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Instruction tuning completed successfully",
|
||||
data: {
|
||||
jobId,
|
||||
generatedInstructions,
|
||||
statistics
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// COT蒸馏数据合成
|
||||
router.post(API.cotDistillationUsingPost, (req, res) => {
|
||||
const { sourceModel, targetFormat, examples, parameters } = req.body;
|
||||
|
||||
const jobId = Mock.Random.guid().replace(/[^a-zA-Z0-9]/g, "");
|
||||
const processedCount = examples.length;
|
||||
const successfulCount = Math.floor(processedCount * Mock.Random.float(0.85, 0.98, 2, 2));
|
||||
|
||||
const distilledData = new Array(successfulCount).fill(null).map(() => distilledCOTDataItem());
|
||||
|
||||
const statistics = {
|
||||
totalProcessed: processedCount,
|
||||
successfulDistilled: successfulCount,
|
||||
averageConfidence: Mock.Random.float(0.8, 0.95, 2, 2)
|
||||
};
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "COT distillation completed successfully",
|
||||
data: {
|
||||
jobId,
|
||||
distilledData,
|
||||
statistics
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 获取合成任务统计信息
|
||||
router.get("/api/v1/synthesis/statistics", (req, res) => {
|
||||
const statistics = {
|
||||
totalJobs: synthesisJobList.length,
|
||||
completedJobs: synthesisJobList.filter(j => j.status === "COMPLETED").length,
|
||||
runningJobs: synthesisJobList.filter(j => j.status === "RUNNING").length,
|
||||
failedJobs: synthesisJobList.filter(j => j.status === "FAILED").length,
|
||||
totalGenerated: synthesisJobList.reduce((sum, job) => sum + job.generatedCount, 0),
|
||||
averageQuality: Mock.Random.float(0.8, 0.95, 2, 2),
|
||||
templateTypeDistribution: {
|
||||
"INSTRUCTION_TUNING": synthesisTemplateList.filter(t => t.type === "INSTRUCTION_TUNING").length,
|
||||
"COT_DISTILLATION": synthesisTemplateList.filter(t => t.type === "COT_DISTILLATION").length,
|
||||
"DIALOGUE_GENERATION": synthesisTemplateList.filter(t => t.type === "DIALOGUE_GENERATION").length,
|
||||
"TEXT_AUGMENTATION": synthesisTemplateList.filter(t => t.type === "TEXT_AUGMENTATION").length,
|
||||
"MULTIMODAL_SYNTHESIS": synthesisTemplateList.filter(t => t.type === "MULTIMODAL_SYNTHESIS").length,
|
||||
"CUSTOM": synthesisTemplateList.filter(t => t.type === "CUSTOM").length
|
||||
},
|
||||
dailyGeneration: new Array(7).fill(null).map((_, index) => ({
|
||||
date: Mock.Random.date("yyyy-MM-dd"),
|
||||
count: Mock.Random.integer(100, 5000)
|
||||
}))
|
||||
};
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: "Success",
|
||||
data: statistics
|
||||
});
|
||||
});
|
||||
|
||||
// 批量操作
|
||||
router.post("/api/v1/synthesis/jobs/batch", (req, res) => {
|
||||
const { action, jobIds } = req.body;
|
||||
|
||||
let successCount = 0;
|
||||
let failedCount = 0;
|
||||
|
||||
jobIds.forEach(jobId => {
|
||||
const job = synthesisJobList.find(j => j.id === jobId);
|
||||
if (job) {
|
||||
switch(action) {
|
||||
case "DELETE":
|
||||
const index = synthesisJobList.findIndex(j => j.id === jobId);
|
||||
synthesisJobList.splice(index, 1);
|
||||
successCount++;
|
||||
break;
|
||||
case "START":
|
||||
job.status = "RUNNING";
|
||||
job.startTime = new Date().toISOString();
|
||||
successCount++;
|
||||
break;
|
||||
case "STOP":
|
||||
job.status = "CANCELLED";
|
||||
job.endTime = new Date().toISOString();
|
||||
successCount++;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
failedCount++;
|
||||
}
|
||||
});
|
||||
|
||||
res.send({
|
||||
code: "0",
|
||||
msg: `Batch ${action.toLowerCase()} completed`,
|
||||
data: {
|
||||
total: jobIds.length,
|
||||
success: successCount,
|
||||
failed: failedCount
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user