反模式
以下每一項在當下看起來都很合理,這正是為什麼值得事先把它們一一點名出來。
背後空無一物的關卡
一個原本該由人去更新的狀態欄位,卻沒有任何東西真的在關注它或依據它的變化採取行動。代價:它在審查時看起來像是有把關機制,實際上到了正式環境卻完全沒有——東西送出去了,卻沒有人真的核准過。解法:把這個欄位接上真正依賴它的東西,並且完整跑過整條路徑——包括「還沒有人做決定」這種情況——確認到底,才能說它已經完成。
填在儲存格裡的決定
一個人被要求在數據表裡編輯一個值來核准。代價:那個值藏在一個他們沒有理由打開的表格裡,要儲存後才會生效,沒有一個業務人員會把它當成在做決定——於是核准來得很晚,或根本不來。解法:在他們原本工作的地方請他們決定:一封卡片式的電子郵件,按鈕會開啟確認頁面,文件就在眼前,之後再把決定記錄到那一列上。請參見人工核准。
問了就卡住的請示
一個建置向某人請示決定,卻在那裡停住。決定被記錄下來了,但下游什麼都沒有跟著動:文件沒有寄出,提出請示的人也沒有被告知,得靠他自己發現,再回頭重新問一次。代價:它通過得了審查,卻在正式環境中失敗——工作記錄下來了卻沒有做完,得靠人手動去追。解法:把「請示」設計成一有答案(核准、駁回,或懸而未決)就會自動接續下去,讓流程自己把事情做完,或至少自己回報結果。
言之鑿鑿的摘要
一段 AI 產生、讀起來順暢,但背後其實什麼都沒有支撐的答案。代價:它正因為讀起來很有說服力才能通過審查,於是有人依據一個誰也追溯不出來源的數字做出決定。解法:要求每一個數字都必須附上它所依據的紀錄;答案不在資料裡時,就直接明講,而不是硬填一個進去。
可以跳過的計算步驟
沒有任何機制強制把運算導向一個專屬、可查核的步驟,於是負載一高,AI 就自己把算式算完了。代價:它大部分時候算得沒錯,這才是危險所在——出錯的情況少見又不出聲,很容易一直沒被發現,直到有人去查核。解法:每一次都把所有運算導向同一個專屬的計算步驟,並顯示所用的輸入值。
寫進提示詞裡的規則手冊
把限制、標準或門檻寫進 AI 的指示裡,而不是當成可編輯的資料存放。代價:業務人員沒辦法自己改一個數字,得經過工程師;也沒有人能查出某個案件到底是哪一條規則觸發的。解法:把規則當成資料,存放在非工程背景的人也能直接開啟、編輯的紀錄上。
另立門戶的副本
把一個已經在運作的建置內部邏輯複製一份,做出一個近乎相同的版本來對付新案件,而不是把原本那個參數化。代價:多了兩份要維護、卻會悄悄愈走愈遠的東西,而且下一個接手的人往往根本不知道還有第二份副本存在。解法:用參數化取代複製。如果真的需要獨立的第二個版本,就給它自己的名字、自己的文件說明,而不是讓它冒充成原本那一個。
手工打造的捷徑
用自訂程式碼去做平台早已內建的事,通常只是因為沒有人事先查過。代價:它通常需要一個原生做法根本用不到的憑證,而且一旦建置搬到別的帳號,就會馬上失靈。解法:寫任何程式碼之前,先查過平台目前的功能清單。詳見原生優先。
未經核對的擷取結果
不加比對就直接信任一份擷取結果,沒有拿它和原本要求的內容核對。代價:沒有人拿輸出結果對照欄位清單時,漏掉一個欄位很容易被忽略過去。解法:每一次都拿結果對照欄位清單核對,欄位清單一長,就拆成好幾個各自專注的檢查步驟來做。
檢索式計數
把計數或引用型的問題——「有多少」「哪一份文件、在哪一頁說的」——當成搜尋型問題來處理。代價:這類問題需要結構化紀錄才能精確回答;光靠檢索沒辦法把推演過程攤開來看。解法:把材料索引成結構化紀錄,再去查詢它們。把搜尋與檢索留給真正的「我該怎麼做」型問題。
搶先觸發
一個流程對一連串相關活動裡最早出現的第一筆就做出反應,而不是等這一波活動穩定下來。代價:結果在其餘相關項目到齊之前就已經產生,等它們一到,這個結果不是錯誤就是不完整。解法:等這一波活動安靜下來,再一次性、依完整全貌採取行動。
輕信的關卡
一個核准步驟,讀的是 AI 剛剛提出的數字,而不是自己依底層紀錄獨立算一次。代價:一個錯誤的數字可能就這樣核准了自己,因為從來沒有人拿它和源頭核對過。解法:這個關卡永遠自己重新推算一次答案。
自我回報
一個建置自己回報自己的成功——一段看起來煞有其事、貼上來的結果,或是一個從來沒有人真正看著它跑過的「已完成」「上線中」狀態。代價:對一個從未被真正觀察過的狀態,卻有了信心。解法:自己動手跑一次,親眼看著它發生,唯有真的有人看過它運作,才能說它可以動了。
繞過隱私防線的捷徑
為了回答一個棘手的問題,暫時把一份原始、敏感的資料庫直接接上 AI。代價:敏感資料與 AI 之間的隔離,正是整個隱私保證的全部內容,而這麼做,哪怕只是一瞬間,也已經讓這個保證悄悄失效。解法:絕不連接,哪怕只是短暫一下。如果一個問題真的需要原始資料才能回答,那就代表這個問題根本不該問這個 AI。
藏在提示詞裡的標準答案
把預期答案——示範時該顯示的數字——直接寫進代理人自己的指示裡。代價:示範會通過,背後的工具卻是錯的,而且要等到有人問了一個真正的問題,才會被發現。解法:預期數值只放在測試集裡,絕不放進指示裡;代理人上線前的檢查,會拒絕任何含有這些數值的指示。
把記憶當成資料來源
代理人用它記得的內容,或是很久以前附加給它的某份文件,去回答一個即時資料的問題,而不是去讀眼前的來源。代價:一個講得很篤定、內容卻是昨天數字的答案。解法:回答即時資料問題的代理人,不附加任何文件;給它一條固定規則,絕不把數字存進記憶、也絕不憑記憶作答;並保留一道能抓出過時答案的測試問題。至於需要維持一場對話的代理人,則要保留該對話自己的歷史紀錄——它需要靠這個,才能在後續堅持自己稍早說過的話。
數字有爭議就讓步
某人提出自己的數字,代理人就放棄它原本正確、由工具算出來的數字,去附和對方。代價:答案變成了對話中最有把握的那個人說了算。解法:給代理人一條質疑規則——重新跑一次工具、試著用工具重現對方的數字,並清楚說明每個數字各自涵蓋什麼。
樞紐分析表的快照
把轉換後試算表裡的樞紐分析表,當成它還在即時運算來讀。當一份 Excel 活頁簿被轉成 Google Sheets 時,裡面的樞紐分析表會停在轉換當下顯示的數值,不再更新。代價:從樞紐分析表拿到的每一個數字,都凍結在轉換當天,不管底下的資料列多新都一樣。解法:從原始資料列直接運算,並在任何顯示樞紐分析表的地方註明這一點。
一次塞進整份工作表
把一整份龐大的試算表或表格,一次全部丟給代理人在單一輪對話裡處理。代價:這已經超過代理人一次能消化的量,後續的一切都建立在一份看似完整、實則只讀了一部分的內容上。解法:用平台自身的讀取步驟來讀取,在一個計算步驟中加總,只把算好的數字連同它們所依據的資料列、篩選條件與日期一起交給代理人。詳見原生優先。
沒人用的共用元件
因為感覺上「應該會有用」而建置出來的東西,結果從來沒有真的被重複使用,卻還是持續被維護著。代價:持續投入維護成本,卻換不回任何價值,還讓人誤以為這個建置比實際上更模組化。解法:除非至少有兩個真實、獨立、有名有姓的需求存在,否則不要把某個東西標記為「可重複使用」。