Flowise 讓你三個願望一次滿足:No-code. AI assistant. Customized data.

閱讀時間約 14 分鐘
最近 AI 開發者間最熱門的話題,無非是 LangChain 這套開源開源框架簡化了開發流程。 Flowise,也是一款開源工具,結合了LangChain 的強大功能,推出了一種無需編碼的解決方案,透過簡單的拖拉功能建立流程,縮短開發時間。
本文的目的,就是用簡潔明瞭的的繁體中文😘,幫助讀者不僅親自動手創建Chatbot,還能夠深入理解其背後的基本原理。使用 Flowise 兩個方式,除了下載到電腦裡進行開發環境設定,另一個相對簡單的方法,另一種則是在Github上Fork Flowise,然後部署到雲端服務,例如Digital Ocean或Render。這些服務的基本費用約為5-6美元,對於非開發者來說,這將是一種更加便捷且易於學習的方式。
如果你覺得這篇文章對你有幫助,歡迎 Buy Me A ☕️ or 🍕 or🍦,或在文末贊助,讓我更有動力撰寫有用的文章 🥰。有任何問題也請留言,我會盡可能回答。 讓我們開始吧🏄

🤔 首先,讓我們從背後的故事開始理解

Flowise 最大的特色,就是不用寫Code就可以使用 LangChain 開發大型語言模型驅動的應用程式。也因為如此,對於 LangChain 有基本的理解是絕對不可少的。相信大家看到下面 LangChain 的詳細介紹會馬上卻步,✨但是✨Flowise 最酷的就是把這些概念抽象化,在底層,它就處理了大量的任務,在使用者層面,你所做的只是進行拖拉連結而已 🤯 但了解自己在做什麼很重要對吧?至少看到這些名詞不會一頭霧水,這些名詞實際上已經是當前開發基於大型語言模型的應用程式的主要概念。
👈 你也可以選左邊的sidebar跳過說明直接看影片

🦜 LangChain 主要特色與功能

LangChain 是一個開發由語言模型 (Language Models) 驅動的程式框架。
最近大家對語言模型可能最熟悉的是OpenAI 的 GPT-3 或 ChatGPT-4,但事實上,不只有OpenAI,像是Facebook的LLaMA、Google的Bard、Cohere等,都有提供各種語言模型。LangChain 提供了一個簡單的方式讓開發者能夠連接這些不同的語言模型,甚至可以使用Hugging Face平台上的各種開源模型,這就是LangChain名字的由來—Lang代表語言模型,Chain代表這些模型的連接。透過LangChain,開發者可以使用更少的程式碼更有效率地進行開發。最棒的是,LangChain有一個充滿活力的開發者社群,近期在開發者間受到廣大的歡迎。

🦜 LangChain 構成要素

LangChain基本的資料類別有四種:
  • 文字 (Text) : 這是最基本的資料類型。在與這些語言模型的互動中,主要還是透過文字來進行。你提供文字作為輸入,然後模型會產生文字作為輸出。
  • 對話訊息 (ChatMessages):如果有使用 OpenAI 開發的經驗,就會知道除了以 text 為名的語言模型 (例如 text-davinci-003),還有以 gpt 像是 gpt-3.5-turbo為名的模型,差別在於 gpt 模型可以產生對話效果,就是所謂的聊天機器人。這類模型有三個角色:系統 (system)、人 (huamn)、和 AI。系統就像是一個基本的指南,告訴這個聊天機器人必須滿足的條件,然候透過人輸入資訊互動與AI互動,最後由 AI 角色產生回答。
  • 範例 (Examples) :範例就是提供一個藍圖給 AI 模型,所以它可以依照你提供的藍圖舉一反三。比方說,你可以提供一個範例指示AI「產生標題,並在每個標題前面加上一個適當的emoji」:
這只是很簡單的例子,當任務變得複雜就很好用。例如:產出 json 格式的回答
  • 文件 (Document):文件包含文字內容 (page-content) 和元資料或後設資料(metadata)。Metadata就像是數位照片通常會附帶的資訊,例如拍攝日期、相機型號、拍攝地點等,這些額外的資訊可以幫助我們快速理解一張照片。在LangChain 中,metadata就是提供關於page-content的額外資訊 。 code🖼️

🦜 LangChain 六個主要組件

📦 模型 (Models)
LangChain主要使用三種模型:大型語言模型 (Large Language Models, LLMs),聊天模型 (Chat Models),以及文字嵌入模型 (Text-Embedding Models)。前兩種模型我們已經討論過,這裡就不再贅述。至於文字嵌入模型 (Text-Embedding Models),其主要的功能是將文字轉換成數字的多維度陣列,也就是向量 (vector)。
轉換為數字陣列讓模型在比對兩段文字時較易找到相關性。如果讀者想要深入了解 Embedding 可以參考這個影片的前1/3。看完整個影片你會理解什麼是注意力機制 (Attention) ,以及造就大型語言模型威力背後的 Transformer 模型是什麼。
💬 提示詞 (Prompts)
如果你曾經使用過生成式 AI (Generative AI),應該就會理解提示詞對於生成的結果影響很大。事實上,如何提供適當的組合提示詞已經變成一種專門的技能,稱為提示詞工程 (Prompt Engineering)。另一個使提示詞變得重要的原因是,透過適當的提示詞可以減少 AI 模型發生「幻覺」(Hallucination) 的情況,也就是AI模型會給出非常具有說服力的資訊,但其實是錯誤的。搭配像是範例 (Examples) 等技巧可以有效地避免此類情況。LangChain有四個主要與提示詞相關的組件,但由於提示詞的學問可以非常深,我們這裡只會提到提示詞模板 (Prompt Template)。 提示詞模板就是提供一個變項,這個值會依照使用者的輸入產生不同的結果。例如,在我們之前提到的「範例」中,「美妝網站」就是一個可變的值,所以即使使用者輸入「飲料市場」或「快速時尚服飾」,我們還是可以得到預期的輸出結果。Code🖼️
👉 索引 (Indexes)
這個部分的概念跟我們要建構的Project關聯性很高,所以會逐一介紹。索引是一種組織文件的方式,讓LLMs可以用最佳的方式與這些文件互動。在LangChain,索引最常見的使用方式是在「檢索」步驟,也就是接收用戶的查詢並給出相關性最高的文件。
✏︎ 文件加載器 (Document Loaders)
簡單來說,就是你提供自己的文件資料給LLMs,讓它學習它不知道的資訊,我們前面提過文件 (Document) 的概念,就是寫入在這裡面 (code)。例如,語言模型本身應該不會知道你從小到大的故事吧!如果你把自己的經驗文件化,端看怎麼設計,它就可以依照你的內容回答相關的問題。
在文件裡的Data
✏︎ 文本切割器 (Text Splitters)
你從小到大的故事應該很長吧!為了讓這些語言模型可以有效率的運作,把文本切割為小的組塊(Chunks)就非常有用🥩
✏︎ 向量儲存空間 (VectorStores)
前面提到文字嵌入模型(text embedding models)將文字轉換成向量陣列。我們需要有一個地方可以儲存它們,後續的檢索才有辦法實現。
目前熱門的有 PineconeFAISS, Chroma ...,當然你也可以使用Redis。我們Project會以Pinecone作示範,可以免費啟動一個Project。很多人提醒因為申請帳號的人越來越多,可能需要等待。我使用Google帳號登入,並沒有遇到這樣的狀況,提供給大家做參考。
✏︎ 檢索器 (Retrievers)
連結文件和模型的介面。透過 get_relevant_documents 方法查詢,返回一個文件陣列。
🧠 記憶 (Memory)
在使用ChatGPT時,如果它無法記住你講過的話,就會給你牛頭不對馬嘴的回應。短期記憶一般使用於上下文的資料,通常是前一個聊天訊息或其摘要。長期記憶則處理不同對話間的資料。
⛓️ 鏈 (Chains)
一個鍊就像是一個包裹了環環相扣的不同組件,就像是生產線上一連串的動作或過程,最後完成了一個任務。LangChain 提供三種的鍊,最常使用的就是 LLMChain.
如果你有連到我在提示詞模板單元提供的 Code,你會發現我們使用了LLMChain。將不同變項(input variables)使用提示詞模板組成提示詞(prompt),然後傳到我們的模型(以這個例子是OpenAI的 text-davinci-003)。最後,如果有使用輸出解析器(OutputParser)的話,就會對模型的輸出進行分析並形成最後的格式。
另外一個就是與索引有關的鍊(Index-related chains。大家應該知道索引的意義是什麼了吧 🥹 讓LLMs可以有效率的與文件互動—特別是當你需要模型回答你自己提供的文件時。在這種情況下,關鍵在於如何將多個文件傳遞到語言模型中。例如,OpenAI gpt-3.5-turbo 模型的限制是 4K tokens ( 從2023年6月27日起,新的gpt-3.5-turbo-16k model 將把這個限制提升到16K tokens),這就是 Index-related chains 被廣泛運用的地方。
LangChain 提供了幾種常見的方法,來傳遞多個文件到語言模型中。例如,填充(Stuffing) 可以將所有相關的數據一次性傳入模型中,但這種方法對於大型或者多個文件可能不適用。另一種映射縮減 (Map Reduce) 方法則將預設的提示詞(initial prompt) 運用在每一個數據組塊🥩 (chunk of data),然後再由一個不同的提示詞來組合所有的預設提示詞,這種方法對於大型或者多個文件更加有效。另外還有精煉 (Refine) 和映射重排 (Map-Rerank) 等方法,可以根據具體的情況和需求選擇使用。這樣,就算在4K tokens的限制下,我們也可以有效地利用LLMs處理大量或者大型的文件。非常推薦這個Youtube的影片,解釋的非常詳細。
👽 代理人 (Agents)
代理人是驅動語言模型做出決策的中間者。代理人在這裡的角色是一個協調者,它根據輸入的內容來決定如何使用各種工具或語言模型來產生最適當的回應。這種機制讓整個系統具有更高的彈性,因為代理人可以在運行時根據用戶輸入的不同來決定使用哪種工具或語言模型,而不是事先確定好一個固定的處理流程。理解代理人概念最簡單的就是OpenAI ChatGPT的Plugins.
代理人將LLM跟next paper外掛連接,完成特定任務並回傳回應。

🤖 關於我們要動手做的專案

相信大家在使用 ChatGPT 時,曾得到因為模型訓練的時間是2021年9月前的資料,所以沒有辦法準確回答某些問題的回應。雖然現在 OpenAI 多了利用網頁瀏覽的功能,彌補了這個缺點,但如果我們可以替自己建立一個 QnA 助理,回答我們文件的問題是不是很有趣呢?最常見的運用就是 Github 專案的文件問答搜尋。
整個流程主要分為兩個部分,上傳文件並儲存在 Pinecone向量資料庫中,之後再向資料庫請求資料,最後由檢索器 (Retrievers) 返回資料,也就是圖中的答案部分。如果在上一章節對 LangChain 有掌握的話,特別是索引 (Indexes) 的部分,應該能夠理解整個流程。

🎒 準備好這些就可以開始

  • Pinecone : https://docs.flowiseai.com/vector-stores/pinecone
  • OpenAI API Key (新開帳號有5美元的免費額度) : https://platform.openai.com/account/api-keys
  • 設定好 Flowise 的開發環境 (不管是在自己的電腦還是雲端空間) ➪ 🖼️
  • 任何你想要查詢的文本(pdf, txt, csv),因為這會關係到 OpenAI API 費用的多寡,如果你是新開的帳號,極度不可能會超出免費額度,要注意的反而是在 rate limits。總之,選擇適當長度的文件做測試。我使用台北市主計處110年的重要指標摘要分析章節部份,並把多餘的空格處理掉,總共花費 0.07 美元(text-embedding & gpt-3.5-turbo-16k model)。
#用終端機指令快速去掉文件中多餘的空格
tr -d ' ' < input.txt > output.txt

😎 讓我們直接看Demo影片

🙋🏻‍♀️ 最後幾個問題需要留意

  1. AI 領域變化的速度非常快,可能讀者在閱讀時,某些現在的連結會失效 ,或是資訊已有變更。這篇文章延遲了一段時間,因為 Flowise 1.2.14 版本更穩定,也支援 gpt-3.5-turbo-16k model,讓我原本使用中文文件超出 4k tokens 問題也隨之消失。所以如果讀者發現類似的問題,請以官方的文件為主,也歡迎留言跟我說 🙏
  2. tokens 跟 characters 不一樣 。GPT 模型利用 tokens(文本中常見的字符序列)進行文本處理。你可以利用這個工具 tokenizer 了解 API 如何分解文本以及文本的 token 數量。API 的成本與處理的 token 數量相關,包括輸入和輸出的 tokens。因此,理解 tokenization 可幫助你更有效、節省成本地使用 API。
  3. 最近發現一個與 Flowise 類似的 LangFlow 。有了基本概念,相信你可以很上手選擇適合自己的工具了😉

為什麼會看到廣告
14會員
7內容數
AI 影響專題系列,將探索和體驗正在對我們的工作方式與日常生活產生結構性變革的最新產品。從第一手的角度分享這些產品的獨特功能與潛力,讓我們共同窺見這些革新產品所揭示的未來軌跡。
留言0
查看全部
發表第一個留言支持創作者!