EDD 核心理念

评估驱动开发(EDD)将评估置于开发流程中心。传统开发是"先写功能,再测试",EDD 反过来:“先定义评估标准,再开发功能”。借鉴了 TDD,但有关键区别:TDD 关注代码正确性,EDD 关注产品效果。

维度传统开发EDD
开发起点功能需求评估集
验收标准功能可用评估指标达标
迭代依据直觉/用户反馈评估数据
回归保护单元测试评估集回归

评估集先行

评估集是带预期结果的测试用例,用于量化 Agent 在特定任务上的表现,是随产品演进的活文档。

eval_set = {
    "version": "1.3.0",
    "cases": [
        {
            "id": "case_001",
            "input": "帮我查北京到上海的高铁票",
            "expected": {
                "tool_calls": ["search_trains"],
                "tool_args": {"from": "北京", "to": "上海", "type": "高铁"},
                "response_must_not_contain": ["飞机", "航班"],
            },
            "difficulty": "easy",
        },
        {
            "id": "case_042",
            "input": "先查高铁,再看上海天气,总结出行建议",
            "expected": {
                "tool_calls": ["search_trains", "get_weather"],
                "tool_call_order": ["search_trains", "get_weather"],
                "max_turns": 5,
            },
            "difficulty": "medium",
        },
    ],
}

管理原则:版本化(每次更新打标签)、分层级(核心集50个CI跑 + 完整集500个发版跑)、防污染(不进训练数据)、持续扩充(每周加5-10个 bad case)。

自动化评估流水线

代码提交 → 单元测试 → 评估集执行 → 指标计算 → 对比基线 → 通过/告警
class EvaluationPipeline:
    def __init__(self, eval_set, baseline_results):
        self.eval_set = eval_set
        self.baseline = baseline_results
        self.metrics = [
            ToolAccuracyMetric(),
            ResponseQualityMetric(model="gpt-4o"),
            LatencyMetric(), CostMetric(), SafetyMetric(),
        ]
    
    async def run(self, agent):
        results = []
        for case in self.eval_set["cases"]:
            result = await self._evaluate_case(agent, case)
            results.append(result)
        summary = self._summarize(results)
        diff = self._compare_baseline(summary, self.baseline)
        return {
            "summary": summary,
            "regressions": [r for r in diff if r["change"] < 0],
            "improvements": [r for r in diff if r["change"] > 0],
        }

CI/CD 集成:merge request 跑核心集(50个),main 分支跑完整集(500个),评估不通过则阻止合并。

A/B 测试

Agent A/B 测试比传统 Web A/B 复杂:非确定性、延迟反馈(第5轮才感受差异)、多维结果。

class AgentABTest:
    def __init__(self, agent_a, agent_b, traffic_split=0.5):
        self.agent_a = agent_a  # 当前版本
        self.agent_b = agent_b  # 实验版本
    
    async def route_and_run(self, user_input, user_id):
        # 确定性分流:同一用户始终进同一组
        bucket = "a" if int(hashlib.md5(user_id.encode()).hexdigest(), 16) % 100 < 50 else "b"
        agent = self.agent_a if bucket == "a" else self.agent_b
        response = await agent.run(user_input)
        return response, bucket
    
    def analyze(self):
        import scipy.stats as stats
        a_scores = [r["quality"] for r in self.results["a"]]
        b_scores = [r["quality"] for r in self.results["b"]]
        if len(a_scores) < 30:
            return {"status": "insufficient_data"}
        t_stat, p_value = stats.ttest_ind(b_scores, a_scores)
        return {
            "improvement": np.mean(b_scores) - np.mean(a_scores),
            "p_value": p_value,
            "significant": p_value < 0.05,
            "recommendation": "ship_b" if p_value < 0.05 and np.mean(b_scores) > np.mean(a_scores) else "keep_a",
        }

金丝雀发布

全量用户
├── 95% → Stable 版本
└── 5%  → Canary 版本 → 监控:错误率/延迟/成本/满意度
                             ├── 异常 → 自动回滚
                             └── 24h正常 → 扩大到20%→50%→100%

数据飞轮

EDD 的终极目标:产品使用产生数据 → 数据改善评估 → 评估驱动改进 → 改进吸引更多使用 → 更多数据。

class DataFlywheel:
    async def mine_bad_cases(self, days=7):
        low_rated = await self.feedback_store.get_low_rated(threshold=3, days=days)
        corrections = await self.feedback_store.get_user_corrections(days=days)
        clusters = self._cluster(low_rated + corrections)
        return [self._select_representative(c) for c in clusters]

案例:客服 Agent EDD 实践

某电商客服Agent上线3个月:初始50case成功率62%满意度3.2/5 → 3月后350case成功率89%满意度4.6/5。关键改进:第1月发现退货场景成功率仅40%针对性优化;第2月增加上下文压缩;第3月A/B测试验证新Prompt。

总结

EDD 不是测试方法,而是开发哲学。核心:不评估就不知道好坏,不知道好坏就无法改进。通过评估集先行、自动化流水线、A/B 测试和数据飞轮,建立数据驱动的 Agent 迭代闭环。关键不是建立完美评估集,而是建立持续收集 bad case、持续扩充、持续优化的飞轮机制。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。