docs/workspace/test-area-auto-iterate-one-round/findings.md
workspace目标模型 / workspace目标模型 / 上一版本、参考模型 / workspace、参考模型 / 上一版本basic-system,优化对象是系统提示词。basic-system 已经不是单纯 A/B。
packages/ui/src/stores/session/useBasicSystemSession.ts
TestVariantId = 'a' | 'b' | 'c' | 'd'TestColumnCount = 2 | 3 | 4testVariants: TestVariantConfig[]packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue
testColumnCountModelactiveVariantIdsrunAllVariantstestContentpackages/ui/src/composables/prompt/compareEvaluation.ts
testCases + snapshots + compareHints 组织执行证据testVariantState.ts 仍保留 A/B 语义,但它已经不是 basic-system 当前测试区的主编排层。本期不要求用户额外填写“目标说明/硬约束”。目标锚点由以下 4 类信息共同生成:
目标槽位
目标模型目标模型 / workspace 作为唯一优化对象提示词内显式约束
workspace 提示词中抽取角色、任务边界、输出格式、禁忌项、工具使用规则等上一版本参考
目标模型 / 上一版本 与 参考模型 / 上一版本跨模型差异证据
参考模型 / workspace 与 目标模型 / workspace 的真实输出差异换句话说,本设计里的“意图识别”不是独立的意图分类器,而是一次面向当前测试证据的目标锚点提取。
这里的“上一版本”是产品术语,不是新的版本类型:
v0 或 vN自动迭代不应只把“4 份输出”直接拼给模型,而应构造成一个结构化上下文包:
workspace 提示词v0 作为原始参考目标/workspace 相比 目标/上一版本 的提升/退化目标/workspace 相比 参考/workspace 的欠缺项参考/workspace 相比 参考/上一版本 的参考侧增益项workspace这比“给模型一个目标再让它自由改”更接近我们项目的定位,因为它建立在真实执行证据上。
| 决策 | 理由 |
|---|---|
| 自动迭代入口放在测试区顶部 | 保持“先测试、再判断、再改写”的心智模型,不引入新页面 |
V1 配置只暴露 目标模型 和 参考模型 | 降低上手成本,避免把功能做成复杂实验编排器 |
| 自动生成 4 槽位预设 | 复用现有多槽位能力,同时天然具备目标对比、参考对比、版本回归三条证据线 |
使用“上一版本”替代 v-last 作为产品术语 | 这里要表达的是“当前轮次之前的那个版本”,它会随着自动迭代推进而变化,不适合叫基线 |
一轮内只改写 workspace,不自动保存版本 | 降低错误传播风险,保留人工确认环节 |
| 成功标准必须包含“回归未恶化”而不只是“当前样例更好” | 防止测试样例驱动的过拟合 |
目标模型 / workspace 必须相对 目标模型 / 上一版本 有明确改进,至少不能出现关键能力退化。参考模型 / workspace 不应相对 参考模型 / 上一版本 出现明显退化。basic-system 而言,自动改写只能调整系统层规则,不得把测试输入中的具体实体、字段值、案例文案上升为长期系统规则。packages/ui/src/components/basic-mode/BasicSystemWorkspace.vue
packages/ui/src/stores/session/useBasicSystemSession.ts
packages/ui/src/composables/prompt/compareEvaluation.ts
snapshot 证据组织方式,避免重新定义执行证据格式packages/ui/src/composables/prompt/autoIterateOneRound.tspackages/ui/src/stores/session/useBasicSystemSession.tspackages/ui/src/components/basic-mode/BasicSystemWorkspace.vuepackages/ui/src/composables/prompt/compareEvaluation.tspackages/ui/src/composables/prompt/testVariantState.tsdocs/architecture/test-area-auto-iterate-one-round.md前面收敛出的三组关键判断:
target/workspace vs target/previoustarget/workspace vs reference/workspacereference/workspace vs reference/previous确实很适合自动优化,但它们依赖的并不是 SPO 这个功能名本身,而是更底层的“结构化 compare 角色”。
也就是说,它们依赖的是:
targetbaselinereferencereferenceBaseline而不是依赖:
targetModel + referenceModel 的专用入口因此,这部分能力更适合下沉为 compare evaluation 的通用增强,而不是让 SPO 自己维护一套平行 judge 逻辑。
为了控制变更范围,同时不牺牲 compare 的表达力,比较合理的做法是把 compare evaluation 分为两种模式:
Generic Compare
workspacetargetStructured Compare
workspacetarget 做分析这样可以避免把“围绕工作区做定向优化”的能力硬塞给所有 compare,同时也避免 SPO 自己长出一套不可复用的 compare 内核。
为了让 compare evaluation 可以服务于更多场景,target 不应只来源于 SPO 配置。
比较稳妥的规则是:
workspace 槽位
Structured CompareGeneric Compareworkspace 槽位
targetworkspace 槽位
target一旦 target 明确,其余槽位就可以根据“是否同模型 / 是否同 prompt / 是否是历史版本 / 是否是重复执行”自动推断为:
baselinereferencereferenceBaselinereplicaauxiliary这里的角色是中性的 compare 语义,不直接暴露 reference 这样的业务词汇,因此更容易复用到普通 compare、稳定性判断和未来的自动优化编排中。
这次自动迭代的实现已经证明:
因此,更合理的设计不是让 SPO 独占“智能改写”,而是让所有评估面板未来都具备一个通用动作:
这样一来:
SPO 只需要负责编排 test -> compare -> rewrite -> retest当我们开始讨论:
最自然的想法,是让 SPO 再额外发一个专属 LLM 请求做 stop judge。
但这会带来两个问题:
SPO 会重新长出一套自己的判断内核SPO 的边界会再次变脏因此,这些判断更适合被收敛为 compare evaluation 的通用 stop signals,再由 SPO 消费。
SPO 真正需要的是一组机器可消费的判断信号,例如:
improved / flat / regressedmajor / minor / nonehigh / medium / low / nonelow / medium / highcontinue / stop / review这些信号不仅 SPO 可以用,未来:
也都可以消费,因此应放在 compare evaluation 层。
SPO 最终的展示不应是一个新的实验台,而应在现有测试区内最小增量地完成:
SPO 按钮SPO 运行卡 / 结果卡SPO 详情抽屉核心证据仍然由现有 4 槽测试结果承载。
多轮 SPO 下,一个很重要的发现是:
因此系统必须显式维护一个“最终采用轮”的概念。
也就是说:
workspace 应尽量保留当前已接受的最佳轮