跳转至

受控 Self-evolve

Self-evolve 不是让 Agent 直接重写正在运行的 prompt,更不是让它修改线上代码。这里实现的 是一个小型、可审计的软件发布闭环:模型可以提出候选,人和确定性 gate 决定是否发布。

flowchart LR
    T["失败 trace"] --> C["版本化 candidate"]
    C --> E["固定 eval split"]
    C --> H["隐藏 holdout split"]
    E --> G{"质量/安全/成本/延迟 gate"}
    H --> G
    G -->|通过| A["人工审批"]
    G -->|失败| R["拒绝或修改"]
    A --> P["发布新版本"]
    P --> M["监控"]
    M -->|回归| B["回滚旧版本"]

四种 Artifact

ArtifactVersion 只允许 promptskilltoolDescriptionroutingPolicy。它不接受 任意可执行代码。每个版本包含 artifact ID、正整数版本、内容、创建时间和父版本;写入 ArtifactStore 后,同一 ID 与版本号不能覆盖。

store.put({
  artifactId: "support-prompt",
  kind: "prompt",
  version: 1,
  content: "回答前先核对订单事实。",
  createdAt: "2026-08-01T00:00:00Z",
});
store.activate("support-prompt", 1);

这不是密码学意义上的不可变存储。教学版通过接口和拒绝覆盖表达不变量;生产环境应使用 数据库唯一约束、对象存储版本或签名制品。

固定 Dataset 与二元评分

每条 EvalCase 都属于 evalholdout。Controller 在创建时复制数据集,baseline 与 candidate 严格运行相同样例。Evaluator 必须返回明确的 passedsafetyPassed,以及 token、成本和延迟;不使用含义模糊的 1–5 分平均值。

const evaluator: ArtifactEvaluator = async (artifact, testCase) => {
  const started = Date.now();
  const output = await runInSandbox(artifact.content, testCase.input);
  return {
    output,
    passed: output.includes(testCase.expected ?? ""),
    safetyPassed: !output.includes("敏感数据"),
    tokens: readUsage(),
    cost: readCost(),
    latencyMs: Date.now() - started,
  };
};

上面的字符串判断只适合演示。真实 rubric 应来自人工查看失败样本后的具体标准。如果使用 LLM-as-judge,必须先拿人工标注集验证 judge 的一致性,不能让未经验证的 judge 决定发布。

Gate、审批和发布

默认 gate 要求 eval/holdout 通过率至少 80%,相对 baseline 不退化,全部安全检查通过, 并限制 token、成本和延迟增幅为 20%。这些只是保守示例,业务应显式传入自己的 GatePolicy

const candidate = controller.propose({
  artifactId: "support-prompt",
  kind: "prompt",
  content: "先核对订单事实;信息不足时明确追问。",
  rationale: "修复 trace 中的无依据退款承诺",
  failureTraceIds: ["trace-1042"],
});

const evaluated = await controller.evaluate(candidate.id);
if (evaluated.report?.gate.passed) {
  controller.approve(candidate.id, "reviewer@example.com", "人工抽查通过");
  controller.publish(candidate.id, "release-bot");
}

publish() 无法跳过 evaluate()approve()。回滚只能激活 store 中已经存在的旧版本, 并记录 actor、时间和目标版本。教学版的人工身份只是非空字符串;生产服务必须把审批接口 接到真实认证、权限和审计系统。

发布后可调用 monitorActive(),再次用相同 evaluator、dataset 和 gate 对 active version 与父版本做回归检查,并保存 MonitoringRecord。它不会自动回滚;宿主确认告警后再显式调用 rollback(),避免一次随机评测直接改变线上状态。生产环境还应把这里替换或补充为真实流量 指标与告警系统。

与三种 Agent 实现的关系

Evolution runtime 不依赖某个模型 provider。from-scratch TypeScript、Python 和 pi-agent 都可以成为 ArtifactEvaluator 背后的 runner。pi-agent 的 createPiAgent({ systemPrompt })runPiAgentHandoff({ systemPrompt }) 会为每个 prompt artifact 创建隔离实例,不会修改 已运行 Agent 的 prompt。

Self-evolve 仍然在 Agent loop 外层。失败 trace 可以来自 observability 模块,候选可以由 Agent 或人提出,但固定数据集、release policy、审批身份和 active version 都属于宿主系统。