系列在地化的客服機器人第 1 篇
客服機器人最貴的那句話,是它猜出來的
我們把 Desk 外面那層程式整個拿掉,同一個模型、同一份文件、同一組三十題,只看它會變成什麼樣子。它變得很會講話:丟一行亂碼給它,它回一段通順的中文,後面還掛著一個對不上的出處編號。輸入 token 多 5.6 倍、每題成本多 4.6 倍,而且五分之一的回答宣稱有依據卻驗不到。這篇是那張對照表,以及表上有兩列會騙人。
我們對一個沒有外層程式的客服機器人打了這一行:
asdfgh qwerty zzzz
它回:
您好,您輸入的內容無法理解,請問有什麼具體問題或需求嗎?[4]
來源 [4] 是「配送方式」。
換一題,用英文問一間只在台灣出貨的店:「Where is your nearest branch in Osaka?」它回了一段關於本島與離島配送的中文,然後掛上 [28]。
客服機器人真正的風險不是答錯。答錯看得出來,客人會回一句「不是這個」。真正的風險是答得很像對的:語氣得體、格式正確、後面還跟著一個編號。那個編號是唯一讓人願意相信前面那句話的東西,而它可以完全是假的——上面兩題就是。所以我們把外面那層程式拿掉,量了一次它會變成什麼樣。
拿掉的是三件事,不是一個開關
「有 harness」和「沒有 harness」的差別,是模型外面那三件事:
- 檢索選段——把語料切成一段一段,逐段對問題計分,只把分數最高的幾段放進提示。
- 一段都對不上就早退——不呼叫模型,直接說資料裡沒有,並給人。
- 事後驗引用——答案裡的每個編號,對回這一次真正送出去的那幾段。
拿掉之後,剩下的就是把整份語料塞進提示,然後相信模型。同一個模型、同一份 28 段語料、同一個系統提示產生器、同一組 30 題,只有這三件事被拔掉。
那兩題亂碼與大阪分店,在有 harness 的那一側都是同一個結果:沒有呼叫模型。
帳單上的差是 4.6 倍
讓供應商回報 token 之後,「提示比較小」可以換成帳單上的數字。同一個模型(llama3.1:8b)、同一組 30 題、一輪:
| 有那三件事 | 沒有 | |
|---|---|---|
| 平均送進模型的來源 | 3 段 / 240 字 | 28 段 / 2,076 字 |
| 平均 token 進 / 出 | 497 / 30 | 2,768 / 38 |
| 每題成本(假設 $1 / $5 per Mtok) | $0.000647 | $0.002959 |
| 30 題全部答得可接受 | 30 / 30 | 23 / 30 |
字數比是 8.6 倍,token 比是 5.6 倍。差在中文字元跟 token 不是一對一——這正是為什麼要量 token,而不是從字數推估。單價是假設值,用來示範算式;真實費率到供應商後台查了再填。
有據率那一列會騙人
同一次對照裡還有兩列,它們的數字對「沒有 harness」那一側比較好看:有據率兩邊都是 100%,未知引用率有 harness 是 4%、沒有是 0%。
兩列的算法都是「答案裡的編號,有沒有出現在真正送出去的來源清單裡」。
送 3 段的時候,模型寫 [7] 會被抓到。送 28 段的時候,1 到 28 之間任何數字都是合法的。 所以未知引用率必然趨近 0,有據率必然趨近 100%。
引用要能被抓到造假,來源清單就必須短而且排過序。把整份文件塞進去,等於讓每一個編號都合法。
也就是說,沒有 harness 的那一邊在這兩列贏,是因為它的引用無法被證偽。這不是它比較好,是這個檢查在它身上失效了。同一份表上的 hit@1 / hit@5(95% / 100% 對 0% / 20%)也是同一回事:它不排序,28 段照文件順序送,期望的來源落在前五名純屬運氣。
所以後來換了一個問法:不是「編號合不合法」,是「這個回答宣稱有出處,而那個出處驗不驗得到」。用這個算法重跑,沒有 harness 那側 30 題裡有 6 題是假的——20%。有 harness 那側 0%。
早退擋掉亂碼,也擋掉了「換句話說」
這樣做的代價,最貴的一項是早退本身。
它會停下來,是因為問題跟語料一段都對不上。但「對不上」在詞面比對裡的意思很窄:文件寫「週末」,客人說「禮拜天」;文件寫「營業時間」,客人說「幾點打烊」;文件寫「會員等級」,客人說「要怎樣才能變成 VIP」。沒有一個共同的字,所以系統很誠實地說資料裡沒有——而資料裡明明有。
我們照客人會怎麼講寫了另一組 30 題,寫完才去看哪幾題詞彙接不住。純詞彙檢索 9/30 通過、hit@5 只有 30%;補上語意檢索之後是 30/30、hit@5 100%。原本那 30 題兩邊都是 90/90,沒有退步,穩態下每題多 18 毫秒。
早退不是保守,是把「我不知道」的定義交給了一個很笨的比對。 補語意檢索補的是這個洞,不是讓答案更漂亮。
這樣做還有什麼代價
- 28 段是很小的語料。 30 題、一輪的成本表是方向性的訊號,不是統計。換到客戶自己的文件上一定要重跑。
- 單價是假設的。 那兩個成本數字證明的是比例,不是金額。
- 多了兩個模型要顧。 語意檢索是第二個模型,地端就是第二份記憶體與第二次冷啟動——換句話說那組題的第一題花了 4.8 秒,那是嵌入模型在載入。
- hit@1 只有 50%。 對的那一段每次都送進去了,但不一定排第一。答案是對的,客人看到的第一個「依據」按鈕不一定是對的那一頁。這個沒解決。
接下來
上面每一個數字都是在自己的機器上、對著自己寫的題組量的。客人不會在那裡問問題——他們會在 LINE 上問。同一個答案要在三個通道都成立,而「成立」的意思是連底下那三個數字都要一樣。下一篇是那三個通道,以及一個只有真的瀏覽器才抓得到的 bug。