作者注本文基于 ECC 项目的验证体系帮助中国开发者建立可量化的 AI 输出质量保障机制。项目开源地址github.com/affaan-m/ECC摘要AI 编码助手的输出质量波动是生产环境落地的主要障碍。本文基于 ECCEverything Claude Code项目的verification-loopSkill系统介绍检查点评估Checkpoint-Based Evals和持续评估Continuous Evals两种模式、passk 与 pass^k 等关键指标、以及如何在团队中建立可复现的评估工作流。文章包含 Python 评估框架实现和实际案例数据。关键词Evals、验证循环、passk、质量评估、AI 输出质量一、AI 输出的不确定性问题1.1 为什么需要评估场景你让 AI 生成一个用户注册 API第一次完美运行第二次却遗漏了邮箱验证。同一提示词不同输出。AI 生成的代码存在固有的概率性波动问题影响传统解决方案输出不一致质量不可预测人工审查幻觉包含不存在的方法测试验证遗漏忘记边界条件检查清单退化新版本变差回归测试Evals评估的目标用工程化方法量化和管理这种不确定性。二、ECC 的两种评估模式2.1 检查点评估Checkpoint-Based理念在关键里程碑设置显式检查点验证通过后才继续。否是否是否是开始任务规划阶段检查点1规划合理?修正规划实现阶段检查点2测试通过?修复实现审查阶段检查点3审查通过?修复问题完成任务图 1检查点评估流程 —— 每个阶段有明确的通过标准适用场景关键路径开发新手开发者指导高风险变更安全、支付等2.2 持续评估Continuous理念定期自动运行评估持续监控质量。 持续评估调度器 —— 定期运行测试和检查 importscheduleimporttimefromdatetimeimportdatetimeclassContinuousEvaluator:持续评估器def__init__(self):self.results[]defrun_full_suite(self):运行完整评估套件print(f[{datetime.now()}] 运行评估套件...)checks[self._check_tests(),self._check_lint(),self._check_coverage(),self._check_security(),]result{timestamp:datetime.now().isoformat(),checks:checks,passed:all(c[passed]forcinchecks),}self.results.append(result)returnresultdef_check_tests(self):检查测试return{name:tests,passed:True,details:1723/1723 passed}def_check_lint(self):检查代码风格return{name:lint,passed:True,details:No issues}def_check_coverage(self):检查覆盖率return{name:coverage,passed:True,details:87%}def_check_security(self):安全检查return{name:security,passed:True,details:0 issues}defschedule_evals(self,interval_minutes:int30):定时评估schedule.every(interval_minutes).minutes.do(self.run_full_suite)print(f评估已设置为每{interval_minutes}分钟运行一次)whileTrue:schedule.run_pending()time.sleep(60)# 使用示例 if__name____main__:evaluatorContinuousEvaluator()resultevaluator.run_full_suite()print(\n评估结果:)forcheckinresult[checks]:icon✅ifcheck[passed]else❌print(f{icon}{check[name]}:{check[details]})适用场景长时间开发会话自动化流水线质量趋势监控三、关键评估指标3.1 passk 与 pass^kpassk: k 次尝试中至少 1 次成功 k1: 70% k3: 91% k5: 97% pass^k: k 次尝试全部必须成功 k1: 70% k3: 34% k5: 17%指标含义适用场景passk“至少一次成功即可”探索性任务、原型开发pass^k“每次都必须成功”生产代码、安全关键功能3.2 评估框架实现 评估框架 —— 实现 passk 和 pass^k 指标计算 fromtypingimportList,Callable,TypeVarfromdataclassesimportdataclassimportstatistics TTypeVar(T)dataclassclassEvalResult:评估结果passed:boolscore:floatdetails:strclassEvalFramework: 评估框架 支持多次运行和多种指标计算 defrun_multiple(self,task:Callable[[],T],k:int)-List[T]: 多次运行同一任务 Args: task: 可调用任务 k: 运行次数 Returns: 结果列表 results[]foriinrange(k):try:resulttask()results.append(result)exceptExceptionase:results.append(None)returnresultsdefpass_at_k(self,results:List[bool],k:int)-float: 计算 passk k 次中至少 1 次成功的概率 ifnotresultsorklen(results):return0.0# 检查前 k 次是否至少有一次成功sampleresults[:k]return1.0ifany(sample)else0.0defpass_k(self,results:List[bool],k:int)-float: 计算 pass^k k 次全部成功的概率 ifnotresultsorklen(results):return0.0sampleresults[:k]return1.0ifall(sample)else0.0defevaluate(self,evaluator:Callable[[],bool],n_runs:int10,k_values:List[int]None)-dict: 完整评估 Args: evaluator: 评估函数返回是否通过 n_runs: 总运行次数 k_values: 要计算的 k 值列表 Returns: 评估报告 ifk_valuesisNone:k_values[1,3,5]results[]foriinrange(n_runs):try:passedevaluator()results.append(passed)exceptException:results.append(False)pass_at_k_scores{}pass_k_scores{}forkink_values:ifkn_runs:# 多次采样计算平均pass_at_k_scores[k]self._estimate_pass_at_k(results,k)pass_k_scores[k]self._estimate_pass_k(results,k)return{total_runs:n_runs,success_count:sum(results),success_rate:sum(results)/n_runs,pass_at_k:pass_at_k_scores,pass^k:pass_k_scores,}def_estimate_pass_at_k(self,results:List[bool],k:int)-float:通过多次采样估计 passkfromitertoolsimportcombinationsiflen(results)k:return0.0# 简化直接计算successes0nlen(results)# 使用滑动窗口近似foriinrange(n-k1):ifany(results[i:ik]):successes1returnsuccesses/(n-k1)def_estimate_pass_k(self,results:List[bool],k:int)-float:通过多次采样估计 pass^kiflen(results)k:return0.0successes0nlen(results)foriinrange(n-k1):ifall(results[i:ik]):successes1returnsuccesses/(n-k1)# 使用示例 if__name____main__:importrandom frameworkEvalFramework()# 模拟一个成功率 70% 的任务defmock_task():returnrandom.random()0.7print(*60)print( AI 输出质量评估)print(*60)reportframework.evaluate(mock_task,n_runs100,k_values[1,3,5])print(f\n总运行:{report[total_runs]})print(f成功次数:{report[success_count]})print(f基础成功率:{report[success_rate]:.1%})print(f\npassk (至少一次成功):)fork,scoreinreport[pass_at_k].items():print(f k{k}:{score:.1%})print(f\npass^k (全部成功):)fork,scoreinreport[pass^k].items():print(f k{k}:{score:.1%})print(f\n 解读:)print(f - 只需一次成功时运行 3 次成功率可达{report[pass_at_k].get(3,0):.1%})print(f - 需要一致可靠时单次成功率{report[success_rate]:.1%}是瓶颈)四、团队评估工作流4.1 建立评估基准 评估基准管理 —— 跟踪 AI 输出质量趋势 importjsonfromdatetimeimportdatetimefrompathlibimportPathfromtypingimportList,DictclassEvalBenchmark:评估基准def__init__(self,storage_path:str~/.claude/evals):self.storagePath(storage_path).expanduser()self.storage.mkdir(parentsTrue,exist_okTrue)defrecord(self,skill_name:str,score:float,details:dict):记录评估结果record{timestamp:datetime.now().isoformat(),skill:skill_name,score:score,details:details,}file_pathself.storage/f{skill_name}.jsonlwithopen(file_path,a,encodingutf-8)asf:f.write(json.dumps(record,ensure_asciiFalse)\n)defget_trend(self,skill_name:str)-List[Dict]:获取质量趋势file_pathself.storage/f{skill_name}.jsonlifnotfile_path.exists():return[]records[]withopen(file_path,r,encodingutf-8)asf:forlineinf:ifline.strip():records.append(json.loads(line))returnrecordsdefdetect_regression(self,skill_name:str,threshold:float0.1)-bool:检测质量退化trendself.get_trend(skill_name)iflen(trend)5:returnFalserecentsum(r[score]forrintrend[-5:])/5previoussum(r[score]forrintrend[-10:-5])/5return(previous-recent)threshold五、总结模式适用场景关键指标检查点评估关键任务、里程碑通过/失败持续评估长时间会话、流水线趋势变化多次采样质量不稳定的功能passk / pass^k参考资料ECC verification-loop SkillECC eval-harness SkillHumanEval 论文OpenAISWE-bench 评估框架ECC 详细指南验证循环章节本文完。你的 AI 输出质量可量化了吗