AI 代理程式工作流程:關於使用 LangGraph 還是 LangChain 建立的完整指南

2024-10-26 |Sandi Besen

語言模型為使用者如何與人工智慧系統互動以及這些系統如何透過自然語言相互溝通提供了可能性。

當企業想要使用 Agentic AI 功能建立解決方案時,首要的技術問題之一通常是“我使用什麼工具?”對於那些渴望開始的人來說,這是第一個障礙。

在本文中,我們將探討建立代理人工智慧應用程式的兩個最受歡迎的框架—LangChain 和 LangGraph。 讀完本文後,您應該對關鍵構建塊、每個框架在處理其功能的核心部分方面有何不同有了透徹的了解,並能夠就哪種框架最適合您的問題形成有根據的觀點。

由於將生成式人工智慧廣泛納入解決方案的實踐相對較新,因此開源參與者正在積極競爭開發「最佳」代理框架和編排工具。這意味著,儘管每個玩家都帶來了獨特的方法,但他們幾乎不斷推出新功能。閱讀本文時請記住,今天正確的內容,明天可能就不再正確了!

註:我本來是想對 AutoGen、LangChain 和 LangGraph 進行比較。然而,AutoGen宣布推出 AutoGen 0.4,從基礎上徹底重新設計框架。 AutoGen 0.4 發佈時請留意另一篇文章!

LangChain和LangGraph的基礎元件

透過了解每個框架的不同基本元素,您將在下一節中更深入地了解它們如何處理某些核心功能的關鍵差異。以下的描述並不是每個框架的所有組件的詳盡列表,但可以作為理解其一般方法差異的堅實基礎。

LangChain

有兩種使用 LangChain 的方法:作為預先定義指令的順序鍊或使用 LangChain 代理程式。每種方法在處理工具和編排方面都有所不同。鏈遵循預先定義的線性工作流程,而代理人充當協調員,可以做出更動態(非線性)的決策。

  • Chains:一系列步驟,包括對 llm、代理、工具、外部資料來源、程式碼等的呼叫。鏈可以分支,這意味著單一鏈可以根據邏輯條件分成多個路徑。
  • 代理或語言模型:語言模型能夠以自然語言產生回應。但代理程式使用語言模型加上附加功能來推理、呼叫工具,並在出現任何故障時重複呼叫工具的過程。
  • 工具:基於程式碼的函數,可以在鏈中呼叫或由代理程式呼叫以與外部系統互動。
  • 提示:這可以包括指示模型如何完成任務以及可用工具的系統提示、從為模型提供更多上下文的外部資料來源注入的資訊以及模型要完成的使用者提示或任務。

LangGraph

LangGraph 從不同的角度處理人工智慧工作流程。就像名字所暗示的那樣,它像圖表一樣編排工作流程。由於它可以靈活地處理人工智慧代理、程式碼和其他工具之間的不同流程,因此它更適合線性鏈方法、分支鍊或簡單代理系統無法滿足用例需求的用例。與 LangChain 相比,LangGraph 旨在處理更複雜的條件邏輯和回饋循環。

  • 圖表:組織工作流程的靈活方式,可以包含對 llm、工具、外部資料來源、程式碼等的呼叫。 LangGraph 也支援循環圖;這意味著您可以建立循環和回饋機制,以便可以多次重新訪問節點。
  • 節點:表示工作流程中的步驟,例如 LLM 查詢、API 呼叫或工具執行。
  • 邊和條件邊:邊透過將一個節點的輸出連接為下一個節點的輸入來定義資訊流。條件邊定義滿足特定條件時從一個節點到另一個節點的資訊流。開發人員可以自訂這些條件。
  • 狀態:狀態是資訊流經圖表時應用程式的當前狀態。它是開發人員定義的可變 TypedDict 對象,其中包含圖形目前執行的所有相關資訊。當資訊流經圖表時,LangGraph 會自動處理每個節點的狀態更新。
  • 代理或語言模型:圖中的語言模型僅負責產生對輸入的文字回應。代理功能利用語言模型,但使圖能夠具有表示代理的不同元件(例如推理、工具選擇和工具執行)的多個節點。代理可以決定在圖中採用哪條路徑、更新圖的狀態以及執行更多任務,而不僅僅是生成文字。

每個框架處理核心功能的方式之間的差異

LangGraph 和 LangChain 在某些功能上有重疊,但它們從不同的角度解決問題。 LangChain 專注於透過使用鍊或不同的人工智慧代理模式的線性工作流程。而 LangGraph 則專注於創建更靈活、更精細、基於流程的工作流程,其中可以包括 AI 代理、工具呼叫、程式碼等。

一般來說,LangChain 比 LangGraph 需要更少的學習曲線。有更多的抽象和預定義的配置,使 LangChain 更容易實現簡單的用例。 LangGraph 允許對工作流程的設計進行更多自訂控制,這意味著它的抽象程度較低,開發人員需要了解更多資訊才能有效地使用該框架。

工具調用

LangChain

在 LangChain 中,可以透過兩種方式呼叫工具,具體取決於您是使用鏈來對一系列步驟進行排序,還是僅使用其代理功能而無需在鏈中明確定義。在鏈中,工具作為鏈中的預定義步驟包含在內 – 這意味著它們不一定由代理調用,因為已經預先確定它們將在鏈中被調用。但是,當您的代理未在鏈中定義時,代理可以自主決定調用什麼工具以及何時根據其專有的工具列表調用。

Chain的流程範例:

桑迪貝森攝
  1. 建立代表工具的函數並使其與鏈相容
  2. 將工具合併到鏈中
  3. 執行鏈

代理流程範例:

桑迪貝森攝
  1. 工具已定義
  2. 該工具已新增至代理程式中
  3. 代理接收查詢並決定是否以及何時使用搜尋工具。如果需要,代理可以多次使用該工具。

LangGraph

LangGraph中,工具通常表示為圖上的節點。如果圖表包含代理,那麼代理將根據其推理能力來決定要呼叫哪個工具。根據代理的工具決策,圖表導覽至「工具節點」以處理工具的執行。條件邏輯可以包含在從代理到工具節點的邊緣中,以新增確定工具是否被執行的附加邏輯。如果需要,這可以為開發人員提供另一層控制。如果圖中沒有代理,那麼就像在LanchChain的鏈中一樣,該工具可以基於條件邏輯包含在工作流程中。

具有代理的圖的流程範例:

Image by Sandi Besen
  1. 工具已定義
  2. 該工具已綁定到代理
  3. 代理決定是否需要某種工具,如果需要則使用哪種工具。
  4. LangGraph框架偵測到需要工具呼叫並導航到圖中的工具節點以執行工具呼叫。
  5. 捕獲工具輸出並將其添加到圖表的狀態中
  6. 代理程式會再次呼叫更新後的狀態,以決定下一步該做什麼

沒有代理人的圖的流程範例:

Image by Sandi Besen
  1. 工具已定義
  2. 該工具作為節點添加到圖表中
  3. 條件邊可用於決定何時使用某個工具節點並控製圖的流動
  4. 該工具可以配置為更新圖表的狀態

如果您想了解有關工具調用的更多信息,我的朋友Tula Masterman有一篇關於工具調用在生成 AI 中如何工作的精彩文章。

注意:LangChain 和 LangGraph 都不支援像 MSFT 的語意核心那樣開箱即用的語意函數。

對話歷史與記憶

LangChain

Langchain 提供了用於處理對話歷史和記憶體的內建抽象。您可以選擇傳遞給 llm 的粒度等級(以及令牌數量),其中包含完整的會話對話歷史記錄、摘要版本或自訂記憶體。開發人員還可以建立自訂長期記憶系統,將記憶儲存在外部資料庫中,以便在相關時檢索。

LangGraph

在 LangGraph 中,狀態透過追蹤每個時間點定義的變數來處理記憶體。狀態可以包括對話歷史記錄、規劃步驟、語言模型先前回應的輸出等。它可以從一個節點傳遞到下一個節點,以便每個節點都可以存取系統的當前狀態。然而,跨會話的長期持久記憶體不能作為該框架的直接功能。為了實現這一點,開發人員可以包括負責在外部資料庫中儲存記憶體和其他變數的節點,以便稍後檢索。

開箱即用的 RAG 功能:

LangChain

LangChain可以處理複雜的檢索和生成工作流程,並擁有一套更成熟的工具來幫助開發人員將RAG整合到他們的應用程式中。例如,LangChain 透過直接使用 langchain.document_loaders、langchain.embeddings 和 langchain.vectorstores 提供開箱即用的文件載入、文字解析、嵌入建立、向量儲存和檢索功能。

LangGraph

在LangGraph中,RAG需要從頭開始開發,作為圖結構的一部分。例如,可以有用於文件解析、嵌入和檢索的單獨節點,這些節點將透過正常或條件邊連接。每個節點的狀態將用於在 RAG 管道中的步驟之間傳遞訊息。

平行度:

LangChain

LangChain 提供了透過使用 RunnableParallel 類別並行運行多個鍊或代理的機會。對於更高階的平行處理和非同步工具調用,開發人員必須使用 ayncio 等 Python 函式庫自訂實作這些功能。

LangGraph

LangGraph 支援節點的平行執行,只要不存在任何依賴關係(例如語言模型響應的輸出作為下一個節點的輸入)。這意味著它可以支援多個代理在一個圖中同時運行,只要它們不是依賴節點。與 LangChain 一樣,LangGraph 可以使用 RunnableParallel 類別並行運行多個圖。 LangGraph 也支援使用 ayncio 等 python 函式庫進行平行工具呼叫。

重試邏輯和錯誤處理:

LangChain

在 LangChain 中,錯誤處理是由開發人員明確定義的,如果工具呼叫失敗,可以透過在鏈本身或代理中引入重試邏輯來完成。

LangGraph

在 LangGraph 中,您實際上可以透過將錯誤處理作為自己的節點來將錯誤處理嵌入到您的工作流程中。當某些任務失敗時,您可以指向另一個節點或讓相同節點重試。最好的部分是,僅重試失敗的特定節點,而不是整個工作流程。這意味著圖表可以從故障點恢復,而不必從頭開始。如果您的用例需要許多步驟和工具調用,這可能很重要。

總結

您可以在沒有 LangGraph 的情況下使用 LangChain,也可以在沒有 LangChain 的情況下使用 LangGraph,或同時使用兩者!透過讓 AutoGen Agent 在圖中成為自己的節點,也完全可以探索將 LangGraph 的基於圖形的編排與其他 Agentic AI 框架(如 MSFT 的 AutoGen)一起使用。可以肯定地說,有很多選擇——而且可能會讓人感到不知所措。

那麼,在完成所有這些研究之後,我應該什麼時候使用它們呢?雖然沒有硬性規定,但以下是我個人的選擇:

僅在以下情況下使用 LangChain:

您需要快速原型設計或開發涉及遵循預先定義線性模式的順序任務(例如文件檢索、文字產生或摘要)的 AI 工作流程。或者您希望利用可以動態做出決策的 AI 代理模式,但不需要對複雜的工作流程進行精細控制。

僅在以下情況使用 LangGraph:

您的用例需要非線性工作流程,其中多個元件動態交互,例如依賴條件、需要複雜分支邏輯、錯誤處理或平行性的工作流程。您願意為那些不像 LangChain 那樣為您抽象的元件建立自訂實作。

在以下情況同時使用 LangChain 和 LanGraph:

您喜歡 LangChain 預先建立的提取元件,例如開箱即用的 RAG 功能、記憶體功能等,但也希望使用 LangGraph 的非線性編排來管理複雜的任務流程。結合這兩個框架可以成為一個強大的工具,可以從每個框架中提取最佳功能。

最終,您選擇 LangChain、LangGraph 還是兩者的組合取決於您專案的特定需求。

資料來源: https://towardsdatascience.com/ai-agent-workflows-a-complete-guide-on-whether-to-build-with-langgraph-or-langchain-117025509fa0

Related posts