「AI Agent 全栈开发 50 讲」——从本地模型部署到多智能体系统,一年省 87 万 第 44 课 | 评估框架:量化 Agent 的真实能力

发布时间:2026/9/15 8:01:40

「AI Agent 全栈开发 50 讲」——从本地模型部署到多智能体系统,一年省 87 万 第 44 课 | 评估框架:量化 Agent 的真实能力 第 44 课 | 评估框架量化 Agent 的真实能力没有评估就没有优化。构建科学的评估体系——成功率、步数、Token、耗时、准确率让 Agent 能力可量化、可追踪、可优化。一、业务痛点Agent 的「黑盒」困境在之前的课程中我们已经构建了多个 Agent 系统——从简单的 RAG 问答到复杂的多智能体决策。但一个根本问题始终存在你怎么知道你的 Agent 变好了还是变差了考虑这个真实场景你花了 3 天优化了 Prompt调整了 Tool 的描述换了新的嵌入模型。上线后老板问你「效果提升了多少」你只能回答「感觉快了。」感觉不能作为决策依据。你需要数据。问题场景 - 版本 v1.0 上线用户反馈有时候回答不对 - 你优化了 RAG 检索策略发布 v1.1 - 一周后用户反馈准确率提升了但速度变慢了 - 你无法量化「提升」和「变慢」的具体数值 - 你无法判断这次优化是否值得这就是没有评估体系的代价你无法知道每一次改动是在前进还是倒退。本课目标构建一套 Agent 评估框架让每一次优化都有数据支撑。二、五大核心指标2.1 指标全景 测试用例集 评估引擎✅ 成功率Success Rate 平均步数Avg Steps Token 消耗Token Usage⏱️ 响应时间Latency 准确率Accuracy 评估报告2.2 指标详解指标说明计算方法目标值成功率任务是否成功完成成功次数 / 总次数90%平均步数完成任务需要的步骤数总步数 / 成功次数5 步Token 消耗每次调用消耗的 Token总 Token / 调用次数3000响应时间端到端完成耗时总耗时 / 成功次数30 秒准确率输出结果质量正确项 / 总项85%2.3 为什么是这五个指标成功率最根本的指标。Agent 连任务都完不成其他指标再好也没用。平均步数反映 Agent 的「思考效率」。步数越多说明 Agent 在反复尝试、走弯路。Token 消耗直接对应成本。每 1000 Token 约 0.001-0.03 元取决于模型积少成多。响应时间用户体验的核心。用户等 3 秒和等 30 秒是完全不同的体验。准确率结果的正确性。成功率只关心「是否完成」准确率关心「是否正确」。三、评估框架实现3.1 测试用例设计# 测试用例结构classTestCase:def__init__(self,question,expected_tools,expected_answer_keywords):self.questionquestion self.expected_toolsexpected_tools# 期望调用的工具self.expected_answer_keywordsexpected_answer_keywords# 答案关键词# 示例测试用例集test_cases[TestCase(question华东区上个月销售额是多少,expected_tools[query_database],expected_answer_keywords[华东,销售额,元]),TestCase(question对比华东和华南的销售趋势,expected_tools[query_database,query_database],expected_answer_keywords[华东,华南,对比,增长]),TestCase(question分析销售下降的原因,expected_tools[query_database,analyze_trend,generate_report],expected_answer_keywords[原因,下降,建议]),]3.2 评估引擎importtimeimportjsonfromdataclassesimportdataclass,fieldfromtypingimportOptionaldataclassclassEvalResult:单次评估结果question:strsuccess:boolsteps:inttokens_used:intlatency_ms:floataccuracy:float# 0.0 - 1.0tools_called:list[str]field(default_factorylist)error_message:Optional[str]Nonedefto_dict(self):return{question:self.question,success:self.success,steps:self.steps,tokens_used:self.tokens_used,latency_ms:self.latency_ms,accuracy:self.accuracy,tools_called:self.tools_called,error:self.error_message,}classAgentEvaluator:Agent 评估器def__init__(self,agent,test_cases):self.agentagent self.test_casestest_cases self.results:list[EvalResult][]defevaluate_single(self,test_case:TestCase)-EvalResult:评估单个测试用例start_timetime.time()steps0tokens_used0tools_called[]try:# 执行 Agentresponseself.agent.run(test_case.question)stepsresponse.get(steps,0)tokens_usedresponse.get(tokens_used,0)tools_calledresponse.get(tools_called,[])# 计算准确率检查关键词是否出现在答案中answerresponse.get(answer,)matchedsum(1forkwintest_case.expected_answer_keywordsifkwinanswer)accuracymatched/len(test_case.expected_answer_keywords)iftest_case.expected_answer_keywordselse1.0successaccuracy0.6# 60% 关键词匹配算成功exceptExceptionase:successFalseaccuracy0.0steps0latency_ms(time.time()-start_time)*1000returnEvalResult(questiontest_case.question,successsuccess,stepssteps,tokens_usedtokens_used,latency_mslatency_ms,accuracyaccuracy,tools_calledtools_called,error_messageNoneifsuccesselsestr(e)ifeindir()else未知错误,)defevaluate_all(self)-dict:评估所有测试用例生成汇总报告self.results[self.evaluate_single(tc)fortcinself.test_cases]success_countsum(1forrinself.resultsifr.success)totallen(self.results)return{summary:{total_cases:total,success_count:success_count,success_rate:f{success_count/total*100:.1f}%,avg_steps:f{sum(r.stepsforrinself.results)/max(success_count,1):.1f},avg_tokens:f{sum(r.tokens_usedforrinself.results)/max(success_count,1):.0f},avg_latency_ms:f{sum(r.latency_msforrinself.results)/max(success_count,1):.0f},avg_accuracy:f{sum(r.accuracyforrinself.results)/total*100:.1f}%,},details:[r.to_dict()forrinself.results],}defcompare_versions(self,old_results:dict,new_results:dict)-dict:对比两个版本的结果old_sold_results[summary]new_snew_results[summary]return{success_rate_change:f{old_s[success_rate]}→{new_s[success_rate]},avg_steps_change:f{old_s[avg_steps]}→{new_s[avg_steps]},avg_tokens_change:f{old_s[avg_tokens]}→{new_s[avg_tokens]},avg_latency_change:f{old_s[avg_latency_ms]}→{new_s[avg_latency_ms]},avg_accuracy_change:f{old_s[avg_accuracy]}→{new_s[avg_accuracy]},}3.3 版本对比报告defgenerate_eval_report(version_a:str,version_b:str,results_a:dict,results_b:dict):生成版本对比报告print(f\n{*60})print(f Agent 版本对比报告)print(f{version_a}vs{version_b})print(f{*60}\n)print(f{指标:20}{版本A:15}{版本B:15}{变化:15})print(-*65)s_aresults_a[summary]s_bresults_b[summary]metrics[(成功率,success_rate),(平均步数,avg_steps),(平均Token,avg_tokens),(平均延迟(ms),avg_latency_ms),(平均准确率,avg_accuracy),]forname,keyinmetrics:print(f{name:20}{s_a[key]:15}{s_b[key]:15})print(f\n{*60}\n)四、持续评估流程是否 编写测试用例 运行评估 生成报告通过?✅ 发布上线 定位问题️ 修复优化最佳实践每次修改前先跑基准测试记录当前版本的指标修改后跑对比测试确认指标没有退化定期更新测试用例从真实用户反馈中提取新用例设置质量门禁成功率低于 85% 不允许上线五、运行cdcode/lesson-44-evaluation uvsyncuv run evaluation.py六、本课小结评估框架 量化 追踪 优化没有评估就无法进步五大核心指标成功率、步数、Token、延迟、准确率每次修改都要跑基准测试和对比测试设置质量门禁防止退化上线配套代码code/lesson-44-evaluation/evaluation.py
延伸阅读

更多相关文章

2026/9/15 7:56:40

DeFi安全与信任机制:Aave治理危机的技术解析

1. 项目背景与核心矛盾解析"Aave 冬日乱局"这个标题生动揭示了DeFi领域一个经典困境:技术层面的安全防护与社区信任建设的失衡。作为头部借贷协议,Aave确实通过智能合约构建了堪称行业标杆的资金防护体系——其多重签名机制、风险参数动态调整…

2026/9/15 7:56:40

Flutter+OpenHarmony开发电子合同App实战指南

1. 为什么选择FlutterOpenHarmony开发电子合同App?在移动应用开发领域,Flutter以其出色的跨平台能力和高效的开发体验赢得了广泛认可。而OpenHarmony作为新兴的操作系统平台,正在构建自己的生态体系。将两者结合开发电子合同签署应用&#xf…

2026/9/15 7:56:40

基于ESP8266与LDR的智能路灯系统设计与落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/15 8:06:41

从二进制到游戏存档:Editor工具选择与实操避坑指南

提到“editor”这个词,可能很多人的第一反应是“不就是编辑器嘛,记事本也能算”。但只要你搜过、查过,就会发现“editor”是个特别广泛又特别容易让人挑花眼的词。有人找的是十六进制编辑工具,有人找的是PDF批注软件,有…

2026/9/15 8:06:41

编辑器选型、配置与效率提升实战指南

开始正文1. 编辑器生态全景与选型思路1.1 先想清楚:你需要的究竟是哪种"editor""editor"这个词,说起来很简单,但真拿到手里的时候,很多人会陷入选择困难。前两年我帮一个刚入门的朋友推荐编辑器,他…

2026/9/15 8:06:41

Editor工具千千万,从二进制到Web调试我如何选型与避坑

今天想聊一个特别宽泛的词:editor。起因是我整理浏览器收藏夹时,发现自己存了一堆名字带 Editor 的软件和插件——010 Editor、PDF-XChange Editor、Mermaid Live Editor、Plist Editor Pro、Header Editor、WS2812 Editor、DRG Save Editor……放在一起…

2026/9/15 8:06:41

2025年拆解纯HTML+CSS教育站:从语义化到响应式布局

简介:一套面向网页设计初学者的教育类网站静态页面源码包,项目名为“趣学网”,全程使用纯 HTML 与 CSS 搭建,完整展示了教育门户常见的课程展示、导航栏、搜索框、登录注册等界面模块。通过分析这些页面,可以快速理解 …

2026/9/15 8:06:41

现代编辑器的本质:DSL解释器与实时反馈引擎

1. “editor”这个词在当下技术生态里到底指什么?“editor”——三个字母,一个日常词汇,但在2024年的开发者语境中,它早已不是Word或记事本的代名词。它是一类高度专业化、上下文敏感、能力边界持续外延的交互式内容构造器。你搜“…

2026/9/15 8:01:40

Agent记忆管理实战:用总结压缩与Milvus搭建长期记忆

1. 先聊一个扎心场景:Agent 又“失忆”了做 Agent 开发的朋友大概率都撞过这堵墙:对话轮次一多,模型突然开始胡说八道,或者干脆报错,提示说超出了 token 上限,回答被截断。更难受的是,明明用户十…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码