【智能體】從一個聊天工作流了解LangGraph

1. 前言

這篇文章將從如何搭建一個帶網絡搜索功能的聊天機器人工作流,帶你初步了解 LangGraph。

?2. 前提條件

  • 已搭建 Python 開發環境,使用 3.11 以上版本。

  • 已熟悉 Python 基礎語法。可參考:【LLM】Python 基礎語法_llm python入門-CSDN博客文章瀏覽閱讀1k次,點贊18次,收藏28次。Python 作為最佳的機器學習和深度學習語言,如果你想入門大模型(如 GPT、BERT 等)與自然語言處理(NLP),那么 Python 一定是最佳選擇,這篇文章將帶你入門Python語法。_llm python入門 https://blog.csdn.net/u013176571/article/details/144773581?spm=1001.2014.3001.5501

3. 什么是LangGraph

LangGraph 是由 LnagChain 創造者 LangChain Inc 開發的一款基于圖結構的開源框架,其專注于構建有狀態、多角色的應用程序,特別是與大型語言模型(LLMs)一起使用時,用于創建智能體和多智能體工作流。

3.1 為什么選擇LangGraph

LangGraph 作為底層基礎設施,支持 LLM 應用中的工作流(Workflow)和智能代理(Agentic System),提供持久化、流式處理和調試部署能力,助力構建更強大、更可控的 LLM 應用。其有以下三大核心優勢:

1. 持久化(Persistence)??

  • 記憶能力(Memory):支持存儲應用狀態,實現對話記憶和跨用戶交互的狀態管理。

  • 人機協作(Human-in-the-loop):狀態檢查點化,支持執行中斷與恢復,便于人工決策、驗證和修正。 ?

2. 流式處理(Streaming)??

  • 支持工作流/代理狀態的流式傳輸,使用戶或開發者能在執行過程中獲取實時反饋。 ?

  • 允許流式傳輸事件(如工具調用反饋)和 LLM 生成的 tokens,以提升交互體驗。 ?

3. 調試與部署(Debugging and Deployment)

  • 通過 LangGraph Platform 提供簡便的測試、調試和部署能力。 ?

  • 通過 LangGraph Studio 提供可視化工作流,支持交互式調試。

  • 提供多種部署選項,方便應用上線。 ?

3.2?和LangChain的關系

LangGraph 是 LangChain 生態中的一個子項目,專門用于構建圖(Graph)結構的 LLM 工作流。它可以被認為是 LangChain 的補充,用于管理復雜的流程控制。它可以獨立于LangChain使用。

3.3?LangGraph核心概念

LangGraph 框架中,會將智能體工作流(agent workflows)建模為圖(Graphs),構建和運行圖(Graphs)有三個核心概念:

1. State(狀態):

  • 通常為 TypedDict(字典)或 Pydantic BaseModel(對象), 用于存儲圖運行時的狀態信息。它在圖的執行過程中被傳遞給各個節點和條件函數,用于存儲和傳遞數據。你可以將 State 理解為各節點和條件函數間的上下文。

2. Nodes(節點):

  • 是一個 Python 函數,用來執行特定的操作或邏輯(比如數據處理、調用外部服務等)。節點接收當前的 State 作為入參,在執行一系列業務邏輯后,并返回更新后的 State。

3. Edges(邊):

  • 也是一個 Python 函數,用于定義節點之間的連接關系,控制圖的執行流程。邊可以是無條件的,也可以是條件的。

簡而言之,節點用于執行工作,邊指示下一步做什么。

4. 聊天機器人實現

4.1 安裝LangGraph

這個例子中需要使用 LangChain 構建與大模型對話的 ChatModel,所以我們需要安裝 LangChain 相關包。我使用的是 0.3.0 版本。

# 安裝 LangChain 和 LangChain OpenAI
pip install langchain==0.3.0?
pip install -U langchain-openai# 安裝最新版 LangGraph
pip install -U langgraph# 安裝tavily,tavily是一個網絡檢索工具?
pip install -U tavily-python

4.2 準備工作

4.2.1 選擇模型

選擇一個支持函數調(Function Calling)用的模型,并創建一個 ChatModel,我使用的是月之暗面的 moonshot-v1-8k 模型。

from langchain_openai import ChatOpenAI# 構建一個chatModel
llm = ChatOpenAI(model="moonshot-v1-8k",openai_api_base="https://api.moonshot.cn/v1",openai_api_key="your_api_key",temperature=0.7,streaming=True,
)

4.2.2 申請tavily秘鑰

tavily 是一個網絡檢索工具,我們需要在tavily官網申請一個秘鑰來使用它(tavily 每月免費提供1000條搜索返回)。地址:Tavily AI。

定義 Tavily Search 工具

tavily_tool = TavilySearchResults(# 返回的最大搜索條數max_results=2,tavily_api_key="your_tavily_api_key",
)

4.3 代碼實現

4.3.1 流程圖

工作流主要包含兩個節點和兩個條件邊:

  • chatbot:聊天節點,負責與 LLM 交互。

  • tools:工具節點,負責調用 Tavily 搜索工具。

  • edge1:條件邊(使用虛線表示),LLM會根據用戶輸入的內容自動判斷是否調用tools節點,如果不需要調用會直接返回。

  • edge2:普通邊,tools節點完成搜索任務后,返回chatbot節點繼續對話。

4.3.2?完整代碼

以下是整個帶網絡搜索功能的聊天機器人的完整代碼

from typing import Annotatedfrom langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
from typing_extensions import TypedDict# 定義一個狀態類型,用于保存工作流中的上下文信息,為 TypedDict 類型
class State(TypedDict):# messages 用于記錄與AI對話的記錄,為 list 類型# add_messages 用于定義這個值的更新方式,即 將對話消息追加到列表中,而不是覆蓋messages: Annotated[list, add_messages]# 定義一個工作流,使用 State 類型作為輸入和輸出
working_flow = StateGraph(State)# 定義 TavilySearchResults 工具
tavily_tool = TavilySearchResults(max_results=2,tavily_api_key="",
)
# 定義 ChatOpenAI 模型,并綁定工具
llm = ChatOpenAI(model="moonshot-v1-8k",openai_api_base="https://api.moonshot.cn/v1",openai_api_key="",temperature=0.7,streaming=True,
)
# 綁定工具
tools = [tavily_tool]
llm_with_tools = llm.bind_tools(tools)# 聊天節點邏輯
def chatbot(state: State):# 調用大模型,LLM 會自動決定是否調用Tavily工具# 返回值是更新后的聊天記錄return {"messages": [llm_with_tools.invoke(state["messages"])]}# 添加節點
working_flow.add_node("chatbot", chatbot)
tool_node = ToolNode(tools=tools)
working_flow.add_node("tools", tool_node)# 添加條件邊和普通邊
working_flow.add_conditional_edges("chatbot", tools_condition, )
working_flow.add_edge("tools", "chatbot")# 設置起點
working_flow.set_entry_point("chatbot")# 創建MemorySaver,用于存儲工作流的對話歷史
memory = MemorySaver()
# 編譯工作流
graph = working_flow.compile(checkpointer=memory)

4.3.3 運行測試

以下代碼用于使用工作流并進行問答:

# 配置參數,包括唯一的線程ID,用于記錄對話歷史
config = {"configurable": {"thread_id": "1"}}
def stream_graph_updates(user_input: str):# 流式處理圖的事件for event in graph.stream({"messages": [{"role": "user", "content": user_input}]},config,):for value in event.values():# 打印助手的回復print("Assistant:", value["messages"][-1].content)while True:try:# 獲取用戶輸入user_input = input("User: ")# 檢查退出條件if user_input.lower() in ["quit", "exit", "q"]:print("再見!")break# 調用函數處理用戶輸入stream_graph_updates(user_input)except KeyboardInterrupt:# 處理用戶中斷輸入的情況print("\n輸入被中斷,再見!")breakexcept Exception as e:# 捕獲其他異常并打印錯誤信息print(f"發生錯誤: {e}")break

首先我們先問幾個簡單的問題,比如“你好”、“你是誰”,這些問題不足以讓大模型調用Tavily工具。

然后我們嘗試問大模型依據自身無法回答的問題,比如:”南京今天天氣如何?“,我們發現大模型自動調用了Tavily工具,接著我們繼續問“明天呢”,看看工作流是否具備聊天記憶。

到此為止,一個簡單的聊天機器人就完成了。當然 LangGraph 還有很多高級功能,比如人機交互(Humman-in-the-loop)、時間旅行(Time-travel)等,我在之后的文章中會介紹。

5. 參考文檔

  • LangGraph Home

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73518.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA開發:實例成員與靜態成員

判斷Java中的實例成員與靜態成員 在Java中,可以通過以下幾種方式判斷一個成員是實例成員還是靜態成員: 1. 通過聲明方式判斷 靜態成員使用static關鍵字修飾,實例成員不使用: public class MyClass {// 實例成員int instanceVa…

Softmax 回歸 + 損失函數 + 圖片分類數據集

Softmax 回歸 softmax 回歸是機器學習另外一個非常經典且重要的模型,是一個分類問題。 下面先解釋一下分類和回歸的區別: 簡單來說,分類問題從回歸的單輸出變成了多輸出,輸出的個數等于類別的個數。 實際上,對于分…

MySQL-存儲過程

介紹 基本語法 創建 調用 查看 刪除 變量 系統變量 查看 設置 用戶定義變量 賦值 使用 局部變量 聲明 賦值 流程控制 參數 條件結構 IF case 循環結構 while repeat loop 游標 條件處理程序 介紹 舉個簡單的例子,我們先select某數據&…

使用 Go 和 Gin 實現高可用負載均衡代理服務器

前言 在現代分布式系統中,負載均衡是保障服務高可用性和性能的核心技術。本文將基于 Go 語言和 Gin 框架實現一個支持動態路由、健康檢查、會話保持等特性的企業級負載均衡代理服務器,并提供完整的壓力測試方案和優化建議。 通過本方案實現的負載均衡代理具備以下優勢: 單…

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服務器,并實現遠程聯機,詳細教程

Linux 部署 MineCraft 服務器 詳細教程(丐版,無需云服務器) 一、虛擬機 Ubuntu 部署二、下載 Minecraft 服務端三、安裝 JRE 21四、安裝 MCS manager 面板五、搭建服務器六、本地測試連接七、下載櫻花,實現內網穿透,邀…

批量取消 PDF 文檔中的所有超鏈接

在 PDF 文檔中我們可以插入各種各樣的文本也可以給文本設置字體,顏色等多種樣式,同時還可以給文字或者圖片添加上超鏈接,當我們點擊超鏈接之后,就會跳轉到對應的網頁。有時候這會對我們的閱讀或者使用形成一定的干擾,今…

Ubuntu xinference部署本地模型bge-large-zh-v1.5、bge-reranker-v2-m3

bge-large-zh-v1.5 下載模型到指定路徑: modelscope download --model BAAI/bge-large-zh-v1.5 --local_dir ./bge-large-zh-v1.5自定義 embedding 模型,custom-bge-large-zh-v1.5.json: {"model_name": "custom-bge-large…

Vue的實例

Every Vue application starts with a single Vue component instance as the application root. Any other Vue component created in the same application needs to be nested inside this root component. 每個 Vue 應用都以一個 Vue 組件實例作為應用的根開始。在同一個應…

Linux學習筆記(應用篇三)

基于I.MX6ULL-MINI開發板 LED學習GPIO應用編程輸入設備 開發板中所有的設備(對象)都會在/sys/devices 體現出來,是 sysfs 文件系統中最重要的目錄結構 /sys下的子目錄說明/sys/devices這是系統中所有設備存放的目錄,也就是系統中…

【圖論】網絡流算法入門

(決定狠狠加訓圖論了,從一直想學但沒啟動的網絡流算法開始。) 網絡流問題 ? 問題定義:在帶權有向圖 G ( V , E ) G(V, E) G(V,E) 中,每條邊 e ( u , v ) e(u, v) e(u,v) 有容量 c ( u , v ) c(u, v) c(u,v)&am…

遞歸、搜索與回溯第四講:floodfill算法

遞歸、搜索與回溯第四講:floodfill算法 1.Floodfill算法介紹2.圖像渲染3.島嶼數量4.島嶼的最大面積5.被圍繞的區域6.太平洋大西洋水流問題7.掃雷游戲8.衣櫥整理 1.Floodfill算法介紹 2.圖像渲染 3.島嶼數量 4.島嶼的最大面積 5.被圍繞的區域 6.太平洋大西洋水流問題…

【深度學習與實戰】2.3、線性回歸模型與梯度下降法先導案例--最小二乘法(向量形式求解)

為了求解損失函數 對 的導數,并利用最小二乘法向量形式求解 的值? 這是?線性回歸?的平方誤差損失函數,目標是最小化預測值 與真實值 之間的差距。 ?損失函數?: 考慮多個樣本的情況,損失函數為所有樣本的平方誤差之和&a…

氣象可視化衛星云圖的方式:方法與架構詳解

氣象衛星云圖是氣象預報和氣候研究的重要數據來源。通過可視化技術,我們可以將衛星云圖數據轉化為直觀的圖像或動畫,幫助用戶更好地理解氣象變化。本文將詳細介紹衛星云圖可視化的方法、架構和代碼實現。 一、衛星云圖可視化方法 1. 數據獲取與預處理 衛星云圖數據通常來源…

瀏覽器渲染原理與優化詳解

一、瀏覽器渲染基礎原理 瀏覽器渲染流程主要包括以下步驟(也稱為"關鍵渲染路徑"): 構建DOM樹:將HTML解析為DOM(文檔對象模型)樹構建CSSOM樹:將CSS解析為CSSOM(CSS對象模…

基于Spring Boot的成績管理系統后臺實現

下面是一個完整的成績管理系統后臺實現,使用Spring Boot框架,包含學生管理、課程管理和成績管理功能。 1. 項目結構 src/main/java/com/example/grademanagement/ ├── config/ # 配置類 ├── controller/ # 控制器 ├── dto/ …

實現極限網關(INFINI Gateway)配置動態加載

還在停機更新 Gateway 配置,OUT 了。 今天和大家分享一個 Gateway 的功能:動態加載配置(也稱熱更新或熱加載)。 這個功能可以在 Gateway 不停機的情況下更新配置并使之生效。 配置樣例如下: path.data: data path.…

Mean Shift 圖像分割與 Canny 邊緣檢測教程

1. Mean Shift 簡介 Mean Shift 是一種聚類算法,通過尋找圖像中顏色相似的區域來實現分割。它非常適合用于場景分割或物體檢測等任務。本教程將它與 Canny 邊緣檢測結合,突出分割區域的邊界。 2. 圖像分割流程 我們將按照以下步驟完成圖像分割和邊緣檢…

Day15 -實例 端口掃描工具 WAF識別工具的使用

一、端口掃描工具 1、zenmap 我這里user是漢字名,沒有解析成功。等后續換一個英文賬戶試一試。 魔改kali的nmap nmap -p8000-9000 8.140.159.19 2、masscan cmd啟動,拖入exe文件。然后先寫ip,會報錯給提示 尋路犬系統 我們去找一下他的…

如何解決高并發場景下的性能瓶頸?實踐分享

解決高并發性能瓶頸的核心方法包括優化系統架構、合理使用緩存技術、數據庫優化及擴展策略、負載均衡設計。 其中,優化系統架構是根本解決性能問題的關鍵所在。良好的系統架構能夠有效支撐業務高效穩定運行,避免性能瓶頸帶來的損失。企業可通過微服務架構…

自動駕駛背后的數學:ReLU,Sigmoid, Leaky ReLU, PReLU,Swish等激活函數解析

隨著自動駕駛技術的飛速發展,深度學習在其中扮演著至關重要的角色。而激活函數作為神經網絡中的關鍵組件,直接影響著模型的性能和效果。前面幾篇博客 自動駕駛背后的數學:特征提取中的線性變換與非線性激活 , 「自動駕駛背后的數學&#xff1…