feat: 数据处理向导新增生成控制选项

提取 GenerationOptionsPanel 组件统一管理生成模型、温度、最大长度、JSON 模式与质量过滤配置,StructuredProcessOptions 与 UnstructuredProcessOptions 继承 GenerationControlOptions,CreateView、TaskSetupStep 及各子步骤同步接入,详情/列表小幅调整,回归脚本扩充生成选项断言。
This commit is contained in:
caoxiaozhu
2026-07-13 11:47:33 +08:00
parent b64d730616
commit 5c469a1778
12 changed files with 744 additions and 30 deletions

View File

@@ -2,6 +2,7 @@
import { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue'
import { onBeforeRouteLeave, useRouter } from 'vue-router'
import { ElMessage, type UploadFile } from 'element-plus'
import { storeToRefs } from 'pinia'
import AppConfirmDialog from '@/components/AppConfirmDialog.vue'
import TaskSetupStep from './create/TaskSetupStep.vue'
import SourceUploadStep from './create/SourceUploadStep.vue'
@@ -9,6 +10,7 @@ import PreviewCompareStep from './create/PreviewCompareStep.vue'
import GenerationStep from './create/GenerationStep.vue'
import ResultEditorStep from './create/ResultEditorStep.vue'
import { buildPreviewItems, createResults, DEFAULT_SOURCE_TEXT } from './create/previewModel'
import { useModelsStore } from '@/stores/models'
import type {
ExternalDataSource,
GenerationState,
@@ -21,11 +23,15 @@ import type {
} from './create/types'
const router = useRouter()
const modelsStore = useModelsStore()
const { list: modelList } = storeToRefs(modelsStore)
const generationModels = computed(() => modelList.value.filter((model) => model.type === 'LLM'))
const taskSetupRef = ref<InstanceType<typeof TaskSetupStep>>()
const confirmDialogRef = ref<InstanceType<typeof AppConfirmDialog>>()
const DRAFT_STORAGE_KEY = 'yg-data-process-create-draft'
const DRAFT_SCHEMA_VERSION = 4
const DRAFT_SCHEMA_VERSION = 5
const PREVIEW_MODEL_VERSION = 'document-chunk-v2'
const DEFAULT_GENERATION_PROMPT = '你是一名专业的数据生成助手。请根据输入内容生成准确、完整、可直接用于模型训练的问答数据。仅输出符合目标格式的内容,答案应事实清晰、语言自然,不要添加分析过程、说明或无关内容。'
const WIZARD_STEPS = [
{ id: 'create', title: '创建任务', desc: '填写任务信息与处理配置' },
@@ -45,6 +51,15 @@ const structuredOptions = ref<StructuredProcessOptions>({
semanticEnrichment: false,
qaPairsPerRow: 1,
datasetSplit: { train: 80, validation: 10, test: 10 },
generationModelId: '',
generationPrompt: DEFAULT_GENERATION_PROMPT,
temperature: 0.7,
maxTokens: 1024,
jsonMode: false,
qualityFilterEnabled: false,
filterLowQuality: true,
filterShortContent: true,
minOutputLength: 20,
})
const unstructuredOptions = ref<UnstructuredProcessOptions>({
preprocessOptions: [
@@ -66,6 +81,15 @@ const unstructuredOptions = ref<UnstructuredProcessOptions>({
semanticEnrichment: false,
qaPairsPerChunk: 1,
datasetSplit: { train: 80, validation: 10, test: 10 },
generationModelId: '',
generationPrompt: DEFAULT_GENERATION_PROMPT,
temperature: 0.7,
maxTokens: 1024,
jsonMode: false,
qualityFilterEnabled: false,
filterLowQuality: true,
filterShortContent: true,
minOutputLength: 20,
})
interface UploadedDataFile {
uid: number | string
@@ -219,19 +243,45 @@ function previewAffectingOptions() {
function generationAffectingOptions() {
if (processType.value === 'structured') {
const { semanticEnrichment, qaPairsPerRow, datasetSplit } = structuredOptions.value
return { semanticEnrichment, qaPairsPerRow, datasetSplit }
const {
semanticEnrichment, qaPairsPerRow, datasetSplit, generationModelId, generationPrompt,
temperature, maxTokens, jsonMode,
qualityFilterEnabled, filterLowQuality, filterShortContent, minOutputLength,
} = structuredOptions.value
return {
semanticEnrichment, qaPairsPerRow, datasetSplit, generationModelId, generationPrompt,
temperature, maxTokens, jsonMode,
qualityFilterEnabled, filterLowQuality, filterShortContent, minOutputLength,
}
}
if (processType.value === 'unstructured') {
const {
semanticEnrichment,
qaPairsPerChunk,
datasetSplit,
generationModelId,
generationPrompt,
temperature,
maxTokens,
jsonMode,
qualityFilterEnabled,
filterLowQuality,
filterShortContent,
minOutputLength,
} = unstructuredOptions.value
return {
semanticEnrichment,
qaPairsPerChunk,
datasetSplit,
generationModelId,
generationPrompt,
temperature,
maxTokens,
jsonMode,
qualityFilterEnabled,
filterLowQuality,
filterShortContent,
minOutputLength,
}
}
return null
@@ -337,6 +387,31 @@ function restoreDraft() {
qaPairsPerChunk: Number.isFinite(restoredUnstructuredOptions.qaPairsPerChunk)
? restoredUnstructuredOptions.qaPairsPerChunk
: unstructuredOptions.value.qaPairsPerChunk,
generationModelId: restoredUnstructuredOptions.generationModelId ?? unstructuredOptions.value.generationModelId,
generationPrompt: typeof restoredUnstructuredOptions.generationPrompt === 'string'
? restoredUnstructuredOptions.generationPrompt
: unstructuredOptions.value.generationPrompt,
temperature: Number.isFinite(restoredUnstructuredOptions.temperature)
? restoredUnstructuredOptions.temperature
: unstructuredOptions.value.temperature,
maxTokens: Number.isFinite(restoredUnstructuredOptions.maxTokens)
? restoredUnstructuredOptions.maxTokens
: unstructuredOptions.value.maxTokens,
jsonMode: typeof restoredUnstructuredOptions.jsonMode === 'boolean'
? restoredUnstructuredOptions.jsonMode
: unstructuredOptions.value.jsonMode,
qualityFilterEnabled: typeof restoredUnstructuredOptions.qualityFilterEnabled === 'boolean'
? restoredUnstructuredOptions.qualityFilterEnabled
: unstructuredOptions.value.qualityFilterEnabled,
filterLowQuality: typeof restoredUnstructuredOptions.filterLowQuality === 'boolean'
? restoredUnstructuredOptions.filterLowQuality
: unstructuredOptions.value.filterLowQuality,
filterShortContent: typeof restoredUnstructuredOptions.filterShortContent === 'boolean'
? restoredUnstructuredOptions.filterShortContent
: unstructuredOptions.value.filterShortContent,
minOutputLength: Number.isFinite(restoredUnstructuredOptions.minOutputLength)
? restoredUnstructuredOptions.minOutputLength
: unstructuredOptions.value.minOutputLength,
datasetSplit: {
train: Number.isFinite(restoredDatasetSplit?.train)
? restoredDatasetSplit.train
@@ -819,7 +894,10 @@ onBeforeRouteLeave(async () => {
})
onBeforeUnmount(stopGenerationTimer)
onMounted(restoreDraft)
onMounted(() => {
restoreDraft()
modelsStore.load()
})
</script>
<template>
@@ -861,6 +939,7 @@ onMounted(restoreDraft)
v-model:process-type="processType"
v-model:structured-options="structuredOptions"
v-model:unstructured-options="unstructuredOptions"
:generation-models="generationModels"
/>
<SourceUploadStep