用 LangChain 還是 LangGraph?官方終於站出來表態了
無論是個人還是企業,當我們想要使用 LLM(大模型)的功能開發出有趣或者有價值的應用時,第一個技術問題通常是 “使用什麼工具?”
在本文中,我們將深入探討用於構建 LLM 應用程序的兩個最流行的框架:LangChain 和 LangGraph。
現在生成式 AI 的開發正處於井噴時期,幾乎每天都會出現各種新框架和新技術,所以各位在閱讀本文時請記住,今天是正確的,明天可能就不正確了!
**LangChain 和 LangGraph 的基礎組件 **
通過理解每個框架的不同基礎元素,你將更深入地理解它們在處理某些核心功能方面的關鍵區別。本節的描述並未窮盡列出每個框架的所有組件,而是爲理解它們的整體方法差異提供了一個堅實的基礎。
LangChain
使用 LangChain 主要有兩種方式:**預定義命令的順序鏈(Chain)**和 LangChain Agent。這兩種方式在工具和編排方式上有所不同。鏈採用預定義的線性工作流,而 Agent 則充當一個協調者,可以進行更具動態性(非線性)的決策。
-
Chain(鏈):一系列步驟的組合,這些步驟可以包括調用 LLM、Agent、工具、外部數據源、過程式代碼等。鏈可以分支,即根據邏輯條件將單一流程拆分爲多個路徑。
-
Agent 或 LLM:LLM 本身能夠生成自然語言響應,而 Agent 則結合了 LLM 與額外能力,使其能夠進行推理、調用工具,並在調用工具失敗時重複嘗試。
-
Tool(工具):是可以在鏈中被調用的代碼函數,或由 Agent 觸發,以與外部系統交互。
-
Prompt(提示詞)包括系統提示詞(用於指示模型如何完成任務以及可用工具)、來自外部數據源的注入信息(爲模型提供更多上下文)、以及用戶的輸入任務。
LangGraph
LangGraph 採用了一種不同的方法來構建 AI 工作流。正如其名稱所示,它以圖(Graph)的方式編排工作流。由於其在 AI Agent、過程式代碼和其他工具之間的靈活處理能力,它更適用於線性鏈、分支鏈或簡單 Agent 系統難以滿足需求的複雜應用場景。LangGraph 設計用於處理更復雜的條件邏輯和反饋循環,比 LangChain 更加強大。
-
Graph(圖)是一種靈活的工作流組織方式,支持調用 LLM、工具、外部數據源、過程式代碼等。LangGraph 還支持循環圖(Cyclical Graph),即可以創建循環和反饋機制,使得某些節點能夠被多次訪問。
-
Node(節點)表示工作流中的步驟,例如 LLM 查詢、API 調用或工具執行。
-
Edge(邊)和 Conditional Edge(條件邊):邊用於連接節點,定義信息流向,使一個節點的輸出作爲下一個節點的輸入。條件邊允許在滿足特定條件時,將信息從一個節點流向另一個節點。開發者可以自定義這些條件。
-
State(狀態)表示應用程序的當前狀態,隨着信息在圖中流動而更新。狀態是一個****開發者定義的可變 TypedDict 對象,包含當前執行圖所需的所有相關信息。LangGraph 會在每個節點自動更新狀態。
-
Agent 或 LLM:圖中的 LLM 僅負責對輸入生成文本響應。而 Agent 能力則允許圖中包含多個節點,分別代表 Agent 的不同組件(如推理、工具選擇和工具執行)。Agent 可以決定在圖中採取哪條路徑、更新圖的狀態,並執行比單純文本生成更多的任務。
相比之下,LangChain 更適合線性和基於工具的調用,而 LangGraph 更適合複雜的、多路徑和具有反饋機制的 AI 工作流。
**各框架在覈心功能處理方式上的區別 **
LangGraph 和 LangChain 在某些能力上有所重疊,但它們處理問題的方式有所不同。LangChain 主要關注線性工作流(通過鏈)或不同的 AI Agent 模式,而 LangGraph 則專注於創建更靈活、細粒度的、基於流程的工作流,其中可以包含 AI Agent、工具調用、過程式代碼等。
總體而言,LangChain 的學習曲線相對較低,因爲它提供了更多的抽象封裝和預定義配置,這使得 LangChain 更容易應用於簡單的使用場景。而 LangGraph 則允許對工作流設計進行更細粒度的定製,這意味着它的抽象程度較低,開發者需要學習更多內容纔能有效使用。
工具調用(Tool Calling)
LangChain
在 LangChain 中,工具的調用方式取決於是在鏈中按順序執行一系列步驟,還是僅使用 Agent 能力(不在鏈中明確定義)。
-
在鏈中,工具是作爲預定義步驟包含的,這意味着它們並不一定是由 Agent 動態調用的,而是在鏈設計時就已決定了調用哪些工具。
-
當 Agent 不在鏈中定義時,Agent 具有更大的自主性,它可以根據自己可訪問的工具列表,決定調用哪個工具以及何時調用。
鏈方式的流程示例:
Agent 方式的流程示例:
LangGraph
在 LangGraph 中,工具通常被表示爲圖上的一個節點****。如果圖中包含一個 **Agent**,那麼 **Agent 負責決定調用哪個工具**,這一決策基於其推理能力。當 Agent 選擇了某個工具後,工作流會跳轉到對應的 “工具節點”(Tool Node),以執行該工具的操作。在 Agent 和工具節點之間的邊可以包含條件邏輯(Conditional Logic),從而**增加額外的判斷邏輯,以決定是否執行某個工具**。這樣,開發者可以擁有更精細的控制能力。如果圖中沒有 Agent,那麼工具的調用方式類似於 LangChain 的鏈,即**根據預定義的條件邏輯在工作流中執行工具**。
包含 Agent 的圖流程示例:
沒有 Agent 的圖的流程示例:
**對話歷史和記憶 **
LangChain
LangChain 提供內置的抽象層來處理對話歷史和記憶。它支持不同粒度級別(granularity)的記憶管理,從而控制傳遞給 LLM 的 token 數量,主要包括以下幾種方式:
- 完整的會話歷史(Full session conversation history)
- 摘要版本的對話歷史(Summarized conversation history)
- 自定義定義的記憶(Custom defined memory)
此外,開發者還可以自定義長期記憶系統,將對話歷史存儲在外部數據庫中,並在需要時檢索相關記憶。
LangGraph
在 LangGraph 中,State(狀態)負責管理記憶,它通過記錄每個時刻定義的變量來跟蹤狀態信息。State 可以包括:
-
對話歷史
-
任務執行的各個步驟
-
語言模型上一次的輸出結果
-
其他重要信息
State 可以在節點之間傳遞,這樣每個節點都能獲取當前系統的狀態。然而,LangGraph 本身不提供跨會話的長期記憶功能,如果開發者需要持久化存儲記憶,可以引入特定的節點,用於將記憶和變量存入外部數據庫,以便後續檢索。
**開箱即用的 RAG 能力 **
LangChain
LangChain 原生支持複雜的 RAG 工作流,並提供了一套成熟的工具,方便開發者將 RAG 集成到應用程序中。例如,它提供了:
- 文檔加載(Document Loading)
- 文本解析(Text Parsing)
- Embedding 生成(Embedding Creation)
- 向量存儲(Vector Storage)
- 檢索能力(Retrieval Capabilities)
開發者可以直接使用 LangChain 提供的 API(如 langchain.document_loaders
、langchain.embeddings
和 langchain.vectorstores
)來實現 RAG 工作流。
LangGraph
在 LangGraph 中,RAG 需要開發者自行設計,並作爲圖結構的一部分實現。例如,開發者可以創建單獨的節點,分別用於:
-
文檔解析(Document Parsing)
-
Embedding 計算(Embedding Computation)
-
語義檢索(Retrieval)
這些節點之間可以通過普通邊(Normal Edges)或條件邊(Conditional Edges)進行連接,而各個節點的狀態可以用於****傳遞信息,以便在 RAG 流水線的不同步驟之間共享數據。
**並行處理(Parallelism) **
LangChain
LangChain 允許並行執行多個鏈或 Agent,可以使用 RunnableParallel
類來實現基本的並行處理。
但如果需要更高級的並行計算或異步工具調用,開發者需要**使用 Python 庫(**如 asyncio
)自行實現。
LangGraph
LangGraph 天然支持並行執行節點,只要這些節點之間沒有依賴關係(例如,一個 LLM 的輸出不能作爲下一個節點的輸入)。這意味着多個 Agent 可以同時運行,前提是它們不是相互依賴的節點。
此外,LangGraph 也支持:
- 使用
RunnableParallel
運行多個 Graph - 通過 Python 的
asyncio
庫並行調用工具
**重試邏輯和錯誤處理 **
LangChain
LangChain 的錯誤處理需要由開發者顯式定義,可以通過:
-
在鏈中引入重試邏輯(Retry Logic)
-
在 Agent 中處理工具調用失敗的情況
LangGraph
LangGraph 可以直接在工作流中嵌入錯誤處理邏輯,方法是將錯誤處理作爲一個獨立的節點。
-
當某個任務失敗時,可以跳轉到另一個錯誤處理節點,或者在當前節點進行重試。
-
失敗的節點會被單獨重試,而不是整個工作流重新執行。
-
這樣,圖可以從失敗的地方繼續執行,而不需要從頭開始。
如果你的任務涉及多個步驟和工具調用,這種錯誤處理機制可能會非常重要。
**總之 **
你可以:
✅ 僅使用 LangChain
✅ 僅使用 LangGraph
✅ 同時使用 LangChain 和 LangGraph
此外,你也可以將 LangGraph 的圖結構編排能力與其他 Agent 框架(如微軟的 AutoGen)結合,例如:將 AutoGen 的 Agent 作爲 LangGraph 的節點
LangChain 和 LangGraph 各有優勢,選擇合適的工具可能會讓人感到困惑。
那麼,應該在什麼情況下使用?
僅使用 LangChain:
✅ 你需要快速構建 AI 工作流,例如:
-
線性任務(Linear Tasks):文檔檢索、文本生成、摘要等預定義的工作流
-
AI Agent 需要動態決策,但你不需要對複雜流程進行精細控制
僅使用 LangGraph:
✅ 你的應用場景需要非線性(Non-linear)工作流,例如:
-
任務涉及多個組件的動態交互
-
需要條件判斷、複雜的分支邏輯、錯誤處理或並行執行
-
你願意自行實現 LangChain 未提供的部分功能
同時使用 LangChain 和 LangGraph:
✅ 你希望:
-
利用 LangChain 現成的抽象能力(如 RAG 組件、對話記憶等)
-
同時使用 LangGraph 的非線性編排能力
兩者結合,可以充分發揮各自的優勢,打造更加靈活和強大的 AI 工作流。
https://towardsdatascience.com/ai-agent-workflows-a-complete-guide-on-whether-to-build-with-langgraph-or-langchain-117025509fa0/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/cB5LJitb1M5jmnDhcNmOQA