Глава 29

Проводите пилот на реальных дорогих задачах

Multi-agent архитектура должна выиграть на representative task bank, а не на одном специально подобранном demo. План пилота дисциплинирует: соберите 30-100 representative задач из реального backlog и production-сбоев; зафиксируйте single-agent или workflow baseline; определите outcome graders до настройки команды; запустите варианты на одинаковых inputs и environments; соберите cost, wall time, success, conflict и human rework; разберите failed traces и классифицируйте причины; оставьте multi-agent только для сегментов с устойчивым выигрышем.

Решение о принятии - это gate в коде, а не впечатление.

TypeScript
export function compareArchitectures(
  single: ArchitectureMetrics,
  multi: ArchitectureMetrics
): AdoptionDecision {
  const reasons: string[] = [];
  const qualityGain = multi.successRate - single.successRate;
  const latencyGain = single.medianLatencyMs - multi.medianLatencyMs;
  const costRatio = multi.costPerAcceptedTask / single.costPerAcceptedTask;

  if (qualityGain >= 0.05) {
    reasons.push(`success rate +${(qualityGain * 100).toFixed(1)} pp`);
  }
  if (latencyGain > 0) {
    reasons.push(`median latency -${latencyGain} ms`);
  }
  if (multi.humanReworkMinutes < single.humanReworkMinutes) {
    reasons.push("less human rework");
  }
  if (multi.conflictRate > 0.02) {
    reasons.push("conflict rate exceeds 2%");
  }
  if (costRatio > 2) {
    reasons.push(`cost ratio ${costRatio.toFixed(2)}x`);
  }

  const adopt =
    (qualityGain >= 0.05 || latencyGain > 0) &&
    multi.conflictRate <= 0.02 &&
    costRatio <= 2 &&
    multi.humanReworkMinutes <= single.humanReworkMinutes;

  return { adopt, reasons };
}

И проверяется он тестами на положительный и отрицательный сценарий - чтобы дорогая команда с конфликтами честно отклонялась.

TypeScript
import assert from "node:assert/strict";
import { test } from "node:test";
import { compareArchitectures } from "../src/evaluation.js";

test("adopts multi-agent only when measured gain pays for coordination", () => {
  const decision = compareArchitectures(
    { successRate: 0.75, medianLatencyMs: 6000, costPerAcceptedTask: 1, conflictRate: 0, humanReworkMinutes: 20 },
    { successRate: 0.84, medianLatencyMs: 4200, costPerAcceptedTask: 1.8, conflictRate: 0.01, humanReworkMinutes: 12 }
  );
  assert.equal(decision.adopt, true);
});

test("rejects a costly team with excessive conflicts", () => {
  const decision = compareArchitectures(
    { successRate: 0.8, medianLatencyMs: 5000, costPerAcceptedTask: 1, conflictRate: 0, humanReworkMinutes: 10 },
    { successRate: 0.83, medianLatencyMs: 4600, costPerAcceptedTask: 2.4, conflictRate: 0.08, humanReworkMinutes: 18 }
  );
  assert.equal(decision.adopt, false);
  assert.ok(decision.reasons.some((reason) => reason.includes("conflict")));
});

Anthropic рекомендует сочетать code-based, model-based и human graders; evals дают baseline для latency, token usage, cost per task и errors, а production monitoring затем ловит distribution drift, но не заменяет pre-launch evaluation. И KPI выбирайте так, чтобы они не награждали шум.

Неудачный KPI · Почему вводит в заблуждение · Замена

  • Количество agent messages - Награждает шум; Accepted outcomes
  • Tasks started - Не показывает завершение; Success rate по внешнему gate
  • Цена одного call - Игнорирует retries и rejected runs; Cost per accepted task
  • Субъективная скорость - Параллельный UI выглядит быстрым; End-to-end wall-clock latency
Не переносите vendor benchmark. Внутренний результат research-системы не доказывает выигрыш на вашем coding, support или operations workload. Используйте его как основание проверить гипотезу, а не как готовый business case.

Польза доказана на данных. Последний шаг - внедрять автономность ступенями, а не одним переключателем.

Ссылки