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

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

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

Alternative Text

当我们点击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个评估维度和对应的权重,我们可以继续在这基础上修改,也可以添加额外的评估维度。

![Alternative Text][1785642680893]

2. 使用Rubric Evaluator来评估Agent

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

using Azure.AI.Projects;
using Azure.Identity;
using DotNetEnv;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.AI.Evaluation;
using OpenAI;
using System.ClientModel;
using System.Text.Json;
using System.Text.Json.Serialization;

Env.Load();
var apiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;
var endpoint = Environment.GetEnvironmentVariable("OPENAI_BASE_URL")!;
var projectUrl = Environment.GetEnvironmentVariable("PROJECT_URL")!;
var agent = new OpenAIClient(new ApiKeyCredential(apiKey), new OpenAIClientOptions { Endpoint = new Uri(endpoint) })
    .GetChatClient(model: "gpt-5.3-chat")
    .AsIChatClient()
    .AsAIAgent();

var query = """
    我上周在你们店买的真丝衬衫,今天第一次洗就严重缩水变形了,根本没法穿!
    你们这衣服质量也太差了吧?
    我要退货,而且凭什么要我付运费
    """;

var reply1 = """
    亲亲,非常抱歉给您带来这么不好的购物体验。
    衣服缩水变形确实很影响心情,请您千万别着急。
    根据咱们店铺的政策,真丝材质如果出现非人为的洗涤缩水,在15天内我们是全额包办免费退换的。
    您现在可以按照以下步骤操作:在订单页面发起退货退款申请,原因选择【商品质量问题】。
    将衣服寄回至系统显示的地址,运费需要您先稍微垫付一下。顺丰或中通寄出后,请把快递单号发给在线客服。
    我们收到货核实无误后,会第一时间把您垫付的运费以及衣服全款退回到您的原账户。
    请问这样处理您可以接受吗?还有其他能帮您的吗?
    """;
var reply2 = """
    衣服缩水了可以退。
    你直接在后台申请退货就行了,原因选质量问题。
    运费我们这边会出的,你先付一下,后面再退给你。
    你把快递寄出来吧。
    """;
var reply3 = """
    真丝衣服本来就需要干洗或者用专门的丝毛洗涤剂手洗,你是不是自己用洗衣机大功率甩干弄坏的啊?
    这不一定是我们的质量问题。
    不过看在你是老客户的份上,你不用退货了,我直接在后台给你补发一件新的,运费也不用你管了。
    """;

var responses = new List<AgentResponse>
{
    new(new ChatMessage(ChatRole.Assistant, reply1)),
    new(new ChatMessage(ChatRole.Assistant, reply2)),
    new(new ChatMessage(ChatRole.Assistant, reply3))
};

var projectClient = new AIProjectClient(new Uri(projectUrl), new AzureCliCredential());

var results = await agent.EvaluateAsync(
    responses: responses,
    queries: [query, query, query],
    evaluator: new FoundryEvals(projectClient, "gpt-5.4-mini", [new GeneratedEvaluatorRef("Ecommerce-Customer-Support-Evaluator")]));
var metrics = results.Items.SelectMany(it => it.Metrics.Values).ToList();
var serializerOptions = new JsonSerializerOptions { WriteIndented = true };
serializerOptions.Converters.Add(new JsonStringEnumConverter());
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也是如此,所以这种评估方式还有待进一步完善。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐