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论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
