🦜🔗 LangChain 介紹:開放原始碼語言模型框架
2023年7月30日6 分鐘閱讀

🦜🔗 LangChain 介紹:開放原始碼語言模型框架

TL;DR

1️⃣ LangChain 定義了語言模型應用裡各個組件的職責,開發者可透過一致的介面,開發定製的語言模型應用。LangChain 提供兩種語言 SDK,分別為 PythonJavascript

2️⃣ LangChain的核心組件包括 Modals, Prompts, Indexes, Memory, Chains, Agents等。這些組件使開發者能整合內部及外部的數據資源,最大化大型語言模型的能力。

3️⃣ 通過一個點餐機器人的例子,展示如何運用LangChain的各種組件來實現特定應用。

4️⃣ 大型語言模型將開啟新的問題解決可能,LangChain等技術幫助我們逐漸實現更多的解決方案,以滿足未來更多的需求。


系列文前言

近期大型語言模型的進展,讓人對於未來軟體應用多了很多想像空間,許多工具、技術也如雨後春筍般出現。而我偶然間在和LINE的前主管的閒聊中,得知 LangChain 這個語言模型應用的開發框架,我覺得十分好奇,想更進一步了解這個技術,在閱讀完 LangChain 的官方文件後,心底油然而生對於這個未來技術的學習渴望,也希望分享自己的學習,能幫助到對於 LangChain 也同樣感興趣和好奇的你。

在這個 LangChain 的系列文中,會和大家介紹 LangChain 框架裡定義的各個組件。雖然官方已經有相關文件了,不過有的部份可能描述沒有這麼詳細,而且也沒有中文翻譯,所以在這裡希望能透過自己理解 LangChain 的方式以更淺顯易懂的方式和大家分享。

預計會在系列文中撰寫的 LangChain 組件:

  1. Modals
  2. Prompts
  3. Indexes
  4. Memory
  5. Chains
  6. Agents

這些核心組件就不再做中文翻譯了,這有點類似專有名詞的概念,之後統一用英文比較不會混肴。

LangChain是什麼?

LangChain 是一個開源的框架,專為簡化使用大型語言模型(LLMs)開發應用而設計的。LangChain中清楚定義了語言模型裡各個組件的職責,組件間透過一定的介面來做溝通,讓開發者能夠有條理、清晰地整合內部,外部的數據資源,再結合指令工程(Prompt Engineering),將大型語言模型的能力和數據使用得淋漓盡至。不論是開發者還是數據科學家,都能夠以更簡單一致的獲得完全定製的解決方案。LangChain 目前提供兩種主流語言的 SDK,分別為 Python 和 Javascript。

我們可以用手機 App 的例子來類比來理解 LangChain 的角色,我們先看看這3種元素:

  1. 基礎能力 - iPhone提供了強大的基礎能力如上網、拍照、算力等等,
  2. 數據 - iPhone使用者擁有許多數據,如照片、 貼文內容
  3. App - 如 YouTube, Instagram, Facebook

在手機 App 應用場景中,我們需要許多的客製化 App,才能最大化基礎能力和數據帶來的效益,像是用戶需要使用 Google 相簿的手機App才能夠在 iPhone 上觀看照片、或是使用 Facebook App 才能運用 iPhone 上網的能力觀看貼文等等。

類比回語言模型的應用場景中,基礎能力相當於各種強大的語言模型,但只有模型本身能解決的問題還是有限的,我們還需要 數據 和 App (語言模型應用) 才能最大程度地解決我們的問題。LangChain 的角色就是扮演著一座橋梁,串接 基礎能力數據,搭建出客製化的語言模型 App,來解決各種不同應用場景的問題。

LangChain App Flow 示意

LangChain的核心組件

在我們開始看一些應用場景之前,先來簡單了解一下以下 LangChain 提供核心組件:

Modals

LangChain 本身不是模型提供者,它只是提供一個標準的介面讓 LangChain 可以用一樣的方式來調用各種不同的語言模型,像是 OpenAI 的 GPT3.5, GPT4

Prompts

LangChain 提供一系列工具來幫助開發者操作指令 Prompt 的輸入、輸出,如:

  1. Prompt Template: 提供對語言模型輸入 Prompt 的模版
  2. Output Parser: 提供語言模型該如何回傳輸出文字的指示
  3. Example Selector: 如果開發者的 Prompt 有比較多輸出、輸入的樣版,也能夠以程式碼形式將示例載入至Prompt指令中

Indexes

Indexes 是 LangChain 對於數據源處理很重要的一個部份,以數據索引生命週期的角度來看又可更細分為以下組件:

  1. Document Loader: 讀取各種本地文件、網頁內容等等
  2. Text Splitter: 由於模型都有輸入 token 數量的限制,所以需要將讀取完的數據切分成較小的切片再做儲存,以利之後的讀取
  3. Vector Store: 分片和預處理完的數據會儲存到 Vector Store ,之後能透過向量的相似性比對,來請求內容
  4. Retriever: 開發者除了可以依據向量來對 Vector Store 做請求,還可以定製不同的獲規則

Memory

大型語言模型本身是沒有記憶的,需要靠模型調用方將對話的上下文再次輸入到接續的對話中,才能實現語言模型擁有記憶的能力,LangChain 提供不同的方法來處理對話中的上下文記憶。

Chains

Chain 可以像成是輸入和輸出 Pipeline 中的其中一個流程,當語言模型應用需要多個流程來做處理時,LangChain 提供了 Chain 介面,讓不同的處理流程間能夠彼此交互。

Agents

有的應用需要在有用戶輸入請求時,才能動態判斷應該使用什麼 Pipeline 來做處理請求,此時就是使用 Agent 的時機,Agent 能根據不同工具的描述,挑選出適合處理該請求的工具。

除了 LangChain 原生提供的各種工具,開發者也能夠自定義工具來處理請求。

最後,再以一個語言模型應用來示意各 LangChain 組件中的關係:

LangChain Components 關係示意

LangChain的簡單應用場景

有了上述 LangChain 基礎組件的了解,再講述應用場景能夠更清晰每個基礎組件在應用中的定位,假如我們開了一間早餐店,就可以運用手中的菜單資訊,來實現一個點餐系統的聊天機器人流程:

  1. 用戶機器人表示想點餐
  2. 機器人使用語言模型識別出點餐意圖,挑選出處理點餐的工具 (Modal, Agent)
    1. 點餐工具從數據存儲中取得菜單 (Indexes)
    2. 將菜單以清單方式返回給用戶 (Prompt - Output Parser)
  3. 用戶看完清單,輸入點餐訊息,如: “我要2個豬肉蛋漢堡、1杯冰奶茶”
  4. 機器人識別出建立訂單意圖,找尋處理建立訂單工具 (Agent, Memory)
    1. 訂單工具解析、結構化用戶輸入 (Prompt - Output Parser)
    2. 將輸出返回給用戶確認訂單內容是否正確
  5. 用戶確認無誤,將結構化訂單訊息存入資料庫,觸發餐點製作等後續流 (Memory)

雖然流程簡化了很多細節,希望能讓大家更具體了解一個聊天機器人服務終端用戶時,如何拆分出子任務,以及運用 LangChain 的組件能力來滿足子任務的需求。

結語 - 未來的語言模型應用

大型語言模型的問題解決能力像是開闢了一個新世界的大門。如果把一個瓶子裡的空間比喻為AI能解決的所有問題,ChatGPT就像是放在這個空瓶子裡的一塊大石頭。這塊大石頭已經解決很多問題,但瓶子內依然存在著很多空間。我們的世界仍然有許多尚未被AI解決的問題,這些問題需要更多針對性的、客製化的解決方案,等待像是 LangChain 這樣的技術逐漸添加更多的小石子和細砂進瓶子,來解決更多的問題。期待新的技術,能夠助我們生活和工作更加高效,讓我們有更多的時間去做更重要的事情。

順帶一提,LangChain近期的估值約達2億美元。這代表了市場對於AI領域的高度期待,未來究竟會變得怎麼樣,讓我們繼續看下去…