389 lines
12 KiB
Markdown
389 lines
12 KiB
Markdown
# 并行实验工作台 PRD
|
||
|
||
## 文档信息
|
||
|
||
| 项目 | 内容 |
|
||
| --- | --- |
|
||
| 状态 | 设计中 |
|
||
| 版本 | 0.1 |
|
||
| 日期 | 2026-08-13 |
|
||
| 依赖 | [自动化平台总体设计](./automation-platform-architecture.md)、[自动任务与目标 PRD](./automation-goals-and-scheduling-prd.md) |
|
||
|
||
## 1. 背景
|
||
|
||
GoodBuddy 已能把一个请求并行委派给最多三个只读专家,再综合结果。这适合“一次请求,
|
||
多种专业视角”,但不等同于实验:当前没有结构化变量、重复运行、统一指标、结果晋升和
|
||
Run 级记忆隔离。
|
||
|
||
本功能借鉴 MesaLogo ParallelLab 中变量隔离、批量 Run、失败结算、指标比较和运行证据
|
||
的思想,但不引入其 Action Space、服务端队列或重型仿真平台。
|
||
|
||
## 2. 产品定义
|
||
|
||
并行实验是在冻结的研究问题和执行协议下,生成多个相互隔离的候选 Run,以相同评估标准
|
||
比较结果,并将结论追溯到运行证据。
|
||
|
||
```text
|
||
Experiment
|
||
├─ Question / Hypothesis
|
||
├─ Protocol
|
||
├─ Variables and Variants
|
||
├─ Objectives and Evaluators
|
||
├─ Budget and Stop Conditions
|
||
└─ ExperimentRun × N
|
||
├─ Isolated Conversation
|
||
├─ Isolated Run Memory
|
||
├─ Tasks and Artifacts
|
||
├─ Metrics
|
||
└─ Evidence
|
||
```
|
||
|
||
## 3. 已确认的产品决策
|
||
|
||
1. 实验 Run 复用现有 Task、Runtime、Artifact 和审批机制。
|
||
2. 每个 Run 有独立变量、会话、运行记忆、任务和成果。
|
||
3. 默认实验是只读 Ask;写工作区的实验后续使用每 Run 独立沙箱。
|
||
4. 多个 Run 不能并发修改同一个用户工作区。
|
||
5. 失败、取消、预算耗尽或结果不完整的 Run 不参与最佳结果选择。
|
||
6. 没有成功 Run 时实验为失败或无结论,不能报告成功。
|
||
7. 模型生成的实验协议必须可审查、编辑和版本化。
|
||
8. 评估优先使用确定性指标;模型 Rubric 显示评估器版本和不确定性。
|
||
9. “最佳”只针对声明的目标和约束,不代表普遍最好。
|
||
10. 最佳结果只能创建候选,不能直接覆盖计划、记忆或工作区。
|
||
|
||
## 4. 目标
|
||
|
||
- 把问题转为可审查的实验问题、变量、候选和指标。
|
||
- 比较不同提示、模型、专家组合、参数或方案。
|
||
- 监控每个 Run 的状态、成本、证据和失败原因。
|
||
- 查看结果表、差异、稳定性和评估依据。
|
||
- 从候选创建普通任务、计划草稿或记忆候选。
|
||
- 为持续学习提供回放和非退化评估基础。
|
||
|
||
## 5. 非目标
|
||
|
||
- 第一阶段不模拟数千 Agent 或社会群体涌现。
|
||
- 不实现任意连续参数的自动贝叶斯优化。
|
||
- 不在样本不足时宣称统计显著性。
|
||
- 不把模型的自报置信度直接作为跨模型比较指标。
|
||
- 不允许实验自行增加样本数、预算或能力范围。
|
||
- 不允许自动部署结果或修改安全策略。
|
||
- 不把专家团队的一次回答自动包装成科学实验。
|
||
|
||
## 6. 实验类型
|
||
|
||
| 类型 | 变量示例 | 用途 |
|
||
| --- | --- | --- |
|
||
| Prompt 对比 | 系统说明、输出格式、示例 | 比较自动化协议 |
|
||
| 模型对比 | 已配置文本模型 | 质量、速度和 Token 权衡 |
|
||
| 专家组合 | 专家集合、综合策略 | 多视角研究 |
|
||
| 参数扫描 | 检索模式、Top K、轮数 | 寻找有限参数组合 |
|
||
| 方案候选 | 多个用户或模型方案 | 按统一 Rubric 比较 |
|
||
| 回放评估 | 历史脱敏案例集合 | 验证学习候选是否退化 |
|
||
|
||
后续多轮情景模拟需要单独定义角色、环境和状态变量。
|
||
|
||
## 7. 创建流程
|
||
|
||
### 7.1 研究问题
|
||
|
||
用户填写:
|
||
|
||
- 实验名称。
|
||
- 问题和可选假设。
|
||
- 探索、比较、优化或回放验证类型。
|
||
- 项目范围。
|
||
- 期望输出。
|
||
- 禁止行为。
|
||
|
||
### 7.2 协议
|
||
|
||
`ExperimentProtocol` 包含:
|
||
|
||
- 基准输入或案例集。
|
||
- 固定提示和步骤。
|
||
- 变量与候选。
|
||
- Runtime、模型和专家。
|
||
- 工具、知识库和记忆范围。
|
||
- 工作模式。
|
||
- 每 Run 预算。
|
||
- 指标、评估器和停止条件。
|
||
- 重复次数。
|
||
|
||
模型生成协议草稿时必须标明用户字段、模型建议、确定性指标和模型判断指标。
|
||
|
||
### 7.3 变量
|
||
|
||
```ts
|
||
type ExperimentVariable =
|
||
| { name: string; type: 'enum'; values: JsonValue[] }
|
||
| {
|
||
name: string
|
||
type: 'range'
|
||
start: number
|
||
end: number
|
||
step: number
|
||
}
|
||
| { name: string; type: 'boolean' }
|
||
| { name: string; type: 'prompt_variant'; values: string[] }
|
||
| {
|
||
name: string
|
||
type: 'model_profile'
|
||
profileIds: string[]
|
||
}
|
||
| {
|
||
name: string
|
||
type: 'expert_set'
|
||
expertIdSets: string[][]
|
||
}
|
||
```
|
||
|
||
第一阶段只支持有限、确定生成的组合。保存前展示组合数、重复后 Run 总数、最大模型调用、
|
||
Token 和耗时范围,以及最大并发。超过上限时要求缩小变量,不静默抽样。
|
||
|
||
### 7.4 基准与候选
|
||
|
||
- 至少一个 Variant。
|
||
- 对比实验建议设置 Baseline。
|
||
- Baseline 与 Candidate 使用相同案例和评估器。
|
||
- 评估器不能读取 Variant 标签和模型名称作为质量信号。
|
||
- 模型评分时随机化候选顺序并保存实际顺序。
|
||
|
||
## 8. Run 隔离
|
||
|
||
### 8.1 数据隔离
|
||
|
||
每个 Run 独立拥有:
|
||
|
||
- `experimentRunId` 和运行会话。
|
||
- 变量快照和临时上下文。
|
||
- Run 记忆分区。
|
||
- 任务、子任务和成果。
|
||
- 指标、证据和 Runtime 会话标识。
|
||
|
||
禁止:
|
||
|
||
- Run A 读取 Run B 的消息、临时记忆或中间成果。
|
||
- 多个 Run 共享可变变量对象。
|
||
- Run 候选记忆在实验结算前进入其他 Run。
|
||
- 通过全局列表误取其他项目或实验数据。
|
||
|
||
### 8.2 工作区隔离
|
||
|
||
阶段 1 只支持 Ask 和只读工具。阶段 2 的 Execute Run 使用独立临时沙箱或版本化工作树,
|
||
结果以 Patch 或成果展示,用户选择候选后再进入单独应用流程。
|
||
|
||
### 8.3 记忆隔离
|
||
|
||
Run 只读取冻结的 Global、Project、Automation 记忆快照和自己的 Run 分区,
|
||
不读取其他 Run 或实验期间新产生的候选记忆。
|
||
|
||
## 9. 调度与预算
|
||
|
||
- 默认最大并发 3,与现有子专家调度能力一致。
|
||
- 还需遵守全局后台并发和模型连接并发。
|
||
- 每个 Variant 使用相同的单 Run 预算。
|
||
- 不因候选暂时领先而静默给它更多预算。
|
||
- 提前停止必须来自预先声明的规则。
|
||
- UI 显示运行、排队、成功、失败和取消数量。
|
||
|
||
停止条件:
|
||
|
||
```ts
|
||
type ExperimentStopCondition =
|
||
| { type: 'all_runs_terminal' }
|
||
| { type: 'successful_run_count'; count: number }
|
||
| {
|
||
type: 'metric_threshold'
|
||
metric: string
|
||
operator: string
|
||
value: number
|
||
}
|
||
| { type: 'budget' }
|
||
| { type: 'deadline'; at: string }
|
||
| { type: 'manual' }
|
||
```
|
||
|
||
触发停止后不启动新 Run;是否取消正在运行的 Run 必须在条件中明确。保存停止原因,
|
||
未运行 Variant 不参与最终比较。
|
||
|
||
## 10. 评估与指标
|
||
|
||
### 10.1 指标类型
|
||
|
||
| 类型 | 示例 |
|
||
| --- | --- |
|
||
| 确定性结果 | Schema 有效、测试通过、文件存在、检查项完成 |
|
||
| 运行指标 | 耗时、模型调用、Token、工具调用、成果大小 |
|
||
| 检索指标 | 召回、引用覆盖、降级状态 |
|
||
| 人工评分 | 正确性、可用性、偏好 |
|
||
| 模型 Rubric | 结构、完整性、表达、风险 |
|
||
|
||
### 10.2 模型 Rubric
|
||
|
||
必须保存 Rubric 版本、评估模型、输入证据摘要、候选展示顺序、分项得分、结构化理由和
|
||
格式修复。它不能覆盖确定性失败,也不能在缺少证据时编造事实正确性判断。
|
||
|
||
### 10.3 多目标
|
||
|
||
```ts
|
||
type ExperimentObjective = {
|
||
metric: string
|
||
direction: 'maximize' | 'minimize' | 'target'
|
||
weight?: number
|
||
target?: number
|
||
hardConstraint?: boolean
|
||
}
|
||
```
|
||
|
||
结算先排除非成功和违反硬约束的 Run,再计算其余指标。存在明显权衡时展示 Pareto 候选,
|
||
不强行选唯一最佳。
|
||
|
||
## 11. 结算规则
|
||
|
||
Run 成功要求:
|
||
|
||
- Runtime 正常结束。
|
||
- 必填成果存在。
|
||
- 必填评估器成功。
|
||
- 未违反硬约束。
|
||
- 没有结果未知的副作用。
|
||
|
||
Experiment 结算:
|
||
|
||
| 情况 | 状态 |
|
||
| --- | --- |
|
||
| 至少一个成功 Run,所需 Run 已结算 | `completed` |
|
||
| 所有 Run 失败或无有效结果 | `failed` |
|
||
| 提前停止且已有可比较结果 | `stopped_with_results` |
|
||
| 提前停止且无可比较结果 | `cancelled` |
|
||
| 指标冲突或证据不足 | `inconclusive` |
|
||
|
||
最佳结果展示 Variant、参数、成功和失败数量、重复运行原始值与聚合、目标分项、硬约束、
|
||
证据和限制。只有一个成功 Run 时使用“当前最高分候选”,不使用“稳定最佳”。
|
||
|
||
## 12. 重复与复现
|
||
|
||
- 每个 Variant 默认重复 1 次,波动敏感实验建议至少 3 次。
|
||
- 重复 Run 使用相同变量和独立运行会话。
|
||
- Runtime 支持种子时保存种子,否则明确标注不可完全复现。
|
||
- 聚合展示原始值、中位数或均值,并说明计算方式。
|
||
- 样本不足时不展示统计显著性结论。
|
||
|
||
## 13. 会话监督接入
|
||
|
||
Supervisor 可以检查偏离协议、遗漏必填输出、证据不足和候选间协议不一致;
|
||
确定性预算或权限违规可以暂停 Run,模型判断默认只警告或请求人工复核。
|
||
|
||
Supervisor 不能:
|
||
|
||
- 根据其他候选结果提示当前 Run。
|
||
- 临时修改某个候选协议。
|
||
- 自动提高预算或批准工具。
|
||
|
||
## 14. 信息架构
|
||
|
||
实验工作台页签:
|
||
|
||
1. **设计**:问题、协议、变量、指标和预算。
|
||
2. **运行**:总体进度、Run 表和状态。
|
||
3. **比较**:指标表、图表、差异和 Pareto 候选。
|
||
4. **证据**:按结论、指标和 Run 查看证据。
|
||
5. **结论**:总结、限制和后续操作。
|
||
|
||
Run 详情展示参数、协议版本、时间线、消息、任务、成果、监督记录、指标、评估理由、
|
||
上下文和记忆快照、Token、耗时与错误。
|
||
|
||
## 15. 后续操作
|
||
|
||
允许:
|
||
|
||
- 用候选参数创建普通任务。
|
||
- 创建自动化计划草稿。
|
||
- 保存实验模板。
|
||
- 创建记忆候选。
|
||
- 追加确认 Run。
|
||
- 导出脱敏结果摘要。
|
||
|
||
不得自动启用新计划、覆盖现有计划、确认长期记忆、应用工作区 Patch 或扩大权限。
|
||
|
||
## 16. 数据模型建议
|
||
|
||
```ts
|
||
type Experiment = {
|
||
id: string
|
||
projectId?: string
|
||
name: string
|
||
question: string
|
||
status:
|
||
| 'draft'
|
||
| 'queued'
|
||
| 'running'
|
||
| 'paused'
|
||
| 'completed'
|
||
| 'failed'
|
||
| 'stopped_with_results'
|
||
| 'inconclusive'
|
||
| 'cancelled'
|
||
protocolVersion: number
|
||
totalRuns: number
|
||
successfulRuns: number
|
||
failedRuns: number
|
||
}
|
||
|
||
type ExperimentRun = {
|
||
id: string
|
||
experimentId: string
|
||
variantId: string
|
||
repetition: number
|
||
automationRunId: string
|
||
variables: Record<string, JsonValue>
|
||
status: string
|
||
goalStatus: 'met' | 'not_met' | 'inconclusive'
|
||
}
|
||
```
|
||
|
||
建议表:
|
||
|
||
- `experiments`
|
||
- `experiment_protocol_versions`
|
||
- `experiment_variants`
|
||
- `experiment_runs`
|
||
- `experiment_run_metrics`
|
||
- `experiment_evidence`
|
||
- `experiment_conclusions`
|
||
|
||
## 17. 安全与隐私
|
||
|
||
1. 协议、案例、输出和评估输入都视为不可信数据。
|
||
2. Renderer 不能指定其他项目的 Run 或记忆分区。
|
||
3. 每个 Run 使用唯一 Runtime conversation ID,并在结束后释放。
|
||
4. 实验默认不能写用户工作区。
|
||
5. 模型对比不能传递其他供应商的凭据或隐藏配置。
|
||
6. 导出默认不包含完整私人案例、提示、消息或文件内容。
|
||
7. 取消实验传播到排队和运行任务,但不伪装撤销已有副作用。
|
||
8. 实验删除不能误删已由用户独立保存的成果或计划候选。
|
||
|
||
## 18. 实施顺序
|
||
|
||
1. 建立 Experiment、Variant、Run 聚合实体和只读 Ask Run。
|
||
2. 实现有限组合、预算估算、并发调度和运行监控。
|
||
3. 增加确定性指标、失败结算和结果比较。
|
||
4. 增加模型 Rubric、人工评分和证据工作台。
|
||
5. 增加重复运行和回放评估。
|
||
6. 最后评估独立工作树中的 Execute 实验。
|
||
|
||
## 19. 验收标准
|
||
|
||
- [ ] 保存前显示变量组合、重复后 Run 总数和最大预算。
|
||
- [ ] 每个 Run 的会话、变量、记忆、任务和成果相互隔离。
|
||
- [ ] 默认实验无法写用户工作区。
|
||
- [ ] 最大并发和全局后台预算同时生效。
|
||
- [ ] 各 Variant 使用相同单 Run 预算。
|
||
- [ ] 失败、取消、预算耗尽和不完整 Run 不参与最佳选择。
|
||
- [ ] 全部 Run 失败时实验不报告成功或最佳结果。
|
||
- [ ] 模型 Rubric 显示版本、模型、分项和证据。
|
||
- [ ] 多目标冲突时可以展示多个 Pareto 候选。
|
||
- [ ] 用户可从候选创建草稿,但不会自动部署或确认记忆。
|
||
- [ ] 结论能追溯到具体 Run、指标、成果和证据。
|