Semantic Kernel Plugin 的錯誤處理

先前我們提到了透過Semantic Kernel,可以讓AI/LLM在與用戶對談的過程中,自動在需要的時候去呼叫 PlugIn 物件的方法(Method),特別的事情是,這個呼叫並非是我們寫程式去做的,而是 AI 自己做的,我們並沒有寫這部分程式碼的邏輯,我們寫的只是提示(prompt)而已。

那問題來了,如果不是我們寫程式去呼叫這個方法,而是AI自己去呼叫的,那假設,這個被呼叫的方法裡面發生了 Exception ,那會發生什麼事情!?

我們看底下這段程式碼:

public class LeaveRequestPlugin
{
   [KernelFunction]
   [Description("取得請假天數")]
   public int GetLeaveRecordAmount([Description("要查詢請假天數的員工名稱")] string employeeName)
   {
       isRock.LineBot.Bot bot = new LineBot.Bot(ChannelAccessToken);
       bot.PushMessage(AdminUserId, $"[action : 查詢 {employeeName} 假單]");

       if (employeeName.ToLower() == "david")
           return 3;
       else if (employeeName.ToLower() == "mary")
           throw new System.ArgumentOutOfRangeException("無法取得假單資料");
       else
           return 5;
   }
(...略...)
}        

請注意上面這段查詢員工請假天數的程式碼,你會發現,我們刻意在程式碼裡面,加入了底下這段 code:

(...略...)
  else if (employeeName.ToLower() == "mary")
      throw new System.ArgumentOutOfRangeException("無法取得假單資料");
(...略...)

當用戶查詢 Mary 的請假記錄時候,我們故意讓系統發生 ArgumentOutOfRangeException ,我們來看執行的結果:
enter image description here

你會發現,有趣的是,當Exception發生的時候,系統並沒有直接崩潰,LINE Bot也沒有已讀不回,反倒是AI自動給了用戶一個可愛的錯誤訊息:

哎呀,看起來我們遇到了一點問題,無法取得 Mary 的假單資料。可能是系統出了點錯誤,或者是目前沒有 Mary 的假期記錄。需要我幫您查詢其他事情嗎?

這個錯誤訊息是從哪裡來的? 是真實的嗎? 還是其實是 AI 自己的幻覺? 我們來看程式碼:

 throw new System.ArgumentOutOfRangeException("無法取得假單資料");

從程式碼我們知道,是真的有 “無法取得假單資料” 這樣的Error Message被拋出,只是 AI/LLM 接手了這個錯誤訊息,並且自己做了包裝,然後告知用戶。

那如果,我們繼續打破砂鍋問到底呢? AI會給什麼回覆? 請看:
enter image description here
如上圖所示,AI乖乖地依照用戶的要求,把錯誤訊息呈現出來。甚至還會解釋這個錯誤發生的可能原因!!!

這AI(嚴格來說是SK框架)也算是夠貼心的,可以把本來會造成系統崩潰的狀況,自動包裝成用戶可以接受並理解的訊息。這讓對談機器人在面對例外狀況的時候,也能夠以自然語言的方式來輸出與呈現,避免造成無預期的崩潰。

雖然,跟過去我們所理解的一樣,如果不在Prompt當中做一些防範措施,AI可能會洩漏過多我們不想讓用戶知道的資訊。

但不論如何,從過去的例子中我們已經發現,AI/LLM可以透過自然語言對談,自動決定要呼叫 PlugIn 類別的哪個方法,現在, AI 還自動幫我們作 try…catch 錯誤處理並直接做出適當的回應,這些現象都讓我們知道,AI對於自然語意的理解,已經達到了可以在真實世界裡正式使用的程度了。

後話:

一直有人在爭論著, AI 是否將會取代開發人員,但我逐漸開始覺得,AI會不會寫程式很可能根本是一個假議題,因為AI根本不需要會寫程式,廣義來說,AI本身就是程式,因此它根本不需要再去"寫"程式(產生程式碼是人類的需要,不是AI的需要),它只需要依照需求做出正確的判斷即可。

人類之所以需要寫程式,是因為程式碼是一個橋樑(人類跟電腦之間的橋樑),我們想要讓電腦依照我們寫的程式碼來運作。但如今,倘若電腦(AI)本身已經可以作判斷、作動作了,那又何必需要再寫什麼程式? 就好比,你完全不需要寫程式告訴你的助理說,他該做些什麼,然後他再依照你寫的程式去做,你根本只需要"直接"告訴你的助理,他該做些什麼就好了呀。

換言之,過去我們必須透過寫程式才能操控電腦的時代,可能就快要過去了,或許未來,我們真的只需要告訴電腦我們想叫它做的事情,它就自己會設法完成了,那屆時,程式碼還有存在的必要嗎?

留言

這個網誌中的熱門文章

在POC或迷你專案中使用 LiteDB

使用Qdrant向量資料庫實作語意相似度比對

專業的價值...

使用 Airtable 在小型需求上取代傳統資料庫

周末讀書會 - 一如既往