LangChain 提供兩種主要的任務鏈結型別:LCEL 和傳統任務鏈結。LCEL(LangChain Execution Language)任務鏈結以特定領域語言定義,具備高度靈活性及可擴充套件性,適用於複雜邏輯和動態工作流程,例如構建能提取使用者資料、分析並產生客製化報表的系統。傳統任務鏈結則較為簡潔易用,適用於標準化任務,例如根據使用者查詢生成格式化的電子郵件回覆。理解這兩種鏈的特性,才能根據應用場景選擇合適的工具。客戶支援聊天機器人便是一個典型的應用案例,它可以整合 LLM、提示和工具,處理使用者訊息、提供預設答案,並在必要時將對話轉移給人工客服。開發者可以利用 LangChain 提供的工具,例如 OpenAI 的語言模型和 PromptTemplate,構建和自訂聊天機器人的任務鏈結。

4. 末端點:任務的終點

末端點是任務鏈結的終點,代表著任務的完成。無論是生成回應、更新資料函式庫或觸發其他動作,末端點都標誌著任務的完成。

客戶支援聊天機器人範例

以下是使用 LangChain 實作的客戶支援聊天機器人範例:

觸發點:使用者向聊天機器人傳送訊息。

步驟

  1. 處理使用者的訊息並將其作為輸入傳遞給大語言模型(LLM)。
  2. LLM 根據輸入和預定義的提示生成回應。
  3. 然後使用工具(例如情感分析、實體識別)處理回應。

決策點 如果使用者的訊息被分類別為投訴,則將對話轉移到人工代理。 如果使用者的訊息是常見問題,則可以提供預定義的答案。 末端點:完成對話流程。

步驟中的內部元件

在此範例中,內部元件(LLM、提示、工具)在每個步驟中共同工作,而高階元件(觸發點、步驟、決策點、末端點)定義了任務鏈結的整體結構和流程。語言模型(LLM)是每個任務鏈結的核心,負責理解和生成類別似人類的文字。提示指導 LLM 生成相關且連貫的回應。工具允許任務鏈結與外部世界互動,例如從 API 中提取資料、查詢資料函式庫或執行特定任務。一些任務鏈結還具有記憶元件,以便在多次互動中保留上下文。

任務鏈結型別

現在您瞭解了基本元件,讓我們探索 LangChain 中的兩種主要任務鏈結型別:LCEL(LangChain 執行語言)任務鏈結和傳統任務鏈結。LCEL 任務鏈結更為現代和靈活,而傳統任務鏈結更為直接和簡單,適合於較不複雜的任務。

LCEL 任務鏈結

LCEL 代表「LangChain 執行語言」,是一種現代的建立任務鏈結方式。LCEL 任務鏈結允許您使用為此目的而設計的特定領域語言定義任務鏈結,並具有對每個步驟的細粒度控制: 靈活性:您可以定義複雜的邏輯並無縫地整合各種操作。 可擴充套件性:由於其模組化性質,您可以輕鬆擴充套件和修改它們,使其成為理想的選擇,適用於日益增長的應用程式。

使用案例:假設您需要開發一個系統,用於提取使用者資料、分析它們並動態生成個人化報告。您可以使用 LCEL 任務鏈結以精確度建立此工作流程,並有效地處理每個方面的任務。

傳統任務鏈結

傳統任務鏈結是 LangChain 中建立任務鏈結的原始方法。雖然它們不如 LCEL 任務鏈結那樣靈活,但由於它們已經預先構建以處理特定任務,因此您會發現它們更容易使用。 簡單性:這些任務鏈結在實作上更為直接,需要較少的設定和組態。 直接應用:您可以選擇它們來應用於工作流程穩定且變化或自訂化需求較少的應用程式中。 使用案例:如果您的應用程式需要執行標準任務,例如根據使用者查詢生成格式化的電子郵件回應,傳統任務鏈結可能是完美的選擇。

LCEL 和傳統任務鏈結之間的差異

最好檢視一些建立 LCEL 和傳統任務鏈結的範例,以瞭解它們之間的差異。

LCEL 任務鏈結範例 以下是 LCEL 任務鏈結的一個簡單範例:

# LCEL 任務鏈結
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

from langchain.chains import load_chain

圖表翻譯:

此圖示為 LCEL 任務鏈結範例,展示瞭如何使用 LangChain 建立一個簡單的任務鏈結。圖中展示了 LCEL 任務鏈結的基本元件,包括觸發點、步驟、決策點和末端點。每個步驟都使用特定領域語言定義,並具有對每個步驟的細粒度控制。這使得 LCEL 任務鏈結更為靈活和可擴充套件。

什麼是 LCEL 和 Legacy Chain?

在人工智慧和自然語言處理領域中,LCEL(LangChain Embedding)和 Legacy Chain 是兩種不同的方法,分別用於構建和執行複雜的任務流程。瞭解這兩種方法的差異和適用場景對於開發高效的 AI 應用程式至關重要。

LCEL Chain

LCEL Chain 是一種較新的、更先進的方法,提供了更大的靈活性和控制度。它允許開發人員定義複雜的邏輯和資料流程之間的控制流程,使其更適合於需要高階別自定義和控制的應用程式。LCEL Chain 還提供了流式處理、非同步執行和自動可觀測性等先進功能,從而使其成為大多數現代應用程式的首選方法。

Legacy Chain

Legacy Chain 是一種較舊的方法,使用 LLMChain 類別構建。雖然它仍然可以滿足某些基本需求,但與 LCEL Chain 相比,它缺乏先進功能和靈活性。Legacy Chain 更適合於簡單、直接的任務流程,不需要複雜的控制流程或高階別自定義。

何時使用不同的 Chain 型別?

選擇 LCEL Chain 或 Legacy Chain 取決於具體的應用程式需求和複雜度。

LCEL Chains 的使用場景

  1. 複雜邏輯和控制流程:當您需要定義複雜的邏輯和控制流程時,LCEL Chain 是更好的選擇。它提供了更大的靈活性和控制度,允許您自定義任務流程以滿足特定的需求。
  2. 高階別自定義:如果您的應用程式需要高階別自定義,例如自定義資料流程或非同步執行,LCEL Chain 是更適合的選擇。
  3. 先進功能:LCEL Chain 提供了流式處理、非同步執行和自動可觀測性等先進功能,使其成為大多數現代應用程式的首選方法。

Legacy Chains 的使用場景

  1. 簡單任務流程:如果您的應用程式只需要簡單、直接的任務流程,Legacy Chain 可能是足夠的。
  2. 基本需求:如果您的應用程式不需要複雜的控制流程或高階別自定義,Legacy Chain 可能是更簡單、更直接的選擇。

使用 LCEL 鏈條的時機

LCEL 鏈條是一種強大的工具,適用於處理大型資料集或需要即時處理資料的場景。它支援串流、非同步執行和平行化,讓您能夠高效地處理複雜的資料任務。

何時使用 LCEL 鏈條

  1. 大型資料集:當您需要處理大量資料時,LCEL 鏈條是最佳選擇。它可以高效地處理大型資料集,並提供即時的結果。
  2. 實時處理:如果您需要即時處理資料,LCEL 鏈條是您的最佳選擇。它支援非同步執行和平行化,讓您能夠快速地處理資料。
  3. 外部 API 整合:當您需要整合外部 API、資料函式庫或服務時,LCEL 鏈條是您的最佳選擇。它支援自定義工具和外掛,讓您能夠輕鬆地整合外部資源。

Legacy 鏈條

Legacy 鏈條適用於以下情況:

  • 簡單使用案例:當您有一個簡單的使用案例,不需要複雜的邏輯或自定義整合時,Legacy 鏈條是您的最佳選擇。
  • 快速原型設計:Legacy 鏈條適合快速原型設計和實驗。
  • 穩定資料集:當您工作於一個穩定的資料集時,Legacy 鏈條是您的最佳選擇。

建立 LCEL 鏈條

建立 LCEL 鏈條需要兩個主要步驟:建構鏈條和自定義鏈條。

建構 LCEL 鏈條

要建構 LCEL 鏈條,您需要使用load_chain函式,它會初始化鏈條並新增必要的元件,例如語言模型、提示和工具。以下是一個簡單的範例:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 初始化語言模型
llm = OpenAI(temperature=0.9)

# 定義提示範本
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)

# 建構鏈條
chain = LLMChain(llm=llm, prompt=prompt)

在這個範例中,您需要建立一個自定義的鏈條範本,而不是使用預先定義的範本。

自定義 LCEL 鏈條

要自定義 LCEL 鏈條,您需要建立一個自定義的鏈條範本。以下是一個簡單的範例:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 初始化語言模型
llm = OpenAI(temperature=0.9)

# 定義提示範本
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)

# 建構鏈條
chain = LLMChain(llm=llm, prompt=prompt)

在這個範例中,您需要建立一個自定義的鏈條範本,並新增必要的元件,例如語言模型、提示和工具。

圖表翻譯:

以下是建構 LCEL 鏈條的流程圖:

這個流程圖顯示了建構 LCEL 鏈條的步驟,包括初始化語言模型、定義提示範本、建構鏈條和自定義鏈條。

自訂 LCEL 鏈

一旦你建構了 LCEL 鏈,下一步就是自訂它。LCEL 鏈的自訂化是其最大的優勢之一。你可以根據自己的具體需求,對鏈的每個方面進行自訂。讓我們探索幾種自訂 LCEL 鏈的方法:

新增自訂邏輯

你可以使用玄貓的工作流程,在 LCEL 鏈的步驟之間新增自訂邏輯。這允許你執行具體的資料轉換或應用商業規則。

整合外部服務

你可以使用工具與 API、資料函式庫或第三方函式庫進行互動。只需定義必要的引數和身份驗證細節,LangChain 就會處理剩餘的工作。

修改提示範本

LCEL 鏈允許你使用變數、條件邏輯甚至根據輸入資料生成動態提示,輕鬆定義和修改提示範本。

以下是自訂 LCEL 鏈的範例:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import load_chain
from langchain.tools import APITool

llm = OpenAI(temperature=0.9)

prompt = PromptTemplate(
    input_variables=["product"],
    template="為一家生產{product}的公司取一個好的名字是什麼?",
)

api_tool = APITool(api_url="https://example.com/api")
chain = load_chain("llm_chain", llm=llm, prompt=prompt, tools=[api_tool])

在這個範例中,我們透過玄貓的工作流程自訂 LCEL 鏈。我們定義了api_url引數以指定 API 端點,並在建構鏈時將工具包含在工具列表中。

執行 LCEL 鏈

一旦你建構和自訂了 LCEL 鏈,就該將其投入行動了。你可以使用各種執行模式來滿足不同的場景和最佳化效能。讓我們探索以下三種主要的執行模式:

串流執行

當處理大型資料集時,你可以在資料到達時即時處理它,而不是等待整個資料集被載入到記憶體中。你還可以處理實時資料流和分塊處理資料。 要啟用串流執行,你可以在呼叫鏈時使用streaming=True引數。以下是如何做到的:

chain.run({"product": "智慧手機"}, streaming=True)

非同步執行

有了非同步執行的幫助,你可以並發執行多個任務,充分利用系統的資源。這樣,你可以平行執行多個獨立任務。 要使用非同步執行,你可以利用玄貓提供的arun方法。以下是範例:

import asyncio

async def generate_names(product):
    return await chain.arun({"product": product})

內容解密:

在上述範例中,我們定義了一個非同步函式generate_names,它使用arun方法執行 LCEL 鏈。這允許我們並發執行多個任務,提高系統的效率。

圖表翻譯:

以下是 LCEL 鏈的 Plantuml 圖表:

在這個圖表中,我們展示了 LCEL 鏈的生命週期,從載入和自訂到執行和完成。

非同步批次執行與可觀察性

在處理多個輸入時,非同步批次執行是一種提升效能的有效方法。透過一次呼叫鏈的 apply 方法並傳遞輸入列表,開發者可以同時處理多個輸入。以下是示範批次執行的範例:

products = ["smartphone", "laptop", "smartwatch"]
product_names = chain.apply([{"product": product} for product in products])

可觀察性在 LCEL 鏈中的重要性

當構建和除錯 LCEL 鏈時,可觀察性是一個至關重要的方面。透過可觀察性功能,開發者可以深入瞭解鏈的內部運作,追蹤資料流,並找出潛在的瓶頸或問題。LCEL 鏈提供了內建的可觀察性功能,包括記錄和追蹤。

啟用可觀察性

要啟用可觀察性,可以在建構鏈時使用 verbose=True 引數。示例如下:

chain = load_chain("llm_chain", llm=llm, prompt=prompt, verbose=True)

或者,使用 RunnableSequence 時,可以設定全域除錯模式:

from langchain.globals import set_debug
set_debug(True)

啟用可觀察性後,開發者可以輕鬆地監控鏈的執行,並獲得有價值的見解以進行除錯和最佳化。

LCEL 鏈的型別

根據 LangChain 檔案,以下是不同型別的 LCEL 鏈的簡介:

| 鏈建構函式 | 使用情況 | |







  • |
















  • | | create_stuff_documents_chain | 當您想要將檔案列表格式化為提示並傳遞給 LLM 時使用此鏈。請確保… |

內容解密:

在上述程式碼中,chain.apply() 方法接受一個列表,其中每個元素都是包含單一產品名稱的字典。這些字典被用作輸入傳遞給鏈,從而實作批次執行。透過這種方式,可以高效地處理多個輸入,而不需要多次呼叫鏈。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title LangChain任務鏈結型別與應用實踐

package "非同步程式設計" {
    package "事件迴圈" {
        component [Event Loop] as loop
        component [Task 任務] as task
        component [Future 物件] as future
    }

    package "協程模式" {
        component [async/await] as async
        component [Generator] as gen
        component [Callback] as callback
    }

    package "並行處理" {
        component [asyncio] as asyncio
        component [aiohttp] as aiohttp
        component [ThreadPool] as thread
        component [ProcessPool] as process
    }
}

loop --> task : 排程執行
task --> future : 等待結果
async --> asyncio : 協程管理
asyncio --> aiohttp : HTTP 非同步
thread --> process : CPU 密集

note right of loop
  單執行緒併發
  非阻塞 I/O
  高效能處理
end note

@enduml

在這個流程圖中,首先建構輸入列表,其中包含了多個產品名稱。然後,呼叫鏈的 apply 方法並傳遞輸入列表。接下來,鏈會處理這個列表,並最終傳回結果。這個過程展示瞭如何使用批次執行來提高效能和效率。

玄貓風格技術文章結論:LangChain 任務鏈結的深度剖析

深入剖析 LangChain 任務鏈結的架構後,我們可以發現,從觸發點到末端點,每個元件都扮演著關鍵角色,共同構成了完整的工作流程。透過 LLM、提示和工具的協同運作,LangChain 能夠有效地處理複雜的 NLP 任務。多維比較分析顯示,LCEL 任務鏈結相較於傳統任務鏈結,具備更高的靈活性和可擴充套件性,更適合處理需要高度客製化的場景,例如整合外部 API 和資料函式庫,或是根據使用者資料動態生成個人化報告。然而,LCEL 的靈活性也意味著更高的學習曲線和複雜度。對於簡單、標準化的任務,傳統任務鏈結仍然是更為便捷的選擇。

技術限制深析指出,LCEL 任務鏈結的串流和非同步執行模式雖然提升了效率,但在處理極大型資料集或高併發請求時,仍可能面臨效能瓶頸。此外,提示工程的複雜度和 LLM 模型本身的限制,也可能影響任務鏈結的最終輸出品質。展望未來,隨著 LLM 技術的持續發展和 LangChain 生態的日益完善,我們預見 LCEL 任務鏈結將在更多領域得到應用,例如更複雜的自動化流程、更智慧的對話機器人和更精準的知識圖譜構建。同時,可觀察性工具的強化將有助於開發者更好地監控和最佳化任務鏈結的效能。玄貓認為,深入理解 LCEL 任務鏈結的優勢和限制,並結合實際應用場景選擇合適的執行模式和提示策略,才能最大程度地發揮 LangChain 的潛力。