WebMCP 的评估

Kasper Kulikowski
Kasper Kulikowski

发布时间:2026 年 5 月 19 日,上次更新时间:2026 年 5 月 28 日

说明类视频 Web 扩展程序 Chrome 状态 目的
GitHub 源试用 源试用 查看 实验意向

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

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

编写评估来测试系统与大语言模型 (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 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,则不会知道要使用哪个 item_id 来实现 order_product

端到端测试

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

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

成功的智能体之旅可能如下所示:

  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 的网站: