本地模型 LLM Sonnet GPT

論本地模型執行e2e測試的困難

Ghang 2026/06/03 09:00:00
5

 

研究目的:

 

目前已經有多款AI工具提供Agent Browser可以使用自然語言執行e2e的測試,UAT測試時可能會用到客戶提供的機敏資料,所以想探討本地模型是否可以取代雲端模型。

 

實作時分成兩個段落:

1. 一個模擬的電商平台,包括付款流程、動態UI/UX誤導以及跨角色流程。簡單的情境應該可以簡單通過,相對複雜的流程可以作為鑑別情境。

2. 設置本地大語言模型環境

 

本地大語言模型搭配使用的開源工具:Webwright

大多數AI Agent broswer,都是讓 LLM 一次選擇一個 UI 元件來點擊或輸入。這種方式稱為 click-by-click approach,也就是「逐步點擊」模式。它設定起來很簡單,但也讓我們很難檢查 Agent 實際做了什麼、很難重現一次執行結果,也很難重複利用測試成果。

Webwright 採用了另一種方法,稱為 code-as-action。它不是讓 LLM 一步一步點擊,而是要求 LLM 直接撰寫一份完整的腳本,使用 Playwright 來操作瀏覽器,然後執行該腳本。

這樣生成出來的腳本是一個可以被的研究的衍生物(artifact):我們可以直接拿來用,也可以比較不同模型寫出的版本。

 

在這個實驗中,code-as-action 很重要,原因包括:

  • 每次執行都會產生可檢查的腳本

 如果 Agent 成功,我們會順便得到一份可運作的測試腳本;如果失敗,我們也可以閱讀腳本,理解它到底嘗試做了什麼,而不只是從點擊紀錄中猜測。

  • 完整的失敗證據

如果腳本導向 https://example.com,而不是實際的商店網址,這比單純的點擊失敗紀錄更能說明模型到底理解錯了什麼。

  • 腳本可以重現

一旦最終腳本產生,就可以在乾淨狀態下、不依賴 LLM 重新執行。

 

測試前準備:

這邊設計了14個情境,並且實際使用Playwright測試這些流程確保情境正確,然後再將這些情境轉換成一般使用者可能會下給LLMprompt,這次文章只會用到第一個案例,原因後面會提到:

 

S01 — A customer wants to buy a Packable Rain Shell in size M. Complete the purchase.

S02 — Mina Carter (ORD-1001) wants to return her delivered order. Process the return.

S03 — A customer wants to use coupon SAVE10 when buying the Summit Hydration Pack. Does it work?

S04 — Browse the store and order an AeroTrail Runner in size 9.

S05 — You're on the AeroTrail Runner product page. Add size 9 to your cart.

S06 — A customer applies coupon WELCOME20. Did they actually save money?

S07 — Fulfill order ORD-1002 for Riley Stone. What shipping method was used?

S08 — How long does it take to get a shipping quote for the Summit Hydration Pack?

S09 — A customer has the Packable Rain Shell in their cart. Complete the payment.

S10 — Issue a refund for order ORD-1003.

S11 — Process a full return and refund for order ORD-1001.

S12 — Increase AeroTrail Runner size 11 stock by 5 units. Does a customer browsing the store see the change?

S13 — What does the reports chart show?

S14 — A customer buys the AeroTrail Runner in size 11. Operations confirms the stock decreased. Support issues a refund on that order.

 

S01是單純的購買商品情境,預設所有LLM都應該通過

 

 

本地模型的選用:

 

Qwen3 8b : 作為本地模型之間的差異比對,預設通過率不會太高

 

Deepseek-r1 14b : 大多數認為同樣級距中reasoning表現較好的選項

 

測試結果:先說結論,均「無法執行」

 

Qwen3 8b: 沒有成功造訪電商平台的URL

關鍵錯誤紀錄如下

1:嘗試執行一個不存在的 toolfinal_script_runner

2:在尚未完成任何實際工作前,就嘗試執行 self_reflection (只有任務完成後才可以呼叫的webwright指令)

3:嘗試執行尚未存在的 final_script.py

4:寫出了一個指向 https://example.com(和這邊的實驗專案沒關係的url) final_script.py

模型在讀取到「prompt裡面的完成條件」之後,就直接理解為「完成」,但實際上沒有完成任何任務。無法理解自然語言的測試指令

 

Deepseek-r1 14b: 沒有成功造訪電商平台的URL

關鍵錯誤紀錄如下:

1: LLM 執行了一段 python script (應該是想試試看可不可以執行腳本?)

 

import asyncio

async def main():

print('Done')

asyncio.run(main())

一段只會回覆Done的內容

 

2. 反覆出現heredoc terminator 的錯誤:開頭使用 <<'PY',但結尾卻錯寫成 PUB,導致 shell 無法正確判斷多行文字區塊在哪裡結束。後續它又引入新的錯誤,例如 as asyncio.run(main()) await asyncio.run(main())

3. 成功執行 print('Done') 後,它便認定整個任務完成。這是最關鍵的失敗點:模型把「Python script 可以執行」錯誤地等同於「購買流程已完成」。

4. 最後建立了一個空的 final_runs/run_001 directory,但其中沒有任何實際執行產物。

 

模型卡在一個與任務無關的code syntax 問題上,並逐漸忘記真正目標是操作 購買流程。當它解決了那個小問題後,便錯將其視為「購買任務成功」。很明顯是被自己產生的context污染

 

失敗小結:

無法穩定執行多步驟任務

兩個模型都無法在超過幾輪互動後維持一致的 plan,這是小型LLM已知且可被測量的限制。

根據 Based_research.md 引用的 FuncBenchGen benchmark,即使是 GPT-5 這類較新的雲端模型,在多步驟的任務中也只有 62.5% 的成功率。8B–14B級距的模型表現明顯更差。

像「購買一項商品」這樣的 browser agent task,通常需要 15–25 個步驟(steps)的連續決策,而且每一步都依賴前一步的結果。如果一個模型連前後步驟都無法穩定串連,就不可能穩定完成這類任務。

qwen3:8b 讀到任務描述後,看見「declare done」這類完成狀態的語句,便嘗試直接跳到 completion state,完全跳過中間的實際工作。這代表模型無法理解任務的連貫意義。

 

兩個模型都沒有真正進入 browser

由於兩個模型都在 instruction-following code generation 層級就失敗了,這代表電商平台中應該要被測試的業務邏輯都沒有被執行

那些才是更困難的問題;但本地模型還沒走到那一步,就已經失敗了。

 

 

總結:

原本以為是很單純的比較,沒想到習以為常的LLM存在這麼大的落差,根據執行時間還有log來看,本地模型或許要到70b才會有比較的意義(至少可以正確理解任務內容),無奈手邊沒有相關硬體設備足以建設這樣的環境。

本篇研究的過程中有發現另外一個有價值的比較:Sonnet vs GPT的前端/畫面操作的腳本品質,Sonnet對於畫面的捕捉較為快速、GPT則是在處理腳本中的代碼執行邏輯有優勢,但這邊就屬於雲端模型的比較,有興趣的筆者再自己試試看吧!

 

 

Ghang