June
27th,
2023
透過這個 EmbedChain 可以抓取許多種資料,這個圖片是測試他去抓取 「2023年LINE官方帳號方案價格調整,重點一次掌握」網頁上的資料來回覆給使用者。 官方帳號在哪一天調整價錢? 官方帳號價格將在 2023 年 9 月 1 日調整。 中用量方案的價格? 中用量方案的價格是每月 800 元。 前提 許多人都想要打造出客服聊天機器人 LINE Bot ,但是透過 NLU 來打造客服 LINE Bot 其實成本很高。這裡會推薦給各位透過 LangChain 加上 EmbedChain 這個套件,可以打造低成本與簡易版本的客服 LINE Bot 。 本篇文章將快速告訴各位,如何透過 EmbedChain 來打造 這裡也列出一系列,我有撰寫關於 LangChain 的學習文章: [學習心得][Python] 透過 LangChain 來處理特殊的中央氣象局資料 [學習心得][Python] 透過 LangChain 的 Functions Agent 達成用中文來操控資料夾 [學習心得][Python] 透過 LangChain 打造一個股價查詢 LINEBot - 股價小幫手 EmbedChain 解決了那些問題 先預設本篇文章讀者,已經是懂的使用 LLM (Large Language Model) 來打造客服機器人。之前你需要先建立客服機器人的參考資料庫,(因為大部分 LLM (e.g. OpenAI) ) 不知道如何回覆你的問題。 需要的架構可以這裡參考文章 Enhancing ChatGPT With Infinite External Memory Using Vector Database and ChatGPT Retrieval Plugin 如上圖,快速整理架構如下: 需要把客服文件透過切割成一群群的文字區塊 將文字區塊透過 Embedding 技術放入 LLM 的向量空間,暫存在 Vector Database。 (會變成一個很長的數字陣列 e.g.) 客戶詢問問題的時候,也去針對他的問題切割後作成 Embedding 。並且找尋最接近的文件。 將文件區塊給 LLM 整理後回覆給客戶。 即便你使用了 LangChain 來包裝整個架構,你還是會遇到相關問題: 選擇 Vector Store 打造不同文件的 Document Loader PDF Loader Web loader 這邊複雜一點,需要透過 BeatifulSoup 爬下網頁,抓取需要的內容。 如果是 YouTube 也是很複雜: 找出字幕 -> 抓下來 將文字切割過後放入 Embedding 。 那有方式可以更快速解決這樣的架構問題嗎? 接下來就要跟大家 EmbedChain 。 如何透過 EmbedChain 打造客服 LINE Bot 這裡列出幾個簡單流程: 準備打造客服 LINE Bot需要的素材 建立 EmbedChain LINE Bot 測試與調整 以下我們將透過 EmbedChain 來打造一個回覆 LINE Biz-Solution 基本資訊的客服機器人。...
繼續閱讀
June
21st,
2023
前提 接下來,我們將介紹如何透過 LangChain 來打造一些實用的 LINE Bot 。第一個我們先透過旅遊小幫手的概念,來幫大家串接關於氣象的 LangChain Function Agent吧。 本篇文章將要帶給各位一些概念: 如何用 LangChain 來串接 中央氣象局的 Open API Data 如何在 LLM 的對話中來處理一些特別數值的輸入。 如何活用 LLM 對話的聰明性,來活用 LangChain Function Agent 。 這裡也列出一系列,我有撰寫關於 LangChain 的學習文章: [學習心得][Python] 透過 LangChain 來處理特殊的中央氣象局資料 [學習心得][Python] 透過 LangChain 的 Functions Agent 達成用中文來操控資料夾 [學習心得][Python] 透過 LangChain 打造一個股價查詢 LINEBot - 股價小幫手 直接看如何使用程式碼 https://github.com/kkdai/langchain_tools/blob/master/travel_tool/ 如何用 LangChain 來串接 中央氣象局的 Open API Data 要申請中央氣象局 OpenAPI Data ,依照以下流程: 到官方網站註冊 註冊之後,透過取得授權碼。 透過官方 OpenAPI 頁面,來使用 (其實只要用一般天氣預報(全地區)就足夠了) 接下來來透過 ChatGPT 來協助撰寫相關資料: 透過 Execute 結果中的 CURL ` curl -X 'GET' \ 'https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001?Authorization=你的授權碼' \ -H 'accept: application/json' 然後去ChatGPT 問說,就可以取得 get_weather_data ,這邊記住我們只有使用地點。原因如下: 雖然會傳回未來三天的氣象資料,但是 LLM 可以幫我們整理,並且篩選。 三天的資料也可以幫助我們來處理更多詢問,不需要再查詢的時候就修改。 def get_weather_data(location_name=None): url = 'https://opendata.cwb.gov.tw/api/v1/rest/datastore/F-C0032-001' headers = {'accept': 'application/json'} query = { 'Authorization': cwb_token} if location_name is not None: query['locationName'] = location_name response = requests.get(url, headers=headers, params=query) if response.status_code == 200: return response.json() else: return response.status_code 轉換成 LangChain Function Agent 參考之前其他的 Tool Agent 的寫法,可以很快速改成以下方式。 cwb_token = os.getenv('CWB_TOKEN', None) # From CWB API # https://opendata.cwb.gov.tw/dist/opendata-swagger.html#/%E9%A0%90%E5%A0%B1/get_v1_rest_datastore_F_C0032_001 class WeatherDataInput(BaseModel): """Get...
繼續閱讀
June
17th,
2023
前提 以前 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...
繼續閱讀
June
16th,
2023
前提 透過 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...
繼續閱讀
June
15th,
2023
前提 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...
繼續閱讀
June
14th,
2023
前提 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,...
繼續閱讀