LangChain框架揭秘: 從零開始了解開發LLM模型應用

Sean Yeh
Python Everywhere -from Beginner to Advanced
13 min readJun 4, 2024

--

Tomamu, Hokkaido, Japan, photo by Sean Yeh

大型語言模型(LLM)的橫空出現在NLP自然語言處理領域掀起了革命。它們能夠理解和生成高品質的文本,應用於問答、翻譯等多種任務。LangChain框架則是專為開發LLM應用而設計,提供了靈活且高效的解決方案。本文將帶你深入了解如何利用LangChain從零開始開發強大的LLM應用。

什麼是大型語言模型(LLM)?

大型語言模型(Large Language Model,簡稱LLM)是一種機器學習模型,利用大量的數據與資料進行訓練,它可以夠理解並且生成自然語言。LLM的核心是類神經網絡,這種架構適合處理序列型的數據資料,如文本內容。透過學習詞彙與短句之間的關係,LLM可以執行多種語言任務,例如回答問題、生成文本內容、翻譯語言以及對文本內容進行摘要。

現在,大型語言模型之所以受到矚目,得益於其強大的生成和理解能力,使得LLM在處理複雜的語言任務方面表現卓越。就以OpenAI GPT-4 這樣的模型來說,它能夠生成酷似於人類寫作的文章,甚至能夠模擬名人的風格創作詩歌和編寫劇本。這些模型的創新不僅推動了技術的進步,也改變了我們與技術互動的方式。

大型語言模型的應用範圍非常廣泛,從虛擬助理到AI聊天機器人,再到AI搜索引擎和文本內容編輯器。這些應用在各行各業中發揮著重要作用,大大地提升了自動化和AI化的水準,實具有革命性意義,成為現代科技不可或缺的一部分。

LangChain框架概述

LangChain是一個用來開發應用程式的框架,這個框架它是專門為開發基於大型語言模型(LLM)的應用而設計的。它的核心理念就是讓開發者能夠輕鬆地建立和架構LLM大型語言模型的各種應用程式,用來實現各種自然語言處理的任務。

LangChain由Harrison Chase等人共同開發。自2024年1月發布了第一個穩定版本以來,因其靈活的特性和強大的功能,迅速獲得了大眾廣泛的關注。

他們設計LangChain的目標,主要包括了提供簡單且容易操作的工具,幫助開發者可以輕鬆的在不同的語言模型之間切換,並能夠輕鬆地整合其他外部的資源。這使得開發者不需要特別為某個特定語言模型撰寫多種版本的程式碼,大大提高了應用程式的開發效率。

以目前來說,LangChain不僅支援Python、同時也支援JavaScript這兩種主要的程式語言,為開發者提供了各種豐富的元件和工具,以便快速建構功能強大的應用服務。

此外,不僅包含LangChain框架主體,在LangChain的生態系統中還包括各種延伸功能,例如LangServe和LangSmith。

LangServe是一個用於將流程機制部署為REST API的套件,而LangSmith則是一個專門為開發者設計的平台,它提供了測試、評估和追蹤LangChain應用服務的工具。這些工具共同構成了一個強大且靈活的開發環境,滿足不同層次和需求的開發者。

綜上所述,LangChain框架以其便利性和強大的功能為開發者提供了一個不錯的開發平台,讓開發者們能夠充分發揮大型語言模型LLM的潛力,能建造出各種創新的應用服務。

來源:https://python.langchain.com/v0.2/docs/introduction/

LangChain的組成元件

我們可以將LangChain框架分成多個核心元。每個元件都被設計用來處理大型語言模型(LLM)應用程式的不同方面,提供了高度的靈活性和可擴充性。以下是LangChain的主要組成元件:

1. Model元件

我們可以說Model元件是LangChain框架的基礎,它支援以下兩種類型的語言模型:

  • LLMs 語言模型
  • ChatModel 聊天模型

在LangChain框架中,LLMs 指的是text completion模型,主要功能在於文字的生成、完成與摘要任務。它可以接受一組文字字串prompt作為輸入值並返回另一組字串內容作為文章內容的補全,我們也可以說它就像是一個文字接龍。

與上面text completion模型不同的是,ChatModel 聊天模型可以參與對話。它會接受一系列的聊天訊息作為輸入,而輸出另一條訊息作為答覆。在LangChain裡面會有三個不同的角色標記,分別是System 、Human 和AI。在OpenAI裡面也存在三類標記,只不過在OpenAI裡面使用的名稱與此處相異,分別是system、 user 和 assistant。

在模型的選用上,LangChain與主要的語言模型供應商,如OpenAI、Anthropic和Hugging Face等合作,以便於開發者使用這些模型。

2. Prompt Template元件

此元件提供了建立和使用提示樣板(prompt Template)的工具,這些樣板不會被特定的模型所綁定,可以在不同的LLM大型語言模型之間輕鬆切換、重複使用,開發者只需要替換提示樣板中關鍵的部分,就可以變化出多種不同的指令。這種設計方式使得開發者可以建立標準化的提示,進而增加使用上的普遍性與彈性。

3. Output Parser元件

在與大型語言模型溝通的過程中,既然我們可以針對提問時的內容客製化提示的樣板,那麼想當然的對於大型語言模型回覆的答案也應該可以客製化結果吧!沒錯,Output Parser元件就具備這樣的功能。它是個輸出解析器,用於解析語言模型的輸出,並將其轉換為更符合我們需要、更具備結構化的格式。

LangChain提供了包括多種輸出的解析器,如JsonOutputParser可以將輸出解析為JSON物件、TextOutputParser可以解析為字串、CsvOutputParser則可以解析為CSV文件和XmlOutputParser解析為XML檔案,這些多樣化的輸出格式,可以滿足我們不同的使用情境需求。

4. Chain元件

Chain元件是將各個模型和工具串聯起來的流程鏈,使得開發者能夠結合多種元件建立複雜的應用服務。流程鏈的設計使得不同的LLM大型語言模型和工具可以無縫的協作,從問答到文本生成等各種任務得以順利的執行。

5. Memory元件

若要開發一個可以持續的與它對話的AI聊天助理,最重要的是可以「記住」使用者與AI助理之間的對話過程。在LangChain中有一個Memory元件,它可以從將對話記憶在這個元件中,讓語言模型參考對話紀錄再進行回覆,並且取得回覆後也可以將結果與問題再存入Memory元件中。

LangChain提供了多種實現記憶的方式來滿足不同使用場景的需求,包括將對話紀錄存入如SQ-Lite等的資料庫中,或者是將訊息存在文字檔案裡面。

6. Agent元件

有時候當我們想要讓LLM模型回答的結果更符合我們的需要時,我們會希望LLM模型可以回答我們昨天發生的事情(我們知道像ChatGPT之類的大型語言模型的學習資料只到2023年);有時候我們又會希望大型語言模型回答一些與計算有關的問題(當然,我們知道像ChatGPT之類的大型語言模型,雖然能言善道,但是碰到回答數學問題時,常常都是一塌糊塗),不要隨隨便便就給我們一個錯誤的答案。然而,該如何做?

LangChain中的Agent代理元件是一個可以為LLM大型語言模型加上其他功能的程式工具,讓語言模型適時的根據使用者的對話來選擇需要採用的工具,利於於建立以自然方式與使用者互動的應用服務。

換句話說,它會依據我們輸入的指令讓大型語言模型選擇下一步應該採取的行動,當該行動完成之後會自動將執行的結果再送回給模型,讓模型繼續選擇下一個步驟,直到模型認為已經得到所要的答案之後才停止。

7. Retrieve元件

我們都知道ChatGPT之類的大型語言模型,它的學習資料只到2023年為止的公開資訊。如果想要建立能夠回答企業內部私有的或者是特定領域相關的AI工具,該如何處理?理論上來說,我們可以將整份內部文件「餵」給語言模型,讓它只針對文件內容進行回答。然而實際上這樣做的話每一次的對話都需要將整份文件放入與模型對話的prompt指令中,會讓使用的token數量大增,甚至於超過模型可以承受的token數量。此外,讓模型直接在整份文件中大海撈針的找答案回答,可能也不會得到精確的結果。因此,目前大家會採用一種稱為RAG(Retrieval-Argumented Generation)的方式來處理,這種方式是以檢索文件而取得的資料來擴充語言模型的生成能力。

在LangChain中的Retrieve元件,它提供了一套用來從各種不同來源(包括資料庫、文件和網路)檢索數據的工具。可以將資料進行切片,並且將內容轉換成向量之後,再提供檢索。在使用者對模型尋問問題時,會先從向量化之後的資料片段中,尋找相似度較高的部分片段給模型作為回答的參考,模型依據這個片段的資料生成問題的答案。

上述這七個元件共同組成了一個強大且靈活的框架,使開發者能夠輕鬆地建構和部署LLM的應用服務,並充分發揮大型語言模型的潛力。

LangChain的優勢

由於LangChain框架具備的各種優越性,使它成為大型語言模型(LLM)應用服務開發上的首選。

靈活性

LangChain提供了高度的靈活性,讓開發者在不同的語言模型之間可以無縫的切換,不需要為不同的語言模型撰寫多種版本的程式碼,明顯提高了開發的效率。

簡單易用

LangChain擁有豐富的元件庫,包括模型、提示樣板、輸出解析器、流程鏈、記憶體和代理等,這些元件設計簡單易用,可以自由組合,滿足不同應用場景的需求。這使得開發者能夠快速建立功能強大的服務,進而加速產品的上市時間。

輕鬆擴充

LangChain具備強大的擴充性,能夠輕鬆利用外部的資源和工具,如資料庫、文件和網絡檢索模組。這使得開發者能夠建立更為複雜和智慧的應用,實現多樣化的功能。

生態系統

LangChain的生態系統之中,包括LangServe和LangSmith等工具,替開發者提供了全方位的支援。從開發、測試到部署,大大地簡化了整個開發流程,並提升了產品的穩定性和效能。

Model I/O

如果從LangChain整個輸入(Input)與輸出(Output)的範疇來看,LangChain從最初的prompt提示,到與大型語言模型的互動,最終輸出特定格式的結果。這個過程可以稱為模型的輸出/輸入(Model I/O)。這個範疇包括了與大型語言模型溝通的所有環節。

圖片來源:Model I/O

參考資料:https://python.langchain.com/v0.1/docs/modules/model_io/

如何開始使用LangChain

提到那麼多好處與功能,讓我們在此示範一下如何開始使用LangChain的範例。當然這裡示範的部分只是簡單的開始使用LangChain,就像是一般我們在開始使用一個程式語言時,會進行的「Hello World」一樣罷了。

安裝 langchain套件

在使用langchain 之前,請在自己的電腦中先建立一個虛擬環境,然後在虛擬環境中安裝langchain套件。

pip install langchain

使用 OpenAI模型

在此我們將使用 langchain_openai套件,這個套件將OpenAI模型包裝成一個Langchain套件,方便我們取用OpenAI模型,使我們在取用模型時更為簡單。請在同樣的環境中執行下面的指令安裝langchain_openai套件。

pip install langchain_openai

Langchain除了將OpenAI打包成套件外,它也針對Google gemini等模型打包為套件,您如果不喜歡使用OpenAI,可以選用其他的大型語言模型。(參考Langchain Doc

引入套件

安裝完畢之後,就可以建立一個python檔案,並且引入langchain_openai使用。程式碼如下:

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4-turbo", apikey="your-api-key")
msg = llm.invoke([("human", "What's the oldest known example of cuneiform")])

print(msg.response_metadata)

在上面的程式碼中,你可以在ChatOpenAI中指定model的參數。model可以讓你指定想要使用的模型,上面的範例採用的是OpenAI的 gpt-4-turbo 模型,當然您也可以改成比較便宜的 gpt-3.5-turbo模型。

結語

具備靈活性和強大功能的LangChain框架,為開發大型語言模型(LLM)應用服務提供了一個理想的平台。透過簡單的配置和豐富的元件庫,無論是文件內容生成、問答系統還是對話機器人這些高效能並且智慧的應用服務,都可以讓開發者快速的建立。

此外,LangChain還附有的記憶功能和流程鏈設計,使得應用開發更加流暢和便利。如果再結合LangServe和LangSmith等工具,整個開發、部署和優化過程將變得更為簡單。使用LangChain,開啟你的LLM應用服務開發之旅,必能發掘無限可能。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。