LangChain內幕指南

哥不是小蘿莉發表於2023-11-28

1.概述

在人工智慧迅速演進的時代,諸如Open AI的ChatGPT和Google的Bard等大型語言模型(LLMs)正徹底改變我們與技術互動的方式。這些技術巨頭和SaaS公司正在競相利用LLMs的威力,創造更為智慧和實用的應用程式。然而,真正的變革並非僅僅停留在這些獨立執行的人工智慧模型,而是蘊藏在它們與其他工具、外掛以及知識庫相互融合的時刻。正是在這個潮流中,LangChain嶄露頭角——這個前沿框架旨在為語言模型賦予超能力,重新定義了在人工智慧領域的可能性邊界。本文將深入解析LangChain的重要性,揭示它為企業將LLMs整合到其軟體中提供的看似神奇的能力,並展望LangChain是如何在人工智慧的世界中改變遊戲規則的。

2.內容

在人工智慧領域,'LangChain'這個名字融合了'Lang'(代表語言)和'Chain'(代表連結或串聯),象徵著將不同元素連結(或串聯)起來,創造圍繞這些LLMs的先進應用程式。在這裡,我們將深入探討構成LangChain骨幹功能的幾個關鍵概念。這些概念不僅僅是技術術語,更代表了LangChain用於實現其所有魔力的獨特策略和技術。

注意: 從現在開始,當你看到“model”一詞時,知道我們指的是類似OpenAI的GPT-4這樣的LLM。而當你看到“prompting”時,這是指透過詢問特定問題或提出某些陳述來“與模型交流”的方式。

2.1 LangChain的關鍵概念

2.1.1 思維鏈(CoT)

思維鏈就像一個語言模型在大聲思考,提供其思考過程的逐步分解。這是一種促使模型生成一系列中間推理步驟的提示技術,使其認知過程一覽無餘。這就像與模型進行對話,讓它解釋其推理過程,使其成為需要複雜問題解決的任務更有效的工具。

2.1.2 行動計劃生成

這是一種提示技術,利用語言模型生成要採取的行動。這些行動的結果可以反饋到語言模型中生成後續的行動。這就像與模型進行動態對話,它建議行動,然後根據這些行動的結果做出反應。這使模型更具互動性和響應性,能夠適應變化的情況和要求。

2.1.3 ReAct(推理與行動)

ReAct是思維鏈和行動計劃生成的完美結合。它不僅是模型建議行動,更關乎行動背後的“為什麼”。這涉及到模型花時間思考、推理,然後行動。這創造了與模型更為有深度的對話,使你的互動不僅僅是一系列命令和響應,而是一場動態的對話。

2.1.4 自問自答

想象一下一個語言模型不僅僅是對提示的回應,而且主動向自己提出跟進問題。這就是自問自答。這是一種提示方法,鼓勵模型在內部更主動、好奇。這些問題不是面向使用者或外部實體,而是在模型“頭腦中”引導生成後續響應。這將模型從被動回應者轉變為主動學習者,使其在需要探索和學習或當模型不知道正確答案時更為有效。

2.1.5 提示串聯

這涉及將多個LLM呼叫結合起來,使一個步驟的輸出成為下一個步驟的輸入,從而創造出串聯效果。就像進行接力賽一樣,接力棒從一個跑步者傳遞到另一個,每個貢獻者都推動團隊整體進展。

2.1.6 模因代理

這個概念利用語言模型模擬知名人物或情境來塑造其響應。透過將討論框架置於模型識別的上下文中,例如學生與老師之間的對話或向著名哲學家提出的道德問題,鼓勵模型以特定方式響應。這種方法有效地編碼了複雜的任務和對問題背景的假設,使模型更具適應性和響應性。這涉及將模型的響應調整到對話的上下文,並使用文化資訊和眾所周知的場景來引導模型的行為。

2.1.7 自洽性

這個概念透過建立多個解決方案並選擇最一致的方案,使AI的響應更可靠。它有助於確保AI的答案合理且不互相矛盾,使其成為更值得信賴和可靠的工具。

2.1.8 Inception(第一人稱指導)

這個概念透過在提示中包含模型響應的開始,鼓勵模型以某種方式思考。它旨在引導模型的思考過程,使其成為在需要特定推理或方法的任務中更為有效的工具。例如,你可以讓模型“給我講個笑話,讓它以“哈哈哈”開始”,其中以“哈哈哈”開始是你給出的指導性指令。

2.1.9 記憶提示

這個概念類似於一個從過去互動中學習的個人助手。它記錄了當系統誤解你的請求以及你提供的改進意見的情況。下一次你提出類似的問題時,記憶提示使用這個“記憶”來改進其響應。這是系統持續改進並適應你的需求的一種方式,使其隨著時間更為可靠和有效。

2.1.10 記憶提示

這個概念類似於一個從過去互動中學習的個人助手。它記錄了系統誤解你請求以及你對如何做得更好的反饋。下一次你提出類似問題時,MemPrompt使用這個“記憶”來改進響應。這是系統不斷改進並適應你需求的方式,使其隨著時間變得更加可靠和有效。

到目前為止,我們已經深入探討了構成LangChain基礎的關鍵概念,這些是指導其操作的理論基礎和創新的AI技術。這些概念提供了LangChain的“為什麼”和“是什麼” - 為什麼它以這種方式工作,它的目標是什麼。在這個過程中,我們不僅僅是看到LangChain的實現方式,還將瞭解它的組成部分,以及這些關鍵概念如何在實際應用中相互作用,為使用者提供令人驚歎的體驗。

2.2 理解推動系統能力的核心元件

深入瞭解LangChain的世界,我們遇到了其核心框架,一個經過精心設計的結構,將各種元素集結在一起,打造成一個強大的語言模型應用工具。該框架圍繞兩個主要理念構建:元件和用例特定鏈。

2.2.1 元件

元件是LangChain的構建模組,它們是匯聚在一起建立整體系統的個體元素。這些元件包括模型、提示、索引、記憶、鏈和代理。在LangChain生態系統中,每個元件都發揮著特定的作用,瞭解這些作用對於掌握LangChain的全部潛力至關重要。

2.2.2 用例特定鏈

另一方面,用例特定鏈是LangChain提供的“快速入門”解決方案。想想你想要構建什麼,選擇最符合你目標的鏈,然後從那裡開始構建。它們是預構建的、定製的鏈,專為特定用例設計,如個人助手、聊天機器人、資訊提取和摘要等,使其成為一個真正多才多藝的工具。

在接下來的部分中,我們將更詳細地瞭解這些元件和用例特定鏈,揭示它們的作用、重要性以及它們如何共同努力,使LangChain成為一個強大的工具。做好準備,因為我們即將深入探討LangChain的核心!

2.2.3 Schema(LangChain的藍圖)

Schema在LangChain中是指導資料解釋和互動的基礎結構。這非常類似於建築的藍圖,勾勒出一切的位置和如何相互配合。

截至今天,與語言模型互動的主要介面是透過文字。這就是“文字輸入,文字輸出”概念發揮作用的地方。簡單來說,LangChain中的許多模型都是基於這一原則運作的。你輸入文字,模型處理它,然後輸出文字。因此,理解Schema是基本的,因為它構建了LangChain如何結構和解釋資料的基礎。這就像在開始玩遊戲之前設定遊戲規則一樣。

2.3 LangChain的引擎

迄今為止,我們已經多次提到模型,因為它們確實是推動LangChain功能的引擎。然而,值得更深入地挖掘一下,以更好地瞭解這些模型究竟有多重要。畢竟,它們處理所有的輸入並生成所有的輸出——沒有它們,LangChain將無法存在。

LangChain使用三種主要型別的模型進行使用和互動:

2.3.1 大型語言模型(LLMs)

大型語言模型(LLMs)如OpenAI的GPT、Google的PaLM和ME他的LLaMA構成了LangChain的核心。透過在大量文字資料上進行訓練,這些模型學習語言的模式和結構,以生成有意義的輸出。它們處理語言輸入並生成響應,實現動態和互動式語言應用。每個LLM都有其獨特的優勢,使它們成為LangChain生態系統中各種任務的多功能工具。

2.3.2 聊天模型

另一方面,聊天模型提供了一種更有結構的方法。儘管它們通常由語言模型支援,但與它們互動的方式更有結構。它們將訊息列表作為輸入,並返回一條訊息作為輸出。通常,輸入列表中的每條訊息都有兩個屬性:'role'和'content'。'role'通常由'system'、'user'或'assistant'組成,而'content'包含訊息的文字。這正是ChatGPT的工作方式!這種定義明確的結構允許與LLM進行更微妙和互動的對話,並賦予它一種類似人類聊天的感覺。

重要的是要注意,雖然LLMs和聊天模型都用於生成文字,但關鍵區別在於它們處理輸入和輸出的方式。LLMs處理文字字串,而聊天模型處理結構化的訊息列表,使它們更適合進行互動式對話,如實時來回對話。

2.3.3 文字嵌入模型

LangChain利用的第三種也是最後一種模型元件是文字嵌入模型。文字嵌入模型有點像語言翻譯器,但與其將一種語言翻譯成另一種語言不同,它們將文字翻譯成數字。它們將文字作為輸入,將其轉換為一系列數字(或'floats'),建立原始文字的數值表示並將其儲存在資料庫中。

將文字轉換為數字的這種轉換非常有用,因為它意味著模型現在可以訪問文字在所謂的向量資料庫中的資訊(想象一下一個三維空間,在這個空間的所有方向上LLM可以“思考和檢視”——前進、後退、上升、下降、左移、右移、內部和外部)。這個四維資料庫允許進行語義風格的搜尋,其中看似不相關的文字片段可以在向量空間中進行相似性比較。

簡單來說,這是LLM從文字中獲取含義的一種方式,而不需要人告訴它含義應該是什麼。有趣的是,這有點類似於我們人類大腦的工作方式。我們將感官輸入(文字)轉換為電訊號(數值)並儲存在大腦中(向量資料庫)。

無論是LLM、聊天模型還是文字嵌入模型,它們都共同作為推動LangChain功能的引擎,理解它們是發揮系統全部潛力的關鍵。在其實際應用中,你可能會看到它們整合到一個聊天機器人中,最初,我們使用聊天模型處理使用者輸入並生成適當的響應。它呼叫LLM生成更微妙的響應。我們還使用文字嵌入模型將使用者的輸入(例如,他們的幫助文件、支援資源等)上傳並轉換為數值格式,儲存在向量資料庫中。當聊天機器人需要檢索相關資訊時,它使用搜尋工具有效地掃描向量資料庫並找到正確的答案。

2.4 Prompt在LangChain中的作用

或許你最近已經聽說過“prompts”或“prompting”這個術語,因為提示在根本上是與LLMs進行互動的入口點。在最簡單的術語中,提示是你輸入到模型的問題或陳述。它們就像汽車的方向盤,引導模型朝著你想要的方向前進。當涉及到LangChain時,提示的使用由三個基本方面塑造,即Prompt模板、示例選擇器和輸出解析器。

2.4.1 Prompt模板

Prompt模板就像建立模型輸入的食譜。這不僅僅是關於你問模型什麼,而是關於你如何問它。提示模板可以引導模型以特定的方式呈現其響應,使輸出對你的具體需求更有用。

使用這種“食譜”格式,一個提示可以包含對語言模型的具體指令,對模型的問題,甚至是一組“few-shot”示例(few-shot示例本質上是你提供給模型的一小組帶有上下文的示例,幫助它理解你期望的響應型別)。

2.4.2 示例選擇器

在這個功能中,LangChain引入了示例選擇器。這些工具允許你在提示中包含示例。但與之前的固定示例不同,示例選擇器根據使用者輸入動態選擇它們,為提示增加了一層額外的適應性。

2.4.3 輸出解析器

最後,我們有輸出解析器。這些工具幫助構造模型的響應。它們指導模型如何格式化其輸出,然後將這個輸出轉換為所需的格式。這可能是從模型的響應中提取特定資訊,也可能是將響應轉換成清晰、有序的資料表、圖表,甚至編碼語言。

讓我們想象一個實際的場景。假設你是一名產品營銷經理,想要使用你的LangChain驅動的應用程式為新產品生成一份潛在功能清單。你可以使用Prompt模板指導模型以專案列表的形式生成其想法。示例選擇器可以根據你的輸入動態選擇示例,為模型的響應增添深度和相關性。而輸出解析器可以將這些響應結構化成清晰、有序的格式,便於與團隊進行審查和討論。

簡而言之,在LangChain中,提示充當導航輔助工具,引導與模型的對話,塑造其響應,並最大化其輸出的實用性。它們既是藍圖,也是安全措施,將LangChain和LLMs轉變為強大、靈活且量身定製的與語言模型互動的工具。

2.5 索引在LangChain中的作用

在龐大的數字圖書館LangChain中,索引就像一位知識淵博的圖書管理員。它們高效地組織和檢索資訊,默默地在幕後工作,確保你與LangChain的互動是流暢而高效的。

2.5.1 文件載入器

想象一下,你在一家擁有成千上萬本書的圖書館裡,正在尋找一本特定的書。如果沒有圖書管理員或索引系統,這將是一項艱鉅的任務。類似地,LangChain處理大量資料,如果沒有索引,查詢特定資訊就像大海撈針。

在LangChain中,索引將文件結構化,使LLMs能夠有效地與它們進行互動。這種互動通常涉及到“檢索”步驟,類似於向圖書管理員詢問特定的書。圖書管理員,或在這種情況下,索引,根據你的查詢返回最相關的文件。

2.5.2 文字分割器

一旦圖書(文件)在圖書館中,它們需要以有意義的方式進行組織。這就是文字分割器發揮作用的地方。它們將大塊文字分解成更小、更易管理的部分。這類似於將一部長篇小說分成章節,使查詢特定部分更容易。

這種分割的原因是由於語言模型的上下文視窗。語言模型一次只能考慮一定數量的文字,稱為上下文視窗。透過將文字分割成較小的部分,我們確保語言模型能夠有效地處理其上下文視窗內的資訊,從而最大程度地提高結果的準確性和相關性。

2.5.3 向量儲存

說到向量儲存可能需要用到向量資料庫。它們是LangChain中索引系統的核心。它們是依賴於embedding的最常見型別的索引。

如果我們的圖書館類比仍然成立,那麼在向量儲存中,embedding就像分配給每本書的唯一程式碼。這個程式碼或數值代表文件的內容,使其更容易與相關的查詢匹配。

2.5.4 檢索器

最後,我們有檢索器,我們數字圖書館的圖書管理員。它們是用於獲取與語言模型組合的相關文件的介面。當查詢進來時,檢索器遍歷索引,找到最相關的文件,並呈現它們供語言模型進一步處理。

在現實世界中,假設你是一位客戶成功主管,正在使用LangChain分析客戶反饋。反饋是豐富而多樣的,就像圖書館中的書一樣。藉助索引的幫助,你可以快速檢索與產品的特定功能相關的具體反饋。這種高效的資訊檢索使你能夠更快地獲取見解,做出基於資料的決策。

總的來說,你需要知道的是,LangChain中的索引是一種強大的工具,可以高效地結構化和檢索資料。它們是確保你與LangChain的互動流暢、高效和高產的來源。

2.6 LangChain中記憶的關鍵作用

在LangChain的世界中,記憶在創造無縫互動體驗方面起著至關重要的作用。就像人類的記憶一樣,LangChain的記憶負責保留和回憶資訊。

2.6.1 短時記憶

短時記憶就像一個記事本,你在其中記下需要短時間記住的事物。在LangChain中,短時記憶跟蹤當前的對話。這就像記住剛剛在對話中說了什麼,這對於理解上下文並做出適當的回應至關重要。

2.6.2 長時記憶

長時記憶就像一個長時間內積累的大量資訊的圖書館。在LangChain中,長時記憶用於記住AI與使用者在不同對話中的互動。這就像記住朋友的偏好或過去的經歷,可以用來提供更個性化和相關的回應。

2.6.3 索引與記憶:目錄系統與連續保持者

或許你會想知道,記憶與我們之前討論過的索引或向量資料庫的概念有何不同?這裡有一個區別:

索引和向量資料庫就像圖書館的目錄系統一樣,它們有助於高效地組織和檢索文件。它們不記住互動的順序,而是專注於為當前查詢找到最相關的響應。

相反,記憶就像圖書管理員的知識,它有助於記住過去的互動,併為將來的對話提供上下文。換句話說,根據先前的言論或提問理解上下文。

在現實世界中,假設你是一名產品經理,正在使用LangChain進行產品開發。你正在收集使用者反饋以改進產品。藉助LangChain的記憶功能,AI可以記住與每個使用者的過去互動,根據他們的使用歷史瞭解反饋的上下文,並對其建議或關切提供個性化的回應。這使你能夠更深入地瞭解使用者需求和偏好,幫助你更明智地做出有關產品改進的決策。

2.7 LangChain的編排系統

LangChain將迄今討論的各種不同元件匯聚在一起,以建立一種與語言模型產生有意義和相關響應的互動。它們充當主導者,幫助建立一個緊密而可用的系統。

2.7.1 LangChain的定義

鏈條就像工廠裡的生產線,每個元件執行特定的任務,最終產品是所有這些任務按照特定順序執行的結果。有兩種常見型別的鏈條,LLMChain和與索引相關的鏈條。

2.7.2 LLMChain

迄今為止,最常見的鏈條型別是LLMChain。它結合了我們迄今為止討論的許多要素,其中包括:

  • PromptTemplate:準備原材料(輸入)
  • Model(LLM或ChatModel):處理這些材料
  • Guardrails(可選):確保最終產品符合要求標準的質量檢查

你可以將LLMChains視為通常與模型進行互動和參與的預設方式。

2.7.3 與索引相關的LangChain

根據你的用例,您還將遇到與索引相關的LangChain。這些LangChain專門用於與索引進行互動,將您自己的資料(儲存在索引中)與LLMs相結合。

有四種主要型別的與索引相關的LangChain,每種都具有處理多個文件的獨特方法。讓我們來詳細瞭解:

1.Stuffing

這是最簡單的方法,其中所有相關資料都“填充”到提示中作為上下文傳遞給語言模型。

  • 優勢: 僅對LLM進行一次呼叫。在生成文字時,LLM一次性訪問所有資料。
  • 劣勢: 大多數LLMs都有上下文長度限制,對於大型文件(或許多文件),這種方法將無法工作,因為它會導致大於上下文長度的提示。

2.Map Reduce

此方法涉及在每個資料塊上執行初始提示(對於摘要任務,這可能是該塊的摘要;對於問答任務,這可能是僅基於該塊的答案)。然後執行另一個提示以組合所有初始輸出。

  • 優勢: 可以擴充套件到更大的文件(和更多文件)。對各個文件的LLM呼叫是獨立的,因此可以同時進行。
  • 劣勢: 需要比Stuffing更多的對LLM的呼叫。在最終組合呼叫期間會丟失一些資訊。

3.Refine

此方法涉及在第一個資料塊上執行初始提示,生成一些輸出。對於剩餘的文件,將傳遞該輸出以及下一個文件,要求LLM根據新文件調整輸出。

  • 優勢: 可以引入更相關的上下文,可能比Map Reduce更準確。
  • 劣勢: 需要比Stuffing更多的對LLM的呼叫。這些呼叫也不是獨立的,這意味著它們無法與Map Reduce同時進行。還有一些關於文件排序的潛在規則需要遵循。

4.Map-Rerank

此方法涉及在每個資料塊上執行初始提示,該提示不僅嘗試完成任務,還為其回答的確定程度打分。然後根據此分數對響應進行排名,並將最高分返回給您。

  • 優勢: 與Map Reduce相似的優勢,儘管與Map Reduce相比,需要的呼叫較少。
  • 劣勢: 無法在文件之間組合資訊。這意味著在您希望在單個文件中獲得單一簡單答案時最有用。

這些LangChain提供了一系列處理多個文件的選項,滿足不同的需求和場景。無論你處理少量資料還是大型文件語料庫,LangChain的與索引相關的鏈條都提供了一種靈活而高效的方式來與你的資料和LLMs進行互動。

2.8 代理

代理是LangChain中的自治實體,代表使用者與生態系統中的其他代理和工具進行互動。它們是決策者,根據使用者輸入和目標選擇要利用的工具。這種適應性和即時智慧使代理成為處理複雜多步任務的關鍵元件。

2.8.1 代理的角色

在LangChain中,代理的角色就像交響樂團的指揮,協調各個元件以建立和諧的互動。它們負責解釋使用者輸入,決定使用哪些工具,並管理系統內的資訊流。這種適應性和智慧使代理成為處理複雜多步任務的關鍵元件。

2.8.2 代理的型別

LangChain支援兩種主要型別的代理:動作代理和計劃執行代理。

1.動作代理

動作代理更傳統,適用於小型任務。它們就像比賽中的短跑者,快速而專注於單一任務。

2.計劃執行代理

計劃執行代理更適用於複雜或長時間執行的任務。它們處理初始規劃步驟,有助於保持長期目標和專注。它們就像馬拉松選手,具有戰略性和耐力性。

2.8.3 代理在實際場景中的應用

在現實場景中,代理可以以各種方式使用。例如,產品經理可以使用代理來分析客戶反饋並生成見解。代理可能決定使用情感分析工具來了解反饋的整體情感,然後使用總結工具將反饋濃縮為關鍵要點。

同樣,設計師可以使用代理根據使用者輸入生成設計思路。代理可能決定使用頭腦風暴工具生成思路列表,然後使用排名工具根據特定標準對思路進行排序。

3.總結

在LangChain的世界中,我們探討了系統的各個組成部分,從模型和提示到索引、記憶、鏈和代理。這個系統巧妙地利用這些元件,創造了一個強大的語言模型應用工具。模型是引擎,索引是高效的圖書館管理員,記憶是延續對話的守護者,鏈是協調器,而代理是決策者。

Prompt是與LLMs互動的入口,而索引則像圖書館的目錄系統,幫助我們高效組織和檢索資訊。記憶分為短時記憶和長時記憶,使LangChain能夠以連貫的方式處理對話,就像人類記憶一樣。鏈則將所有元件有機地結合在一起,建立有意義且相關的模型響應。最後,代理是LangChain中的決策者,像交響樂團的指揮,協調各個元件,處理複雜多步任務。

這個全面而精緻的系統展現了LangChain如何利用先進的語言模型技術,透過巧妙的設計和智慧決策,為使用者提供卓越的體驗。

4.結束語

這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!

另外,博主出書了《Kafka並不難學》和《Hadoop大資料探勘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裡點選購買連結購買博主的書進行學習,在此感謝大家的支援。關注下面公眾號,根據提示,可免費獲取書籍的教學影片。