docs/workspace/test-area-auto-iterate-one-round/implementation-split-compare-stop-signals-and-spo.md
本文件把当前设计进一步下沉为可实施拆分,重点回答三个问题:
SPO 运行态和持久化状态分别存什么BasicSystemWorkspace 里具体要增加哪些 UI 组件和交互点目标不是直接给出最终代码,而是为后续实现提供一份“按模块切分、可并行推进、边界清晰”的任务蓝图。
推荐顺序:
rewrite from evaluation 能力落地SPO 再作为薄编排层接入原因:
SPO 不应自己发明判断逻辑SPO 应尽量只消费 compare 的结构化结果SPO 越薄,未来越容易扩展到多模式、多入口有些状态应该持久化到 session,有些则不应持久化。
建议原则:
推荐:
BasicSystemWorkspace.vue 只做连接层当前基础类型在:
packages/core/src/services/evaluation/types.ts当前 CompareAnalysisHints 仍只有偏通用的布尔信息:
hasSharedTestCaseshasSamePromptSnapshotshasCrossModelComparison要支持 structured compare 和 stop signals,建议分两步演进。
建议增加结构化 compare 角色信息:
export type StructuredCompareRole =
| 'target'
| 'baseline'
| 'reference'
| 'referenceBaseline'
| 'replica'
| 'auxiliary'
export interface CompareAnalysisHints {
hasSharedTestCases?: boolean
hasSamePromptSnapshots?: boolean
hasCrossModelComparison?: boolean
mode?: 'generic' | 'structured'
snapshotRoles?: Record<string, StructuredCompareRole>
}
这样做的好处:
不建议先直接修改顶层 EvaluationResponse 的主字段结构。
建议先把 stop signals 放进 metadata,例如:
export interface CompareStopSignals {
targetVsBaseline?: 'improved' | 'flat' | 'regressed'
targetVsReferenceGap?: 'none' | 'minor' | 'major'
improvementHeadroom?: 'none' | 'low' | 'medium' | 'high'
overfitRisk?: 'low' | 'medium' | 'high'
stopRecommendation?: 'continue' | 'stop' | 'review'
stopReasons?: string[]
}
export interface EvaluationResponse {
// 现有字段保持不变
metadata?: {
model?: string
timestamp?: number
duration?: number
compareStopSignals?: CompareStopSignals
}
}
这样是最稳妥的第一步:
summary / improvements / patchPlan / score 的地方几乎不用动SPO 和结果面板可以开始消费 stop signals当前 compare payload 构造在:
packages/ui/src/composables/prompt/compareEvaluation.ts建议拆成两层:
继续保留:
buildCompareEvaluationPayload职责:
建议新增:
packages/ui/src/composables/prompt/structuredCompareConfig.tspackages/ui/src/composables/prompt/buildStructuredCompareHints.ts职责:
snapshotRolesCompareAnalysisHints.mode = 'structured'这样 compareEvaluation.ts 继续保持中性,而 structured compare 配置逻辑单独存在。
当前 compare 结果的主要消费位置包括:
packages/ui/src/composables/prompt/useEvaluationHandler.tspackages/ui/src/components/evaluation/EvaluationPanel.vuepackages/ui/src/components/basic-mode/BasicSystemWorkspace.vue建议改动如下。
建议扩展 compare 结果暴露能力:
compareStopSignals 的 computed好处:
BasicSystemWorkspace 不必直接解析 metadata建议新增两类能力:
智能重写 按钮stop signals 展示不必太复杂,建议只显示:
这样既便于人理解,也能验证 stop signals 是否输出稳定。
建议在:
packages/ui/src/stores/session/useBasicSystemSession.ts增加以下持久化字段。
structuredCompareConfig用于 compare evaluation 的通用配置,而不是 SPO 私有配置。
interface StructuredCompareConfig {
targetVariantId: TestVariantId | null
snapshotRoles: Partial<Record<TestVariantId, StructuredCompareRole>>
updatedAt: number
}
用途:
spoConfiginterface SpoConfig {
targetModelKey: string
referenceModelKey: string
maxRounds: number
stopMode: 'round-only' | 'smart' | 'custom'
rewriteModelKey: string
customStopConfig?: {
minScoreDelta?: number
plateauPatience?: number
stopWhenGapSmall?: boolean
stopWhenHeadroomLow?: boolean
stopOnRegression?: boolean
}
}
用途:
SPO 配置spoLastRunSummaryinterface SpoLastRunSummary {
status: 'completed' | 'stopped' | 'failed'
currentRound: number
acceptedRound: number | null
bestScore: number | null
stopReason: string | null
overview: string
updatedAt: number
}
用途:
建议放在新的 composable 中,不进入 session:
isSpoRunningcurrentStageabortRequestedroundRecordscurrentRoundCompareResultcurrentRoundRewriteDraftcurrentRoundRetestResult原因:
建议新增:
packages/ui/src/composables/prompt/useSpoLoopController.ts职责:
SPO 配置建议它只接收依赖,不直接耦合模板/服务定位细节,例如:
useSpoLoopController({
session,
evaluationHandler,
runVariantsBatch,
buildRewriteInstruction,
promptService,
saveSession,
})
这样 BasicSystemWorkspace.vue 只负责把现有能力装配进去。
当前 BasicSystemWorkspace.vue 已经非常大,不建议再继续内联 SPO UI。
推荐新增以下组件:
SpoConfigModal.vue建议路径:
packages/ui/src/components/testing/SpoConfigModal.vue职责:
spoConfigSPOSpoRunCard.vue建议路径:
packages/ui/src/components/testing/SpoRunCard.vue职责:
查看详情 / 立即停止SpoResultCard.vue建议路径:
packages/ui/src/components/testing/SpoResultCard.vue职责:
查看详情 / 保存版本 / 继续 1 轮 / 重新运行SpoRunDrawer.vue建议路径:
packages/ui/src/components/testing/SpoRunDrawer.vue职责:
VariantRoleBadge.vue建议路径:
packages/ui/src/components/testing/VariantRoleBadge.vue职责:
TargetBaselineReferenceReference Baseline这也能服务于非 SPO 的 structured compare 场景。
在 packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue 中,建议只增加以下接入点:
SPO 按钮SpoConfigModal根据状态显示:
SpoRunCardSpoResultCardVariantRoleBadgeSpoRunDrawer这样 BasicSystemWorkspace 不直接承担复杂循环逻辑,只承担“把已有能力装配到 UI”。
packages/core/src/services/evaluation/types.ts
StructuredCompareRoleCompareStopSignalsCompareAnalysisHintsEvaluationResponse.metadata 中增加 compareStopSignalspackages/ui/src/composables/prompt/compareEvaluation.ts
packages/ui/src/composables/prompt/useEvaluationHandler.ts
compareStopSignalspackages/ui/src/components/evaluation/EvaluationPanel.vue
智能重写 按钮packages/ui/src/composables/prompt/structuredCompareConfig.ts
packages/ui/src/composables/prompt/buildStructuredCompareHints.ts
packages/ui/src/composables/prompt/useSpoLoopController.ts
packages/ui/src/stores/session/useBasicSystemSession.ts
packages/ui/src/components/testing/SpoConfigModal.vuepackages/ui/src/components/testing/SpoRunCard.vuepackages/ui/src/components/testing/SpoResultCard.vuepackages/ui/src/components/testing/SpoRunDrawer.vuepackages/ui/src/components/testing/VariantRoleBadge.vue先做:
types.tscompareEvaluation.tsuseEvaluationHandler.ts目标:
再做:
EvaluationPanel.vuerewrite from evaluation目标:
再做:
useBasicSystemSession.tsstructuredCompareConfig.ts目标:
SPO 配置有可复用的状态承载再做:
SpoConfigModal.vueSpoRunCard.vueSpoResultCard.vueSpoRunDrawer.vueVariantRoleBadge.vue目标:
最后做:
useSpoLoopController.tsBasicSystemWorkspace.vue 接线目标:
建议不要把完整每轮详细 compare 结果都持久化进 session。
优先持久化:
建议 stop signals 先进入 metadata,避免波及所有消费方。
当前文件已经足够大,后续新增逻辑应尽量拆到 composable 和独立组件中。
如果按最小风险实施,最合理的技术路径是:
SPO 的 loop 与 UI 壳这样能最大化复用现有能力,同时把复杂度控制在最小范围内。