發表文章

使用Question Answering建立QA Bot (2024)

圖片
自從大語言模型(LLM)橫空出世之後,對談機器人又迎來了一片春天。但坦白說,使用LLM進行QA Bot的設計,在答案需要比較嚴謹正確的情境下,已生成的方式來產生,其實有頗高的風險。即便你使用RAG,要能夠100%的保證AI生成的答案絕對正確,都是一個挑戰。 但,如果採用 Azure 上的Question Answering,則沒有這個問題。因為Question Answering中每一個問題的答案,都是我們事先準備好的。 底下這篇,我們來看一下如何使用Azure Custom Question Answering 來快速建立一個QA Bot。 建立 Azure Language Services 首先,你可以先在 Azure Portal 建立 Language 服務,過去中文版叫做文字分析,2024正名之後,終於改為『語言服務』: 這邊直接點選左下角按鈕: 使用預設值建立即可,我建議定價層選S: 建立好之後,在服務的『概觀』底下,可以找到『Language Studio』: 點選進入該portal,首次進入,會需要選擇 resource type 與 你剛才建立好的 Language Resource: 完成後,就會進入到Language Studio的主畫面: 選擇 Custom Question Answering 進入後,請選擇 Custom Question Answering : 點選後,可以在 Custom Question Answering 的主畫面建立新專案: 關於Azure Search 第一次建立專案時,系統可能會跳出畫面要求你連結到一個 Azure Search 服務: 如果你之前沒有建立,可以先建立一個 Azure Search : 由於它是 Question Answering 搜尋功能的主要能力來源,建議你建立一個 Standard SKU 層級以上的Azure Search服務: 同時資料中心必須與 Language 服務相同。 建立完成之後,重新建立專案, 匯入疾管署資料 App 建立完成之後,我們就可以匯入知識庫,作為QA的來源依據,讀者可以嘗試匯入疾管署的疫苗接種注意事項資料,位於: https://www.cdc.gov.tw/Category/QAPa

MSA(MS Account)個人帳號無法登入 DevTunnel !?

圖片
曾經在底下這篇文章中,介紹過 DevTunnel ,功能和作用我就不再贅述了。自從微軟提供這個免費服務之後,我在開發 LINE Bot 的時候,就以 DevTunnel 取代 NGROK 許久,上課時,也都請學員改用這個服務,以便於能夠讓運行在開發環境的 http://localhost :port 對應到 internet 上真實的某一個網址,好讓 LINE Bot 後台設置的 WebHook URL能夠真正的運行起來。 然而最近,上課時常常碰到學員的個人Microsoft Account 無法登入 DevTunnel 的窘境。使用底下指令: devtunnel user login 一般來說,執行上述指令後,會出現底下畫面,輸入了正確的帳號密碼: 你就可以成功登入使用了: 但如果你看到的並非上面這樣的畫面,取而代之的是錯誤訊息,你可能就得嘗試換一種登入方式,建議可以考慮採用: devtunnel user login -d 這會讓系統採用 device code authentication 登入模式,運行後會出現底下畫面: 依照上面的指示開啟網頁,輸入一次性的代碼(密碼): 輸入該代碼後,系統會再次提示你登入(或是選擇已登入的帳號),成功後,會出現底下畫面: 如此一來,就可以順利登入囉。 後面就可以使用標準的 devtunnel 指令,來進行 localhost port的對映: devtunnel host -p 5000 --allow-anonymous

在 CI Pipeline 中使用 gpt-4o 進行自動化程式碼安全性掃描

圖片
我曾經在 這邊 介紹過,我們可以透過 Azure DevOps 外掛的套件,在 CI Pipeline 中利用 AI (如今是 gpt-4o) 進行自動化 code review。 舉例來說,當我們在 commit 中,把程式碼改成底下這樣: public float Calculate ( ) { int para = 0 ; float result = 0 ; float height = ( int ) Height / 100 ; result = Weight / ( height * height ) ; result = result / 0 ; //todo: 分析BMI計算結果 return result ; } 這時,PR 所觸發的 Pipeline,會在運行過程中,透過 gpt-4o 幫我們掃瞄出底下的 code review 報告: 在 float height = (int)Height / 100; 這行中,將 Height 強制轉換為 int 可能會導致精度損失,建議保持 float 類型以確保計算的準確性。 在 result = result/0; 這行中,除以零會導致運行時錯誤或異常,這是一個嚴重的錯誤,需要修正。 變數 int para=0; 被宣告但未使用,這是多餘的代碼,應該移除以提高代碼的可讀性和效率。 如下圖: 這可以幫上 reviewer 不少忙。 使用 AI 作安全性檢查 最近,心血來潮,想說既然 AI 可以 code review,不如在 prompt 中加上一些檢查安全性的提示,來看看結果如何。 底下我刻意修改了的一些可能有安全性顧慮的程式碼: public void Save ( string userInputFileName ) { string password = "P@ssw0rd123" ; Random random = new Random ( ) ;

如何在沒有UI的狀況下,透過CLI安裝 Azure DevOps Marketplace 中的 套件

圖片
前幾天上課,發現 Azure DevOps 無法安裝套件,我試過不同的機器、不同的IP、不同的瀏覽器、不同的帳號,似乎都會碰到一樣的問題,在 Loading your organization 的時候掛掉: 但是上課不能停,我得繞道而行。 有什麼辦法可以不透過 UI 來安裝 Azure DevOps 套件? 想來想去,發現 az cli 是最好的選擇。 我們可以先透過 Azure CloudShell 來操作 Azure DevOps,先安裝 az cli 的 azure-devops extension: az extension add --name azure-devops az devops login login 的時候需要 Azure DevOps 的PAT(personal access token): 成功登入後,就可以直行安裝套件的 cli 指令囉。 安裝時需要指定幾個參數,分別是: –extension-id 👉 套件ID –publisher-id 👉 套件發行者ID –org 👉 組織名稱 你可以從套件的安裝網址找到 --extension-id 與 --publisher-id: 例如,套件的網址若是: https://marketplace.visualstudio.com/items?itemName=tw-developer.GPTPRReviewer itemName後面的參數內容以『.』隔開的兩者,就是publisher-id與extension-id ,所以,組出的cli指令是: az devops extension install --extension-id "GPTPRReviewer" --publisher-id "tw-developer" --org https://dev.azure.com/studentNCGS6/ 其中 --org 後面的參數值 https://dev.azure.com/studentNCGS6/ 則是你的 Azure DevOps 站台位置。 你可以透過這樣的指令快速的安裝套件。 例如,我常安裝的套件如下: #install extensions az devop

使用 Dify 以No Code方式建立記帳機器人

圖片
LLM改變了軟體開發的一切 每每碰到一套新的工具或技術,我都會想把過去熟悉的例子重新實作一次,一方面有助於了解新技術的瓶頸或極限,另一方面也可以實際體驗新工具所能帶來的改變與節省的時間。針對LLM和Dify的出現,我當然也這麼做了。 過去,我們曾經出版過一本『LINE Bot與人工智慧辨識開發實戰』的書籍,內容在闡述使用LINE官方帳號和微軟的AI技術(cognitive services)進行 對談/客服 機器人的建立。當然,那是在還沒有LLM的時代。 如今LLM的出現,改變了開發對談機器人的一切。 過去書中有一個例子,我一直想拿LLM重新做一次,就是 記帳機器人 。 而且這一次,我不想再寫任何程式碼了。 記帳機器人 記帳是獲得財富自由的首要關鍵(不知道曾看到哪本書上這樣說的,但我愈來愈覺得那本書裡面的內容有一半是安慰人的,不過我們暫且擱置爭議)。關於記帳這件事情,如果能有一個隨身帳本,可以幫你記錄每一筆消費,應該是一個好的開始。 有很多app有這樣的功能,但大多數App都是透過表單輸入的方式,讓你自己輸入每一個欄位,而我希望做的這個對談機器人,要能夠直接透過自然語言輸入,就能完成記帳。例如: 剛才在加油站把油加滿,花了1200元 午餐吃了7-11的雞腿便當,130塊 用戶直接用自然語言輸入類似上面這樣的句子,記帳機器人就能夠幫我們將這些消費紀錄寫入資料庫。that’s it。 使用 Dify 開發與測試 如今,在有LLM和Dify工具的狀況下,要實現這個需求變的很容易,我們先整理一下需求,並且整理一下初步的思路。 當用戶輸入一句話,我們就丟給LLM去判斷(注意,是判斷),如果用戶在這一句話中已經包含我們所需要的所有資訊(參考底下): 金額(Amount) 商店名稱(Store) 消費項目(Item) 時間日期(DateTime) 備註(Memo) 我們就把上述消費資料轉成 JSON,然後呼叫一個 Rest API 把這消費紀錄存入資料庫。如果用戶只說了一部份,還有缺少的資料,例如: 剛才花了150元 這句話缺了消費項目與商店名稱等資訊,那我們就讓LLM持續追問,直到蒐集完所有資訊為止。 上述邏輯很簡單,而我們用Dify進行開發,過程更簡單,整個流程設計大概像是底下這樣,幾乎不用寫什麼程式碼: 上圖中的重要

使用 Dify API 快速建立一個包含前後文記憶的對談機器人

圖片
Dify 這個產品我就暫時先不介紹了,它找到了一個挺好的切入點跨入AI Agent市場。讓不喜歡(或不擅長)寫太多 Code 的開發人員,也可以快速的建立一個具有前後文、記憶的對談機器人。 其實若單就設計 Chat Bot 來談,它本質上和 GPTs 有那麼一點點像,你只需要給一個 system prompt ,再加上一點點的資料上傳做為 RAG 的數據來源,就可以生出一隻有模有樣的對談機器人。 但 GPTs 做出來的 Chat Bot 被綁在 ChatGPT 的 UI 裡面,你不容易把它跟 LINE Bot (LINE 官方帳號) 或其它 UI (例如 MS Teams) 串在一起,而 Dify 呢? 則給你了一個 chat-messages API,讓你能很快的實現這個功能,把你在 Dify 平台上做好的 Chat Bot 轉變成可以正式運行的 LINE Bot 或 其它 Bot。 這也是今天我們要介紹的部分。 建立 Assistant 我們先用 Dify 以底下這個 system prompt 建立了一個請假助理: 發佈後,你可以在Dify 內建的 Web UI 上測試: 你會發現,這個 chat bot 已經有著基本的記憶,然後可以依照 system prompt 完成對談和任務。 不要問我在這邊建立出一個假單有什麼用,正常情況下是要直接讓 chat bot 寫入資料庫(例如 HR 系統,直接完成請假),只是我們還沒談到這一段,這部分以後再展開來談。 chat-messages API 好,透過上面那樣建立一個對談機器人超容易,且內建就有了記憶和前後文的功能。讓開發人員快樂的不得了。跟使用無腦 GPTs 生成術差不多。然而,如果只能在 Web 上用,不能串接 MS Teams、LINE…等介面,做了也是白搭。 但,Dify 貼心的提供了 API,我們來試試看。先Gen個 API Key: 生成了 API key 之後,你只需要透過底下這樣的 rest api,即可進行呼叫: 你會發現,開發人員只要使用單一的這一個 https://api.dify.ai/v1/chat-messages API 即可進行對談。每次只需要透過 query 輸入用戶說的話,response 中的 answer 則是 LLM (Assist

使用 Dify 建立企業請假機器人

圖片
八卦與未來 上個月,前Google執行長Eric Schmidt在史丹福有場演講,媒體關注的是八卦消息(如果你也曾關注,網路上有很多鐵定可以找到),但我注意到的則是他提到了自己認為接下來 AI(特別是大語言模型) 可能的發展方向,包含: Large Context Window AI Agent Text-to-Action 底下這邊有這一個段落的影片: https://www.youtube.com/watch?v=zl3k1ksFZdY 為何我會關注這部分? 因為上述的三個方向,也是身為開發人員的我,過去這一年,來與LLM打交道後的感想。昨天,我在 twMVC 的研討會分享中,展示了一個其實我過去早做過了N百次的範例,就是企業的請假機器人。(唯一不同的是,這次我幾乎沒有寫任何程式碼) 場景是,員工在家裡生病了,想要透過語音或是app進行請假,你可以看底下這個運行的範例 (git圖檔會循環播放,開始是 『我好像感冒了』): 用自然語言對談的方式,即可完成請假。 我說過,類似這樣的範例我做過很多次,用 LINE Bot 搭配 C# 做過,用MS Bot Framework 做過,前陣子也用 Semantic Kernel 框架做過,更早期,還沒有AI的時代,我也在EIP和HR系統裡做過。 但我想說的是,這 就是 Text-to-Action 的呈現,也是一個典型的 AI Agent 的例子,它讓我們透過自然語言(可以是語音或文字),直接命令機器人(Chat Bot、AI 助理、Agent、Assistant …不管你叫它什麼…)幫你完成一件事情(請假、售票、查詢資料、做財務報表、統計圖表、寫程式…etc.)。 這是一直以來人類對電腦最底層的需求與期待。 隨著 LLM 能夠處理和記憶的 Context 愈來愈被放大,AI Agent 所能夠處理的任務就更加的不受限制。 自然語言才是最符合人類直覺的操作 順帶一提,我昨天在研討會中講了一個故事。 有天,你覺得自己需要聘請一位助理,因此上網張貼徵人啟事,沒多久,你找到了一位號稱上知天文、下知地理的高材生,來幫助你更有效率的完成工作。 他什麼都好,唯一的一個小缺點是,你不能直接對這個助理下達指令,你必須用一種只有這個助理看得懂的語法,才能要求這個助理幫你完成特定的工作。這些語法還挺

使用 Dify 串接 LINE Bot

圖片
一開始寫這篇文章的時候,我有點困擾。 到底這一篇我到底該命名 『使用 Dify 串接 LINE Bot』 ,還是 『使用 LINE Bot 串接 Dify』?? 但我想,反正你應該知道我的意思,本文就是討論如何把兩者串在一起。 如果不熟悉 Dify ,本篇文章的前面還有兩邊文章你可以簡單的介紹了一下,所有連結位置在底下: https://studyhost.blogspot.com/search?q=dify 總的來說(我20年前就這麼說話了,最近有人說AI很喜歡說『總的來說』,但顯然是AI學我的),我們可以在 Dify 裡面設計一個類似底下這樣的 workflow,他可以是一個簡單的對談聊天機器人,也可以是串接到後端HR請假系統,可以協助企業進行請假的 AI 助理: 顯而易見,使用 Dify 的好處很多。而在這邊它對我們來說,意義上是一個所視即所得的 Chat Bot(AI助理)設計平台,你可以在 Dify 中先把對談流程設定好,並且進行測試。 設計初步完善之後,我們可以透過Dify API來進行串接,例如串接到 Teams Bot或是LINE Bot。API的部分我們之前在 這一篇 介紹過。 由於Dify內建處理了對談前後文與記憶的部分,並且可以直接串接OpenAI的API(或是其它LLM亦可,同時也便於抽換),這讓我們開發 AI 助理輕省不少。 這也是我覺得 Dify 作為一個 LLMOps 開發平台(Platform)應該算是當之無愧的原因了。 串接到 LINE Bot 那在Dify上開發測試完之後,我們當然希望能夠整合在 LINE Bot(或是隨便其它什麼 Bot)上面。前面說過,由於 Dify 有提供一組API,我們可以透過該API輕易地進行串接,API的部分,我們在先前 這一篇 介紹過。因此,我們底下要更進一步,談談如何實際跟 LINE Bot 整合在一起。 其實架構上不複雜,我們只需要建立一個 LINE Bot 的 WebHook ,並且在其中呼叫 Dify API即可: 也就是上圖中,紅色虛線框起來的這一段。 這部分該如何進行呢? 倒也容易,我們看底下 WebHook 的部分: var responseMsg = "" ; //準備回覆訊息 if ( LineEvent != n

在 Power Automate Desktop 中運行 Python

圖片
我是覺得 Power Automate Desktop 本身已經很強,過去幾年,MS推過這類 no code/low code 產品N次,但就像我有位好朋友才剛剛說的:『你早人家一步是先知,早人家兩步往往是烈士!』一個產品要獲得最後的成功,總是得蒐集齊了天時、地利、與人和。 我覺得這次 Power Automate Desktop 算是做得很不錯,actions 的數量和生態系頗好。我最近也幫不少企業做了 Power Automate Desktop 的教育訓練。 然而今天,居然差點被學員的一個小問題給考倒了。 有位學員碰到一個我覺得頗簡單的情境,希望能夠在 Power Automate Desktop 的流程運行中計算一個字串變數的長度。我想說這個隨便哪一種語言都能做的功能,Power Automate Desktop應該可以吧,結果,找了半天,竟然沒有!!! Power Automate Desktop中,字串相關的 actions 清單在底下: 文字動作參考 - Power Automate | Microsoft Learn 還真的沒有。 怎麼辦? 身為程式設計師的想法當然是–>那我寫 code 總可以了吧。 找到了 Run Python Script 的 action: 用的時候發現,寫code是很容易,但怎麼把變數傳進去和把計算結果傳出來,倒是花了我一點時間。原來,run python script 居然可以透過 print 來把運行結果傳出來,所以,底下這段指令可以取得 UserInput 字串,並且透過運行 Python Code 取得長度,最後設定在 PythonScriptOutput 變數中: 如此一來,不只可以取得字串長度,基本上你想幹什麼都行。底下透過三個action做一個示範,讓用戶輸入文字,然後透過 python 計算該文字的長度,最後透過對話視窗顯示出來: 最後,整個流程完整的 script 設計如下: 結果,no code solution 還是透過 code 解決了問題 🤣 後記: 這篇其實主要是想介紹在RPA中透過 Run Python Script 來實現系統中可能無法直接提供的功能。但基於RPA的精神,還是應該少寫一點code比較好。 因此,網友提供了一個比較標準的作法,可