[Agent的评估-10]利用FoundryEvals基于自定义规则对Agent进行评估

Agent的评估-09:利用FoundryEvals调用Foundry评估服务对FoundryEvals如何根据指定的评估器名称调用Foundry评估服务进行了详细的介绍。文中说到:除了预定义的原生评估器(Built-in Evaluator),FoundryEvals还支持用户自定义评估器(Rubric Evaluator)。本文将介绍如何利用FoundryEvals基于自定义规则对Agent进行评估。

1. 在Foundry Portal中创建自定义评估器

如下图所示,当我们打开Foundtry Portal并开发Evaludations页面后,可以选择Evaluator catalog选项卡查看目前可用的评估器列表。

当我们点击Create Evaluator按钮后,会进入自定义Evaludator的编辑页面。如下图所示,我们可以创建RubricPromptCode三种类型的Evaluator,这里我们选择Rubric。我们开启Auto-generate rubtic开关,并选择对应的模型和提示词后,点击Generate runbric按钮,提示词在经过进一步加工后会发送给指定的模型,并根据响应的结构定义评估规则。

接下里我们定义一个用来评估电商售后客服问答的Evaluator来评估客服的回到是否合理。我们将这个评估器命名为Ecommerce-Customer-Support-Evaluator,并定义了如下的提示词:

# Role (角色定位) 你是一名专业的电商售后客服专家,负责处理用户的退换货、投诉与情绪安抚。 # Context & Objectives (背景与目标) 用户可能会因为商品质量、物流延迟或买错商品等原因发起对话。你的目标是在安抚用户情绪的同时,严格在公司政策允许的范围内,为用户提供清晰、可执行的解决方案。 # Style & Tone (语气与风格) - 始终保持礼貌、专业、耐心,使用同理心话术(如“非常抱歉给您带来不便”)。 - 禁止使用生硬、推诿或怼客户的言论。 - 语言要精炼,分条理回答,不长篇大论。 # Constraints & Workflow (约束条件与工作流) 1. 必须先核实用户订单信息与反馈的问题。 2. 质量问题:15天内免费退换,商家承担运费。 3. 非质量问题:7天内支持无理由退货,买家承担运费。 4. 超过15天或已剪标挂牌的商品,一律不予退换。 5. 绝对不允许口头承诺政策之外的退款或补偿。

点击Generate runbric按钮之后,模型会根据提示词提取相应的评估维度和标准,并基于这些标准进行打分,最后根据这些评估维度的权重计算一个加权平均作为最终的分数。单个维度的积分为5分制,加权平均分最终需要转换成0-1之间的分数。我们可以设置评估通过的分数,此分数默认为0.5。如下图所示,系统自动提取了7个评估维度和对应的权重,我们可以继续在这基础上修改,也可以添加额外的评估维度。

2. 使用Rubric Evaluator来评估Agent

Agent的评估-09:利用FoundryEvals调用Foundry评估服务演示了如何使用Built-in Evaluator对Agent实施评估,使用Rubric Evaluator与之类似,唯一不同支持在于我们使用GeneratedEvaluatorRef来应用自定义的Rubric Evaluator。在如下的演示程序中,我们模拟了针对同一问题的三种回答,并使用上面定义的这个名为Ecommerce-Customer-Support-Evaluator的Rubric Evaluator来对它们进行评估。

usingAzure.AI.Projects;usingAzure.Identity;usingDotNetEnv;usingMicrosoft.Agents.AI;usingMicrosoft.Agents.AI.Foundry;usingMicrosoft.Extensions.AI;usingMicrosoft.Extensions.AI.Evaluation;usingOpenAI;usingSystem.ClientModel;usingSystem.Text.Json;usingSystem.Text.Json.Serialization;Env.Load();varapiKey=Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;varendpoint=Environment.GetEnvironmentVariable("OPENAI_BASE_URL")!;varprojectUrl=Environment.GetEnvironmentVariable("PROJECT_URL")!;varagent=newOpenAIClient(newApiKeyCredential(apiKey),newOpenAIClientOptions{Endpoint=newUri(endpoint)}).GetChatClient(model:"gpt-5.3-chat").AsIChatClient().AsAIAgent();varquery=""" 我上周在你们店买的真丝衬衫,今天第一次洗就严重缩水变形了,根本没法穿! 你们这衣服质量也太差了吧? 我要退货,而且凭什么要我付运费""";varreply1=""" 亲亲,非常抱歉给您带来这么不好的购物体验。 衣服缩水变形确实很影响心情,请您千万别着急。 根据咱们店铺的政策,真丝材质如果出现非人为的洗涤缩水,在15天内我们是全额包办免费退换的。 您现在可以按照以下步骤操作:在订单页面发起退货退款申请,原因选择【商品质量问题】。 将衣服寄回至系统显示的地址,运费需要您先稍微垫付一下。顺丰或中通寄出后,请把快递单号发给在线客服。 我们收到货核实无误后,会第一时间把您垫付的运费以及衣服全款退回到您的原账户。 请问这样处理您可以接受吗?还有其他能帮您的吗?""";varreply2=""" 衣服缩水了可以退。 你直接在后台申请退货就行了,原因选质量问题。 运费我们这边会出的,你先付一下,后面再退给你。 你把快递寄出来吧。""";varreply3=""" 真丝衣服本来就需要干洗或者用专门的丝毛洗涤剂手洗,你是不是自己用洗衣机大功率甩干弄坏的啊? 这不一定是我们的质量问题。 不过看在你是老客户的份上,你不用退货了,我直接在后台给你补发一件新的,运费也不用你管了。""";varresponses=newList<AgentResponse>{new(newChatMessage(ChatRole.Assistant,reply1)),new(newChatMessage(ChatRole.Assistant,reply2)),new(newChatMessage(ChatRole.Assistant,reply3))};varprojectClient=newAIProjectClient(newUri(projectUrl),newAzureCliCredential());varresults=awaitagent.EvaluateAsync(responses:responses,queries:[query,query,query],evaluator:newFoundryEvals(projectClient,"gpt-5.4-mini",[newGeneratedEvaluatorRef("Ecommerce-Customer-Support-Evaluator")]));varmetrics=results.Items.SelectMany(it=>it.Metrics.Values).ToList();varserializerOptions=newJsonSerializerOptions{WriteIndented=true};serializerOptions.Converters.Add(newJsonStringEnumConverter());Console.WriteLine(JsonSerializer.Serialize(metrics,serializerOptions));

输出:

[{"$type":"numeric","Value":0.66388888888888884,"Name":"Ecommerce-Customer-Support-Evaluator","Reason":null,"Interpretation":{"Rating":"Good","Failed":false,"Reason":null},"Context":null,"Diagnostics":null,"Metadata":null},{"$type":"numeric","Value":0.34583333333333331,"Name":"Ecommerce-Customer-Support-Evaluator","Reason":null,"Interpretation":{"Rating":"Unacceptable","Failed":true,"Reason":null},"Context":null,"Diagnostics":null,"Metadata":null},{"$type":"numeric","Value":0,"Name":"Ecommerce-Customer-Support-Evaluator","Reason":null,"Interpretation":{"Rating":"Unacceptable","Failed":true,"Reason":null},"Context":null,"Diagnostics":null,"Metadata":null}]

从输出的三个指标可以看出:

  • 第一个专业的答复获得通过;
  • 第二个回答虽然政策没算错,但毫无同理心和安抚,且没有告知具体的寄送时限、寄送要求或退运费的流程细节,也只得到了0.34583333333333331分,评估并未通过;
  • 第三个回答反问并推卸责任给客户;在未核实、未退回原件的情况下,擅自违规承诺“直接补发新衣且不收回旧衣”,直接得了个零分。

从输出结果可以看出,虽然能够得到评估的结果(是否通过)和分数,但是并未给出具体的理由(Reasonnull)。而且我发现即使在定义Evaluator是指定了上下文,它也不会出现在评估指标的Context字段中。实际上不仅是自定义的Rubric Evaluator是这样,Built-in Evaluator也是如此,所以这种评估方式还有待进一步完善。