ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

19 - Agent的评估与测试!从指标到框架,一篇搞定生产级质量保障

19 - Agent的评估与测试!从指标到框架,一篇搞定生产级质量保障 适合前后端/测试等有编程基础的同学手把手教你给AI Agent“打分”前言通过前面18节课的学习你已经能构建一个功能完整的AI Agent了——它能调用工具、能自主决策、能团队协作、能记住用户偏好、还能防御安全攻击。但有一个问题是所有Agent从“Demo”走向“生产”必须面对的你怎么知道你的Agent“够好”传统的软件测试有明确的输入输出和预期结果——单元测试、集成测试、端到端测试一套组合拳打下来质量基本有保障。但Agent不一样。同样的输入两次运行可能给出完全不同的回答同样的任务Agent可能走不同的路径同样的工具调用参数可能略有差异。Agent的输出是非确定性的——这让评估变得极其困难。一句话定义Agent评估是通过多层级、多维度的测试方法对Agent的最终输出、执行轨迹、工具调用和对话能力进行系统性度量以量化其性能、发现回归、并持续优化的过程。Agent评估不仅是“测一下能不能跑”更是从开发到上线的质量保障体系。一、为什么Agent评估这么难——非确定性输出的挑战1.1 传统测试 vs Agent测试维度传统软件测试Agent测试输入输出确定性相同输入→相同输出非确定性相同输入→不同输出预期结果明确可验证模糊、需要语义判断执行路径固定代码走哪条分支是确定的动态Agent自主决定调用哪些工具评判标准精确匹配/布尔值需要LLM-as-Judge或语义相似度回归测试简单对比前后输出困难语义等价需要推理1.2 Agent评估的四个层级LangChain团队在评估Deep Agents的实践中总结出有效的Agent评估需要在多个层级进行。┌─────────────────────────────────────────────────────────────────┐ │ Agent评估四层金字塔 │ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 第四层多轮对话Multi-turn Conversations │ │ │ │ 模拟真实用户交互测试上下文理解和长期记忆 │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ↑ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 第三层完整轨迹Full Trajectory │ │ │ │ 测试Agent的完整执行路径工具调用顺序最终答案 │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ↑ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 第二层单步决策Single Step │ │ │ │ 测试Agent在某个特定状态下的下一步决策是否正确 │ │ │ └─────────────────────────────────────────────────────────┘ │ │ ↑ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 第一层单元测试Unit Test │ │ │ │ 测试单个工具/函数的正确性 │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘层级测试内容运行方式适用场景单元测试单个工具/函数离线开发阶段验证基础组件单步决策Agent某一步的选择是否正确离线验证特定场景下的决策逻辑完整轨迹工具调用顺序最终答案离线回归测试版本对比多轮对话完整用户交互在线/离线模拟真实使用场景二、Agent评估的核心指标体系2.1 最终输出质量指标指标说明评估方式任务完成率Agent成功完成任务的次数占比人工/LLM判断答案正确性最终答案是否与标准答案语义一致精确匹配/LLM-as-Judge答案有用性回答是否真正帮助了用户LLM-as-Judge幻觉率回答中是否存在编造的事实事实核查2.2 轨迹与过程指标指标说明评估方式工具调用准确率工具选择和参数是否正确轨迹匹配工具错误率工具调用失败的比例规则检查平均步数完成任务所需的平均行动步数统计重复动作率重复无效动作的比例规则检查路径效率是否走了最优路径轨迹对比2.3 对话与行为指标指标说明评估方式目标达成度Agent是否成功实现了用户目标LLM判断主题遵循度是否在预定领域内回答问题规则/LLM上下文连贯性多轮对话中是否保持逻辑一致LLM判断2.4 成本与效率指标指标说明Token消耗每次对话的Token使用量API调用次数调用了多少次LLM API响应延迟从输入到输出的时间成本/任务完成一个任务的平均成本三、Agent评估的三大主流框架3.1 LangSmith —— 最全面的评估平台LangSmith是LangChain团队开发的评估和监控平台提供从开发到生产的完整评估能力。核心能力能力说明离线评估在开发阶段对数据集运行评估比较版本、发现回归在线监控在生产环境实时评估真实用户交互30评估模板覆盖安全、响应质量、轨迹、用户行为、多模态可复用评估器一次构建跨项目复用评估工作流1. 创建数据集手动标注/历史 traces/合成数据 2. 定义评估器规则/LLM-as-Judge/自定义 3. 运行实验在数据集上执行Agent 4. 分析结果对比版本、发现回归LangSmith Engine当评估发现失败时LangSmith Engine可以自动诊断根因并帮助解决问题。3.2 Ragas —— 专注Agent指标的开源库Ragas是一个开源库专门用于评估LLM应用包括RAG系统和Agent。Agent专用指标指标说明ToolCallAccuracy评估LLM在识别和调用所需工具方面的性能AgentGoalAccuracy评估Agent是否成功实现了用户目标TopicAdherence评估Agent是否在预定领域内回答问题Ragas的评估方式通过结构化轨迹structured traces而非仅看最终输出来评估Agent行为。3.3 agentevals —— LangChain官方轨迹评估包agentevals是LangChain官方开源的轨迹评估包。核心功能评估Agent的完整执行轨迹消息序列工具调用。四种匹配模式模式说明适用场景strict精确匹配消息和工具调用的顺序测试特定序列如“先查策略再授权”unordered工具调用顺序不限验证信息检索顺序不重要subsetAgent只调用参考工具中的工具不能多确保Agent不超出预期范围supersetAgent至少调用参考工具可以多验证最小必需操作3.4 三大框架对比维度LangSmithRagasagentevals类型云平台SDK开源库开源包核心能力全链路评估监控Agent/RAG指标轨迹匹配学习曲线中低低离线评估✅✅✅在线监控✅❌❌可视化✅ 完整仪表板❌❌四、实战用LangSmith评估Agent4.1 环境配置importosfromlangsmithimportClientfromlangsmith.evaluationimportevaluatefromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportcreate_agentfromlangchain.toolsimporttool# 设置LangSmith环境变量os.environ[LANGCHAIN_API_KEY]YOUR_LANGSMITH_API_KEYos.environ[LANGCHAIN_ENDPOINT]https://api.smith.langchain.comos.environ[OPENAI_API_KEY]YOUR_OPENAI_API_KEY# 初始化LangSmith客户端clientClient()4.2 定义待评估的Agenttooldefget_weather(city:str)-str:获取指定城市的天气信息weather_db{北京:晴25°C,上海:多云28°C,深圳:小雨30°C}returnweather_db.get(city,f未找到{city}的天气信息)tooldefsearch_web(query:str)-str:搜索网络信息returnf关于{query}的搜索结果找到3条相关信息...# 创建AgentllmChatOpenAI(modelgpt-4o-mini,temperature0)agentcreate_agent(modelllm,tools[get_weather,search_web],system_prompt你是一个乐于助人的助手可以使用工具回答问题。)4.3 创建评估数据集# 在LangSmith中创建数据集dataset_nameweather_agent_test# 检查数据集是否存在不存在则创建try:datasetclient.read_dataset(dataset_namedataset_name)except:datasetclient.create_dataset(dataset_namedataset_name,description天气查询Agent的测试数据集)# 添加测试用例examples[{inputs:{question:北京今天天气怎么样},outputs:{expected_answer:北京天气晴朗气温25°C,expected_tools:[get_weather]}},{inputs:{question:上海的天气如何},outputs:{expected_answer:上海多云气温28°C,expected_tools:[get_weather]}},{inputs:{question:帮我查一下深圳天气再搜一下深圳的旅游景点},outputs:{expected_answer:深圳小雨30°C深圳旅游景点包括世界之窗、欢乐谷等,expected_tools:[get_weather,search_web]}}]# 批量添加示例client.create_examples(inputs[{question:ex[inputs][question]}forexinexamples],outputs[{reference:ex[outputs][expected_answer],expected_tools:ex[outputs][expected_tools]}forexinexamples],dataset_iddataset.id)4.4 定义评估器fromlangsmith.evaluationimportRunEvaluatorfromlangsmith.schemasimportExample,Run# 1. 答案正确性评估器使用LLM-as-Judgedefanswer_correctness_evaluator(run:Run,example:Example)-dict:评估Agent的最终答案是否正确# 获取Agent的输出和标准答案predictionrun.outputs.get(output,)referenceexample.outputs.get(reference,)# 使用LLM判断语义等价性judge_llmChatOpenAI(modelgpt-4o-mini,temperature0)judge_promptf 判断以下两个回答是否在语义上等价表达相同的意思。 标准答案{reference}Agent回答{prediction}只输出是或否。 resultjudge_llm.invoke(judge_prompt)is_correct是inresult.contentreturn{key:answer_correctness,score:1.0ifis_correctelse0.0}# 2. 轨迹评估器检查工具调用是否正确deftrajectory_evaluator(run:Run,example:Example)-dict:评估Agent的工具调用轨迹是否正确expected_toolsexample.outputs.get(expected_tools,[])# 从运行中提取工具调用actual_tools[]ifhasattr(run,trace)andrun.trace:forchildinrun.trace.get(children,[]):ifchild.get(name)inexpected_tools:actual_tools.append(child.get(name))# 检查是否调用了所有预期工具all_calledall(toolinactual_toolsfortoolinexpected_tools)# 检查是否调用了不该调用的工具可选no_extralen(actual_tools)len(expected_tools)return{key:trajectory_correctness,score:1.0if(all_calledandno_extra)else0.0,comment:f预期工具:{expected_tools}, 实际调用:{actual_tools}}4.5 运行评估fromlangsmith.evaluationimportRunEvalConfig# 定义评估配置eval_configRunEvalConfig(evaluators[answer_correctness_evaluator,trajectory_evaluator],max_concurrency1# 并行执行数量)# 运行评估deftarget_agent(inputs:dict)-dict:待评估的Agent函数resultagent.invoke({messages:[{role:user,content:inputs[question]}]})return{output:result[messages][-1].content}resultsevaluate(target_agent,datadataset_name,evaluatorseval_config,experiment_prefixweather_agent_v1)print(f评估完成查看结果{results.url})4.6 分析结果评估完成后可以在LangSmith仪表板中按answer_correctness分数筛选找到回答错误的案例按trajectory_correctness分数筛选找到工具调用错误的案例对比不同版本的Agent性能发现回归五、实战用agentevals做轨迹匹配评估fromagentevals.trajectory.matchimportcreate_trajectory_match_evaluatorfromlangchain_core.messagesimportHumanMessage,AIMessage,ToolMessage# 创建轨迹匹配评估器trajectory_evaluatorcreate_trajectory_match_evaluator(trajectory_match_modestrict,# 严格匹配模式)# 定义参考轨迹期望的执行路径reference_trajectory[HumanMessage(content北京天气怎么样),AIMessage(content,tool_calls[{id:call_1,name:get_weather,args:{city:北京}}]),ToolMessage(content北京晴25°C,tool_call_idcall_1),AIMessage(content北京今天天气晴朗气温25°C。)]# 实际执行Agent获取轨迹resultagent.invoke({messages:[HumanMessage(content北京天气怎么样)]})actual_trajectoryresult[messages]# 评估evaluationtrajectory_evaluator(outputsactual_trajectory,reference_outputsreference_trajectory)print(f轨迹匹配结果:{evaluation})# {key: trajectory_strict_match, score: True, comment: None}四种匹配模式的应用场景模式代码适用场景stricttrajectory_match_modestrict测试严格的执行顺序如“先身份验证再操作”unorderedtrajectory_match_modeunordered验证信息检索工具调用顺序不重要subsettrajectory_match_modesubset确保Agent不调用超出范围的工具supersettrajectory_match_modesuperset验证Agent至少完成了最低要求的操作六、Deep Agents的评估经验LangChain团队在构建Deep Agents复杂、有状态的长期运行Agent时总结了四条关键经验经验1每个测试用例需要独立的成功标准传统LLM评估中所有数据点使用相同的评估逻辑。但Deep Agent不同——每个测试用例的“成功标准”可能完全不同。例如一个日历调度Agent需要验证Agent是否调用了edit_file修改memories.mdAgent是否在最终消息中告知了用户memories.md文件是否确实包含了正确的记忆内容经验2单步运行验证决策单步运行Single Step可以快速验证Agent在特定场景下的决策是否正确而且节省Token。经验3完整轨迹测试最终状态完整轨迹Full Turn用于测试Agent的最终状态——不仅看最终答案还要检查工具调用序列和状态变化。经验4多轮对话模拟真实交互多轮对话Multiple Turns模拟真实的用户交互但需要“保持在轨道上”——不能让对话无限发散。七、Agent评估最佳实践7.1 评估策略组合阶段评估方式频率开发阶段单元测试 单步决策评估每次代码变更集成阶段完整轨迹评估每次PR预发布数据集批量评估版本发布前生产环境在线评估 实时监控持续7.2 离线评估 vs 在线评估维度离线评估在线评估时机上线前生产环境实时数据固定数据集真实用户流量目的发现回归、对比版本检测实时问题、度量质量反馈慢批量运行快实时7.3 评估器类型选择评估器类型适用场景优缺点规则匹配精确格式、工具名称快速、确定性强、覆盖面窄LLM-as-Judge语义正确性、有用性灵活、覆盖面广、成本高、不稳定轨迹匹配工具调用顺序精确控制、需定义参考轨迹人工评估最终验收最可靠、最慢、最贵7.4 常见陷阱陷阱1只测最终答案不测轨迹只看最终答案可能会掩盖Agent走“弯路”的问题——答案对了但调了不该调的工具、浪费了Token。陷阱2测试数据泄露不要在训练/开发数据上测试。用独立的、未在Agent开发过程中见过的测试集。陷阱3忽略成本评估Agent不仅要“做对”还要“做得便宜”。跟踪Token消耗和API调用次数。八、实战小练习作业练习构建客服Agent的完整评估体系需求构建一个简单的客服Agent支持查询订单状态、退款、产品咨询在LangSmith中创建包含10个测试用例的数据集实现三种评估器答案正确性评估器LLM-as-Judge轨迹评估器检查工具调用是否正确成本评估器检查Token消耗是否在预算内运行评估并分析结果提示代码框架fromlangsmithimportClientfromlangsmith.evaluationimportevaluate# 1. 定义Agenttooldefcheck_order(order_id:str)-str:查询订单状态returnf订单{order_id}状态已发货tooldefprocess_refund(order_id:str)-str:处理退款returnf订单{order_id}退款处理中# 2. 创建数据集clientClient()datasetclient.create_dataset(dataset_namecustomer_service_test)test_cases[{question:我的订单12345到哪了,expected_tools:[check_order]},{question:我要退款订单号67890,expected_tools:[process_refund]},# ... 添加更多测试用例]# 3. 定义评估器defanswer_correctness(run,example):# LLM-as-Judge评估passdeftrajectory_correctness(run,example):# 检查工具调用passdefcost_evaluator(run,example):# 检查Token消耗pass# 4. 运行评估resultsevaluate(target_agent,datadataset_name,evaluators[answer_correctness,trajectory_correctness,cost_evaluator])结语今天这节课我们全面学习了Agent的评估与测试知识点核心内容为什么评估很难Agent输出非确定性需要多层级测试四个评估层级单元测试→单步决策→完整轨迹→多轮对话核心指标体系任务完成率、工具调用准确率、目标达成度、成本LangSmith全链路评估平台30模板离线在线Ragas开源Agent指标库ToolCallAccuracy等agentevals官方轨迹匹配包四种匹配模式Deep Agents经验每个测试用例独立标准、多轮对话模拟真实交互最佳实践离线在线组合、多类型评估器、成本监控至此模块五工程篇的第19节已完成课时内容状态第19节Agent的评估与测试✅第20节Agent的部署与上线待生成第21节Agent的可观测性与监控待生成第22节Agent的性能优化待生成下节课第20节我们将学习Agent的部署与上线——如何将Agent封装为RESTful API、服务化架构设计、异步处理与任务队列让你的Agent真正走向生产环境如果觉得有帮助欢迎点赞、收藏、评论三连我们下节课见 本文是《AI Agent开发实战》课程第19节的完整内容系列文章持续更新中关注我不迷路
返回列表