WebMCP 的评估

Kasper Kulikowski
Kasper Kulikowski

发布时间:2026 年 5 月 19 日

WebMCP 支持使用生成式 AI 模型的智能体。如需测试使用生成式 AI 的任何系统,您的测试需要支持概率性结果:一个输入可能会产生数千个答案,准确度各不相同。这种测试技术称为 评估

在将工具发布到生产环境之前,您必须确认智能体了解何时调用工具、如何执行工具以及哪些答案是可接受的。在故障发生之前解决故障机会。

编写评估来测试系统与大语言模型 (LLM) 的接触点:

  • 根据工具的说明和架构,检查模型是否了解工具的用途。
  • 验证模型是否选择了具有正确参数的正确工具来支持用户意图。
  • 确认模型是否根据收到的信息采取行动,例如使用信息来调用另一个工具。
  • 验证用户体验历程是否成功。根据用户的意图,智能体能否使用提供的工具在我的网站上成功完成用户体验历程?

对于任何不与模型通信的系统交互,您都应继续编写经典确定性测试。

故障模式

开发者应测试其系统,以防止故障发生。为此,您需要了解系统何时可能会自行发生故障,以及在与外部因素交互时可能会发生故障。对于 WebMCP,工具本身可能会发生故障,智能体可能无法按预期使用工具。

WebMCP 工具可能会发生故障,智能体在使用 WebMCP 工具时可能会发生故障。 例如,假设您的用户想要将 T 恤添加到购物车。

失败 示例 问题排查
智能体无法选择正确的工具或直接调用错误的工具。

智能体跳过 addToCart 并直接转到 checkout

  • 工具的 description 是否清晰、完整且准确地反映了工具的功能?
  • functionName 是否直观且具有描述性?
  • 在当前状态/上下文中,工具是否已正确向 LLM 公开?
  • 此工具的架构是否可能与其他工具过于相似,导致调用不明确?
智能体以错误的顺序调用工具

智能体调用 checkout,然后调用 addToCart

  • 工具说明是否重叠,导致 LLM 对所需顺序感到困惑?
  • 前一个工具的输出是否为下一个工具调用提供了必要的上下文?
  • 状态是否已正确更新,并且是否已按预期向 LLM 公开任何新工具?
  • 如果某些工具以不同的顺序调用,端到端用例是否仍然正确?
  • 您是否已通过强制执行前面的调用来单独测试特定的工具调用链,以确认 LLM 选择正确的下一步?
智能体使用错误的参数调用工具

智能体调用 addToCart,但添加的是鞋子而不是 T 恤。

  • inputSchema 是否已明确定义,包括 enum 值和每个属性的良好 description
  • 所有必需参数是否都已明确标记和检查?
  • 参数的说明是否明确指导 LLM 如何将用户输入映射到预期的结构化数据(例如特定 ID 或格式)?

如果用户想要查看购物车中的内容,该怎么办?

失败 示例 问题排查
工具输出不正确或工具遗漏了某些内容。

用户要求 viewCart,但智能体输出的是购物车总金额,而不是商品名称和单价。

  • 底层工具逻辑是否存在 bug(使用确定性测试进行检查)?
  • 界面状态是否已正确更新,智能体是否收到了有关副作用的正确信息?
  • 如果 LLM 将输出用于后续调用,输出是否已清晰地格式化以供 LLM 提取?
  • 输出是否过于冗长?它是否仅包含 LLM 执行下一步操作所需的最少必要信息?

最后,工具可能会以 JavaScript 失败的任何方式失败。如需进行问题排查,请调查以下内容:

  • 工具代码是否正确处理了所有潜在的运行时错误和异常?
  • 错误是否已优雅地报告给智能体和模型?
  • 工具所依赖的外部 API 或服务是否正常运行?
  • 错误结构是否足够清晰,以便模型区分临时问题(重试)和严重故障?

单独测试工具

如果智能体无法确定要为“我想要一个小披萨”之类的请求调用哪个工具,那么它在复杂的用户体验历程中将毫无机会。

通过单独测试工具,您可以在运行浏览器模拟之前优化架构和说明。

提示:您可以使用 WebMCP 工具调用 using navigator.modelContext.executeTool(...)

衡量调用准确率

请查看我们的演示, WebMCP zaMaker。 当用户提示“我想要一个小披萨”时,您可以预期模型响应 会表明打算使用 "size":"Small"参数执行 set_pizza_size 调用。

expectedCall 函数定义了预期函数和参数。这种方法确认智能体将根据提供的架构选择正确的工具来支持用户意图。

{
  "messages": [
    {
      "role": "user",
      "content": "I'd like a small pizza."
    }
  ],
  "expectedCall": [
    {
      "functionName": "set_pizza_size",
      "arguments": { "size": "Small" }
    }
  ]
}

expectedCall 用于执行基于规则的确定性测试:

您可以将 WebMCP 工具与组件的生命周期相关联,这意味着您必须在应用状态与 WebMCP 预期状态匹配时进行测试。如需管理此问题,请提供与您要评估的状态相关的完整工具列表。例如,用户与其智能体共同浏览,并打开 WebMCP zaMaker。

应用状态

[
...
  {
    "name": "add_topping",
    "description": "Add one or more toppings to the pizza",
    ...
  },
  {
    "name": "set_pizza_size",
    "description": "Set the pizza size directly.",
    "inputSchema": {
      "type": "object",
      "properties": {
        "size": {
          "type": "string",
          "enum": [
            "Small",
            "Medium",
            "Large",
            "Extra Large"
          ],
          "description": "The specific size name."
        },
      }
    }
  },
  {
    "name": "set_pizza_style",
    "description": "Set the style of the pizza (colors/theme)",
  ...
  },
...
]

预期调用

...
 "expectedCall": [
   {
     "functionName": "set_pizza_size",
     "arguments": { "size": "Small" }
   }
 ]
...

打开时,WebMCP 会公开 add_toppingset_pizza_sizeset_pizza_style 工具。如需准确测试这些单独的工具中的任何一个,您应添加所有工具以创建模拟的完整状态。

注意:智能体可能有权访问其他工具,但您能做的最好是评估您提供的工具。

现在您知道智能体会根据需要调用正确的工具,您可以测试工具调用是否具有正确的参数,以及结果是否符合预期。有两个步骤:确定性测试和概率性测试。

运行确定性测试

由于 WebMCP 工具是使用 JavaScript 或 HTML 注释构建的,因此您可以编写确定性测试来执行以下任务:

  • 验证工具逻辑。
  • 确认依赖项已正确调用。
  • 确认用户界面已按预期更新,以及任何其他有意副作用。
  • 验证返回的信息是否与预期值匹配。
  • 验证测试参数。

例如,如果您的工具使用 SearchComponent 函数,您可以通过传递 SearchComponent 的模拟来测试。请务必模拟工具运行的环境,以获得尽可能好的结果。这与您编写另一个应用集成测试时使用的技术相同。

运行概率性测试

如果您需要模型输出才能正确调用下一个工具,则需要编写评估。

用户可能会向模型提供直接查询,明确询问工具的功能,或者提供暗示应使用工具的模糊查询。例如,“在我的披萨中添加意大利辣香肠”是一个直接查询。 “我想要披萨上的所有肉”则较为模糊,需要模型了解它需要 add_topping 工具,以及哪些配料可以定义为肉。

为评估创建数据集时,请同时添加测试基准工具执行的直接查询和测试模型推理和工具选择逻辑的开放式查询。

如果您经营一家咖啡店,您可以支持用户要求其智能体重新订购他们上个月订购的同一款咖啡。编写一个用于搜索之前订单的工具 OrderHistoryService,以及另一个用于订购咖啡的工具。如需测试订单历史记录服务,您可以发送一个返回咖啡产品 ID 的模拟。

在此示例中,您将评估模型是否了解查询的意图、选择正确的工具,以及该工具是否提供正确的信息以采取行动。 如果模型不调用 get_order_history,它将不知道要为 order_product 使用哪个 item_id

端到端测试

编写端到端测试,让您确信用户及其智能体可以成功完成其体验历程。除了测试各个工具之外,您还要测试多步操作是否按正确的顺序执行。

例如,您经营一家在线服装店。用户向其智能体询问:“我想买一件黑色夹克和一条牛仔裤。您能提供所用材料的明细吗?

成功的智能体体验历程可能如下所示:

  1. 前往服装类别。
  2. 找到其中一件所请求的服装(顺序并不重要)。
  3. 查找特定商品 (search_clothes)。
  4. 获取包含材料列表的产品详细信息 (get_product_details)。
  5. 针对每个请求的商品重复第 2-4 步。

当智能体到达第 2 步时,它可以先搜索黑色夹克或牛仔裤,顺序并不重要。但是,其余步骤必须按顺序执行。

编写端到端评估,以验证智能体是否按预期顺序调用工具:

{
  "messages": [
    {
      "role": "user",
      "content": "I am looking to buy a black jacket and a pair of jeans.
        Could you provide a breakdown of the materials used ?"
    }
  ],
  "expectedCall": [
    {
      "functionName": "navigate_to_category",
      "arguments": { "category": "clothes" }
    },
    {
      "unordered": [
        {
          "ordered": [
            {
              "functionName": "search_clothes",
              "arguments": { "query": "black jacket" }
            },
            {
              "functionName": "get_product_details",
              "arguments": { "productId": "JACKET002" }
            }
          ]
        },
        {
          "ordered": [
            {
              "functionName": "search_clothes",
              "arguments": { "query": "jeans" }
            },
            {
              "functionName": "get_product_details",
              "arguments": { "productId": "JEANS001" }
            }
          ]
        }
      ]
    }
  ]
}

评估链中故障

用户要求订购折扣披萨的工具调用示例。
当用户请求使用折扣券订购披萨时,系统会依序调用一系列工具:start_pizza_creatorset_pizza_styleset_pizza_sizestart_checkoutadd_discount_couponcomplete_checkoutadd_discount_coupon 失败,但该流程仍能完成,这意味着用户没有获得折扣。

有时,智能体必须按顺序调用多个工具。如果工具在此过程中发生故障,会发生什么情况?例如,用户想要使用优惠券代码订购披萨:

“我想要一个小香蒜酱披萨。使用我的促销代码 FreePizza。”

智能体可能会在 add_discount_coupon 处失败,并继续以全价购买披萨。如需测试 add_discount_coupon 工具,您可以手动执行此工具调用序列,而无需与模型交互,以模拟此场景。将应用置于您预计工具会失败的状态。在本例中,该状态位于 start_checkout 工具之后。然后,您可以单独评估 add_discount_coupon

试用 WebMCP

开始试用单独工具的评估,并使用任何与 WebMCP 兼容的智能体评估您自己的启用 WebMCP 的网站: