iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Modern Web

WebMCP:30 天打造 AI Agent 看得懂、也操作得動的網站系列 第 19 篇

Day 19|WebMCP Demo 能跑不代表可靠:我用 30 組 Prompt 建一套 Tool 回歸測試

  • 分享至 

  • xImage
  •  

本篇重點

API Test 只能證明 search_products() 沒壞,不能證明 Agent 遇到「我想買一個適合通勤的耳機」會選它。

Chrome 官方 WebMCP Evals 文件把測試拆得很清楚:Tool 本身仍要寫 deterministic tests;只要碰到模型判斷,就需要 evals,包含 Tool Selection、Arguments、Tool Chain 與完整 User Journey。

今天建立一份 30 組 Prompt Dataset,之後每改 Description/Schema 都能重跑。

先分四種測試

1. Deterministic Tool Test

不需要模型:

const result = await searchProducts({
  keyword: 'keyboard',
  maxPrice: 1500
});

console.assert(result.every(item => item.price <= 1500));

測 Business Logic。

2. Tool Selection Eval

Prompt:找 1500 元以下的鍵盤
Expected Tool:search_products

3. Argument Eval

{
  "keyword": "鍵盤",
  "maxPrice": 1500
}

4. End-to-end Eval

search_products
→ get_product
→ add_to_cart
→ get_cart

測整條 journey。

我的 30 組 Dataset

Search Posts:5 組

01 幫我找 WebMCP 的教學文章。
02 有沒有 WordPress REST API 的介紹?
03 找最近寫的 AI Agent 內容。
04 我想看 WooCommerce 技術文章。
05 找一篇不存在主題 xyz-123 的文章。

Expected:search_posts。

Search Products:5 組

06 找 2000 元以下的耳機。
07 有沒有機械鍵盤?
08 我想買一個適合旅行的滑鼠。
09 找黑色 M 號外套。
10 幫我找一個不存在的商品 xyz-123。

Expected:search_products。

Orders:5 組

11 我上次買的鍵盤出貨了嗎?
12 查訂單 1234。
13 上個月我買了哪些東西?
14 我之前買過這款耳機嗎?
15 幫我看最近一筆訂單狀態。

Expected:search_orders / get_orders 類 Tool。

Negative Cases:5 組

16 幫我解釋 JavaScript closure。
17 今天天氣如何?
18 幫我寫一封請假信。
19 1+1 等於多少?
20 你覺得這個網站好看嗎?

Expected:不要硬呼叫無關 WebMCP Tool。

Multi-step:5 組

21 找 1500 元以下鍵盤,第二個加入購物車。
22 找 WebMCP 文章,打開最相關的一篇。
23 找耳機,告訴我第一個的規格。
24 看購物車,移除最貴的商品。
25 找商品 A 並加入兩件,再告訴我購物車總額。

Expected:多 Tool chain。

Ambiguous / Edge Cases:5 組

26 找蘋果。        # 可能是商品?文章?
27 我之前那個呢?   # context dependent
28 幫我處理訂單。   # 意圖不明
29 買第二個。       # 需要前文
30 幫我全部弄好。   # 不應直接猜高風險行為

這五組最有價值,因為 Production 使用者不會永遠像測試工程師一樣講完整句子。

Dataset 格式

可以用 JSON:

{
  "id": "product-001",
  "messages": [
    {
      "role": "user",
      "content": "找 1500 元以下的鍵盤"
    }
  ],
  "expectedCall": [
    {
      "functionName": "search_products",
      "arguments": {
        "keyword": "鍵盤",
        "maxPrice": 1500
      }
    }
  ]
}

📸 圖片 1|30 組 WebMCP Regression Dataset
https://ithelp.ithome.com.tw/upload/images/20260928/20121296uDa7eNGcTC.png

這和 Chrome 官方 Evals 文件展示的 expectedCall 思路一致。

不要只計一個總準確率

我會至少拆:

Tool selection accuracy
Argument accuracy
Negative-call accuracy
Sequence accuracy
Task completion rate

如果總分 90%,但 confirm_checkout 常常被提前呼叫,那個 90% 沒什麼安慰作用。

高風險 Tool 應該單獨看 False Positive。

Mid-chain Failure 也要測

例如:

search_products ✅
add_to_cart ✅
apply_coupon ❌
confirm_checkout ???

如果折價券失敗,Agent 是:

A. 停下來告知使用者
B. 默默用原價結帳

兩者差非常多。

官方 Evals 文件也特別提醒要測 Tool Chain 中途失敗時的行為。

發佈文章時不要假裝 Dataset = Result

這篇的 30 組是測試集,不是測試成績。

真正成績需要記錄:

Agent / Model
Chrome version
Tool definitions version
Run count
Date

📸 圖片 2|Evals 的實際分類結果
https://ithelp.ithome.com.tw/upload/images/20260928/201212963f0l8wh9pJ.png

因為模型和 WebMCP 都會更新。

可帶走的重點

  1. JavaScript Tool Logic 繼續用 deterministic test。
  2. Tool Selection / Arguments / Chain 要用 evals。
  3. Dataset 一定要有 Negative、Ambiguous、Multi-step Cases。
  4. 高風險 Tool 要特別看 False Positive。
  5. 測試資料與測試結果要分開,不要假裝跑過。

參考資料


上一篇
Day 18|只改一行 Description,AI 就選錯 Tool?實測 Tool Description 的 A/B 方法
下一篇
Day 20|網站上的一句話就能騙 Agent?Prompt Injection 與 WebMCP 的安全邊界
系列文
WebMCP:30 天打造 AI Agent 看得懂、也操作得動的網站 共 20 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言