[學習心得][Python] 透過 LangChain 的 Functions Agent 達成用中文來操控資料夾

前提 以前 Linux 課程上,大家總是對於 ls , mv 與 cp 的指令無法背起來。都忘記有多少次聽到朋友抱怨,難道不能用中文來下指令嗎? 比如說: 幫我移動1.pdf 刪除 2.cpp 這個檔案 列出檔案 現在,其實你可以透過 LangChain 很快來達成。本篇文章將給你範例程式碼,跟相關的原理 LangChain Functions Agent 的用法。 這裡也列出一系列,我有撰寫關於 LangChain 的學習文章: [學習心得][Python] 透過 LangChain 來處理特殊的中央氣象局資料 [學習心得][Python] 透過 LangChain 的 Functions Agent 達成用中文來操控資料夾 [學習心得][Python] 透過 LangChain 打造一個股價查詢 LINEBot - 股價小幫手 開源套件參考這個 https://github.com/kkdai/langchain_tools/tree/master/func_filemgr 什麼是 LangChain 透過 LLM (大型語言模型)的開發上,有許多很方便的工具可以幫助你快速地打造出 POC 。 這裡最知名的莫過於 LangChain ,除了支援眾多的大型語言模型之外,更支援許多小工具(類似: Flowise) 。 什麼是 Functions Tool 就像是這篇文章提到的一樣, Functions Tools 是根據 最新的 06/13 公佈的 OpenAI Function Calling 的功能 所打造的功能。也就是你先給予 LLM 一連串可以執行的「工具列表」後。他會根據你的語意,來回答給你說「可能」是屬於哪一個 Function Tool 可以呼叫。 並且讓你來決定,究竟是要呼叫呢? 還是要繼續處理它。 就像是幫你的 LLM 告訴他可以做哪些判斷,由他來幫你判斷使用者的語意「可能」做哪一件事情。 (讓機器人來幫你決定,應該要準備執行哪個 Function Tools) 在 Python LangChain 裡面也相當的簡單,前一篇文章已經有大部分的內容。 這裡做相關的說明: from stock_tool import StockPriceTool from stock_tool import get_stock_price model = ChatOpenAI(model="gpt-3.5-turbo-0613") # 將工具轉換成可以被解釋的 JSON 格式給 LLM 來處理。(目前只有 OpenAI) tools = [StockPriceTool()] functions = [format_tool_to_openai_function(t) for t in tools] ..... # 透過 OpenAI 的最新模型,來判斷這個使用者的文字應該去執行哪個 Function # 回傳可能是 get_stock_price 或者甚至可能是空的。 hm = HumanMessage(content=event.message.text) ai_message = model.predict_messages([hm], functions=functions) # 處理 OpenAI 幫你抓出的「參數」(arguments) _args = json.loads( ai_message.additional_kwargs['function_call'].get('arguments')) # (optional) 直接去執行該 function tool tool_result...
繼續閱讀

[學習心得][Python] 透過 LangChain 打造一個股價查詢 LINEBot - 股價小幫手

前提 透過 LLM (大型語言模型)的開發上,有許多很方便的工具可以幫助你快速地打造出 POC 。 這裡最知名的莫過於 LangChain ,除了支援眾多的大型語言模型之外,更支援許多小工具(類似: Flowise) 。 本篇文章將介紹如何透過 LangChain 打造一個查詢股價 (stock price) 的小工具,並且提供一個可以快速打造的開源套件讓各位一起學習。 對了,本篇文章使用的範例也是最新的 06/13 公佈的 OpenAI Function Calling 的功能。除了可以快速判斷使用者 Intent 之外,更可以呼叫外部的 API 來查詢本來 OpenAI 無法了解的資訊(比如說現在的股價)。 透過使用 LLM 的 LINE Bot: 你可以使用任何敘述公司的文字,來找尋公司股價。 比如說: 蘋果公司,甲骨文… 等中文公司名稱。 甚至從英文完全找不出股票代碼的公司,比如說: CloudFlare –> NET 開源套件參考這個 https://github.com/kkdai/linebot-langchain 這裡也列出一系列,我有撰寫關於 LangChain 的學習文章: [學習心得][Python] 透過 LangChain 來處理特殊的中央氣象局資料 [學習心得][Python] 透過 LangChain 的 Functions Agent 達成用中文來操控資料夾 [學習心得][Python] 透過 LangChain 打造一個股價查詢 LINEBot - 股價小幫手 為何要挑選 LangChain 作為開發 LINE Bot 的架構 這題目很大,很難一句話回答。 LangChain 是一個很方便打造 POC 概念的東西。搭配 Flowise 甚至可以讓 prompt 人員跟開發人員完全分開。 但是他畢竟還是類似黑箱子,有太多需要注意的地方。真的要上線,建議還是要透過 OpenAI 自己來開發。 不過 LangChain 開發出來的架構,可以無痛轉換到其他 LLM 就是了。 也有視覺化的工具類似: Flowise 可以讓拉框架的人,跟 Prompt 的人分開。修改 Prompt 甚至不需要重新 deploy Flowise 提供一個 LangChain 視覺畫前端,可以透過拉框架快速測試架構跟 Prompt ,開發 LINE Bot 可以直接串 API 。 甚至修改 Prompt 可以做到不需要改 API Call ,也不需要重新 Deploy 。 先來準備一個快速導入 Heroku 的 Python LINE Bot 套件 這邊有一些選擇方式: 你可以 Clone 這個 REPO https://github.com/kkdai/linebot-langchain 或是直接部署到 Heroku 透過該網頁下面的 “Deploy” 按鈕(需要帳號) 如果是從頭開啟的專案,幾件事情需要注意: app.json 主要敘述設定的 build packs ,這裡主要注意兩個項目: “repository”: 記得填寫正確,如果你有 Clone 過去,記得改成你的。 裡面有三個參數,請參考 README 即可,有一個比較雷的地方是。 LangChain 只支援系統參數 OPENAI_API_KEY...
繼續閱讀

[學習心得][Golang] 透過 Flex Simulator 有效率開發與除錯 FLEX Message 以 Go SDK 為範例

前提 LINE Bot 的開發上, Flex Message 是一個強大又美觀的訊息顯示方式。並且可以發出多種類型訊息格式。本篇文章分享了,如何透過快速版本設計來寫出你想要的形式。 本篇文章將透過一個流程,循序漸進告訴你如何完成上面的範例訊息,並且如果開發 FLEX Message 上的問題時,也可以透過 FLEX Simulator 來幫你除錯。 開始了,設計苦手 任何的前端苦手(像是我),都對於如何找到一個好 Flex 的格式內容感覺很辛苦。這時候可以考慮使用 FLEX Simulator 先做你的起手式。 (FLEX Message Simulator 提供給你所見即所得的編輯方式) 這裡也推驗”藉由 Flex Message Simulator 實現並發送測試用 Flex Message” 讓你對於 FLEX Message Simulator 有更深刻的了解。 透過 Showcase 挑選喜歡的樣板 這裡可以挑選喜歡的格式,我們先挑選出我們喜歡的 “Local Search” 版面。 透過 FLEX Simulator 修改 依照本次範例,我們不需要評比的星星。可以透過 FLEX Message Simulator 來直接移除(用剪刀) 。 修改好之後,按下右上角的 </> View as JSON 來查看相關資訊。這些可以讓你知道如何開始編譯你的程式碼。 開始弄到 Golang 程式碼 如果沒有要把 FLEX 套著資料,整包 JSON 直接丟下去用 如果要開始把 FLEX Message 弄到你開發的聊天機器人的話,可以先建議以下方式: 其中 jsonString 是 contents, err := linebot.UnmarshalFlexMessageJSON([]byte(jsonString)) if err != nil { return err } if _, err := app.bot.ReplyMessage( replyToken, linebot.NewFlexMessage("Flex message alt text", contents), ).Do(); err != nil { return err } 其中 UnmarshalFlexMessageJSON 可以直接把 JSON 直接轉換成 Golang code 裡面的元件,你可以再去修改,或是直接丟到訊息就好。 直接一個個的刻出來 這裡貼上一段 code 可以直接看到,這是一個慢慢用內部定義的格式來打造 FLEX Message 。 優點: 很有彈性,甚至可以套用外部資料打造數個 FLEX Bubble Carousel 。 缺點: 就是需要一個個把格式填寫上去,不過使用 VS Code 的體驗,應該都可以快速選到才是。 發送 FLEX Message 失敗怎麼解決? 大概也是許多開發者的痛,就是當 FLEX Message 發送失敗的時候。到底要去哪裡查錯誤訊息? 經常會發現 Log 也沒那麼清楚怎麼辦? flexMsg := linebot.NewFlexMessage(ALT_TRAVEL_FLEX, flexContainerObj) if _, err...
繼續閱讀

[學習心得][OpenAI] 關於 OpenAI 新功能: Function Calling

前提 OpenAI 在 06/13 發表了新的功能 “Function calling“,其實對 LLM 的開發上算是一個完整的新發展。 本篇文章將快速解釋一下這個更新將會帶來哪一些變革,並且也透過將 LINE 官方帳號的相關整合為案例,幫你打造一個旅遊小幫手。 關於 OpenAI 新的功能Function Calling 的細節 關於 “Function calling” 主要是拿來處理 Intent 的判斷,並且針對使用者的意圖給予相關的 JSON 輸出給開發者作為處理之用。 換成白話文來說,如果你今天想要做一個「天氣服務的 ChatGPT LINE Bot 」的話,那麼你該如何弄呢? 相關資料: 部落格 “Function calling” API 文件 ChatComplete 在 OpenAI Functions Calling 之前,要怎麼做? 根據 “DeepLearning 提供一堂很好的 Prompt Engineering for Developers” 有提到,你可能要這樣做: 你現在是一個協助抓取使用者資訊的小幫手,如果使用者詢問了某個地區的天氣。你就幫我把地區抓出來透過以下格式呈現。 --- { "location": "xxxx" } 很多地方是聰明的,但是還是沒有處理非相關天氣詢問要拒絕。這裡可以透過 ChatGPT Share 查看結果。如果是一個 NLU 的小幫手,在這個情況下可能要回覆 { "location" : ""} 或是 NULL ,但是這樣會讓你的 Prompt 非常的冗長,而且通常很長的防禦Prompt (咒語)只能防禦一個階段。 那該怎麼辦呢? 那 OpenAI Functions Calling 怎麼幫助你呢? 這裡給一張流程圖: PlantUML 第一步: 呼叫 Chat / Complete Function Calling 從文章內 “Function calling” 可以提供一個很簡單的範例,你可以發現以下得呼叫方式跟原本使用 chat/ completion 沒有差別,但是回傳資訊差很多了。 curl https://api.openai.com/v1/chat/completions -u :$OPENAI_API_KEY -H 'Content-Type: application/json' -d '{ "model": "gpt-3.5-turbo-0613", "messages": [ {"role": "user", "content": "What is the weather like in Boston?"} ], "functions": [ { "name": "get_current_weather", "description": "Get the current weather in a given location", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco,...
繼續閱讀

[學習心得][Golang] 透過 ChatGPT 來做 REGEX 的事情

前提 大家應該都跟我一樣,經常使用 ChatGPT 來協助一些 coding 上的問題。尤其是對於 Regular Expression 的問題。最近在處理上發現,需要透過「正向表列」,而非跟他講哪些不可以的方向比較容易成功。也應該說, Regular Expression 本來就要透過正向表來才對。 原本: // AddLineBreaksAroundURLs takes a string as input, finds URLs, // and inserts a newline character before and after each URL. // It returns the modified string. func AddLineBreaksAroundURLs(input string) string { re := regexp.MustCompile(`(https?:\/\/[^\s\p{Han}]+)`) return re.ReplaceAllString(input, "\n$1\n") } 發現無法處理: https://voyager.minedojo.org/。 當我發現我一直跟 ChatGPT 講要排除 ` https://voyager.minedojo.org/。` 這個案例的時候,往往會一直卡住無法向前。 但是寫多個測試案例倒是真的蠻好的。 Unit Testing code func TestAddLineBreaksAroundURLs(t *testing.T) { tests := []struct { input string expected string }{ { input: "Check out this website https://example.com and this one http://another-example.com", expected: "Check out this website \nhttps://example.com\n and this one \nhttp://another-example.com\n", }, { input: "Here is an URL with dot at the end https://voyager.minedojo.org/。", expected: "Here is an URL with dot at the end \nhttps://voyager.minedojo.org/\n。", }, { input: "This is another test 可在https://voyager.minedojo.org/上訪問。", expected: "This is another test 可在\nhttps://voyager.minedojo.org/\n上訪問。", }, // Add more test cases here as needed } for _, tt := range...
繼續閱讀

[TIL] 關於 WWDC 2023 身為開發者你應該知道的事情

我如何看待 WWDC23 ? 身為技術研討會主辦人,我看的是: 整體錄影方式與收音技巧 每一個講者的職稱(可以看出內部分工與架構) 平台想要規劃出的生態圈 職稱相關 應該跟許多公司一樣: Engineering Progam Manager - 技術專案經理 Engineering Manage - 技術開發的經理 職稱其實也代表部門的多寡,對外部而言很嶄新的 visionOS 部門卻有那麼多清楚分工,而且能演講的人還蠻多的。不愧是 Apple 。 硬體相關 New Mac Studio 可以有六顆螢幕(原來之前的不行啊?!) iOS 17 帶來軟體開發新變化 Name Drop 近場溝通新應用 取代掉所有名片應用 (LINE OA 其實有類似做法) 不知道會用到哪個 SDK ,應該會開放給其他 App 使用。 更智能的鍵盤輸入 可能是使用 local 「In-line predictive text API」 TV OS 相關變革 透過 iPhone 直接在 Apple TV 開會 走 Continuity Camera API Vision Pro 帶來的軟體開發變化 (要接線~~~~~ Orz) 果然要另外接電池 Apple Vision Pro 帶來新的生物識別系統「Optic ID」 可能帶來影響: 虹膜辨識會變成是基本 OAuth 的認證設備(搭配 Passkey (a.k.a. FiDO2) 比起 WorldCoin 可能因為 AirDrop 產生盜用 ,但是 Vision Pro 更可以取得更多人的虹膜資訊。 雖然依照 Apple 的個性,不可能有任何取得方式。但是代表 Optic ID 可以更加的準確, Passkey 的未來更令人期待。 iOS SDK Accessibility SDK Privacy API
繼續閱讀