前言
以前的客服對話機器人,可以讓用戶詢問 FAQ 的內容。
如果用戶有其他的服務,就需要判斷用戶的意圖,走那個意圖的流程。
例如,判斷到用戶輸入要退貨,走退貨的流程,
跑一個退貨的卡片出來,或是一個問題一個問題地讓用戶輸入我們所需要的資料。
所以客服對話機器人後端可能需要
1.FAQ 的問答集,2.取用戶意圖的服務,3.取得對話中的 Entity(地點、人名、金額…)
有了 OpenAI 及 Semantic Kernel 後,一切將變的非常容易,而且還很有彈性哦~
實作
以下以PChome 常見問題來測試,
1. 將常見問題存到 Memory,讓用戶來查詢
透過MemoryBuilder.WithPostgresMemoryStore,將PChome 常見問題存到PostgreSQL(ISemanticTextMemory.SaveReferenceAsync)之中
1 | var memoryDeploymentName = "aoai的 embedding model,例如 ada002"; |
執行完成後。
可以發現PostgreSQL中會自動建立pchomefaq這個 Table,並存放常見問題,
2. 建立 Plugin 來賦與 Chatbot 能力
我們需要 Chatbot 除了可以讓用戶查詢 FAQ 外(Ask),還要可以處理退貨(ReturnGoods)、退貨進度(CheckReturnReceiptProgress)及退款進度(CheckRefundProgress)等服務,所以以要傳入ISemanticTextMemory,如下,
1 | public class PCHomePlugin(ISemanticTextMemory textMemory) |
3. 透過 Semantic Kernel 將 LLM, Plugin 及 Memory 整合起來服務用戶
1 | var memoryDeploymentName = "aoai的 embedding model,例如 ada002"; |
測試
1. 詢問常見問題
詢問我一定要成為會員,才能在PChome 24h購物中訂購商品嗎?,會將會員相關內容透過LLM總結回覆,如下,
2. 申請退貨
輸入我要退貨,LLM 會判斷要呼叫ReturnGoods這個 Function,並詢問用戶取得需要的參數值。
當收到用戶輸入的參數值後,會透過Semantic Kernel來呼叫ReturnGoods,並帶入參數,如下,
最後將ReturnGoods的結果,透過LLM總結回覆,如下,
3. 查詢收貨進度
輸入我有申請退貨的商品什麼時候要來收呢?,LLM 會判斷要呼叫CheckReturnReceiptProgress這個 Function,並詢問用戶取得需要的參數值。
當收到用戶輸入的參數值後,會透過Semantic Kernel來呼叫CheckReturnReceiptProgress,並帶入參數,最後將CheckReturnReceiptProgress的結果,透過LLM總結回覆,如下,
總結
原本需要很多 AI 服務,並需要開發人員去寫出各種複雜的程式流程,
當透過Semantic Kernel來協調整合LLM、Memory及Plugins後,
一切變很容易很多。
當然,這其中還有許多要克服的事,例如,
1.使用 ChatGPT3.5 會有參數幻覺問題(hallucinate parameters),不會問用戶,會直接給參數值
2.LLM 總結回覆花費蠻多時間
3.查詢 FAQ 是否準確
…
但不可否認,這是一個美好的開始,讓寫 Chatbot 更容易、更有彈性。
參考資源
Semantic Kernel
Semantic Kernel | 如何建立智慧助理(Agent)
Semantic Kernel(SK) Orchestration for Healthcare Administrative operations
實體擷取預建模型
PChome 常見問題
Vector Embeddings, Dimensionality, and Retriever-Augmented Generation
一隻手只捉到一條魚: 勸人做事要專一,以免貪多嚼不爛,應作明確的抉擇。