【LLM實戰|langgraph】langgrpah基礎

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

langgraph 基礎

1. Chatbot實現

# !pip install langchain
# !pip install langgraph
from typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages# 定義 State
class State(TypedDict):# 狀態變量 messages 類型是 list,更新方式是 add_messages# add_messages 是內置的一個方法,將新的消息列表追加在原列表后面messages: Annotated[list, add_messages]# 創建 Graph
graph_builder = StateGraph(State)
from langchain.chat_models import init_chat_model
# llm = init_chat_model("gpt-4o", model_provider="openai")
llm = init_chat_model("deepseek-chat", model_provider="deepseek")# 定義一個執行節點
# 輸入是 State,輸出是系統回復
def chatbot(state: State):# 調用大模型,并返回消息(列表)# 返回值會觸發狀態更新 add_messagesreturn {"messages": [llm.invoke(state["messages"])]}graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)graph = graph_builder.compile()
Adding a node to a graph that has already been compiled. This will not be reflected in the compiled graph.---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)Cell In[9], line 127 def chatbot(state: State):8     # 調用大模型,并返回消息(列表)9     # 返回值會觸發狀態更新 add_messages10     return {"messages": [llm.invoke(state["messages"])]}
---> 12 graph_builder.add_node("chatbot", chatbot)13 graph_builder.add_edge(START, "chatbot")14 graph_builder.add_edge("chatbot", END)File c:\Users\13010\miniconda3\envs\py12\Lib\site-packages\langgraph\graph\state.py:456, in StateGraph.add_node(self, node, action, defer, metadata, input_schema, retry_policy, cache_policy, destinations, **kwargs)454     raise RuntimeError455 if node in self.nodes:
--> 456     raise ValueError(f"Node `{node}` already present.")457 if node == END or node == START:458     raise ValueError(f"Node `{node}` is reserved.")ValueError: Node `chatbot` already present.
from IPython.display import Image, display# 可視化展示這個工作流
try:display(Image(data=graph.get_graph().draw_mermaid_png()))
except Exception as e:print(e)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

from langchain.schema import AIMessage def stream_graph_updates(user_input: str):# 向 graph 傳入一條消息(觸發狀態更新 add_messages)for event in graph.stream({"messages": [{"role": "user", "content": user_input}]}):for value in event.values():if "messages" in value and isinstance(value["messages"][-1], AIMessage):print("Assistant:", value["messages"][-1].content)def run():# 執行這個工作流while True:user_input = input("User: ")if user_input.strip() == "":breakstream_graph_updates(user_input)
run()
Assistant: 你好!😊 很高興見到你~有什么我可以幫你的嗎?
Assistant: 我是DeepSeek Chat,由深度求索公司(DeepSeek)研發的智能AI助手!🤖? 我的使命是幫助你解答問題、提供信息、陪你聊天,甚至幫你處理各種文本和文件。無論是學習、工作,還是日常生活中的疑問,都可以來問我!😊  有什么我可以幫你的嗎?

2. RAG

# !pip install -U langchain-community pymupdf
# !pip install dashscope
# !pip install faiss-cpu
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import PyMuPDFLoader# 加載文檔
loader = PyMuPDFLoader("./data/deepseek-v3-1-4.pdf")
pages = loader.load_and_split()# 文檔切分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=512,chunk_overlap=200,length_function=len,add_start_index=True,
)texts = text_splitter.create_documents([page.page_content for page in pages[:2]]
)# 灌庫
embeddings = DashScopeEmbeddings(model="text-embedding-v1")
db = FAISS.from_documents(texts, embeddings)# 檢索 top-5 結果
retriever = db.as_retriever(search_kwargs={"k": 5})
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate# Prompt模板
template = """請根據對話歷史和下面提供的信息回答上面用戶提出的問題:
{query}
"""
prompt = ChatPromptTemplate.from_messages([HumanMessagePromptTemplate.from_template(template),]
)
def retrieval(state: State):user_query = ""if len(state["messages"]) >= 1:# 獲取最后一輪用戶輸入user_query = state["messages"][-1]else:return {"messages": []}# 檢索docs = retriever.invoke(str(user_query))# 填 prompt 模板messages = prompt.invoke("\n".join([doc.page_content for doc in docs])).messagesreturn {"messages": messages}
graph_builder = StateGraph(State)
graph_builder.add_node("retrieval", retrieval)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "retrieval")
graph_builder.add_edge("retrieval","chatbot")
graph_builder.add_edge("chatbot", END)graph = graph_builder.compile()
from IPython.display import Image, display# 可視化展示這個工作流
try:display(Image(data=graph.get_graph().draw_mermaid_png()))
except Exception as e:print(e)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

run()
Assistant: DeepSeek-V3 是一個大型混合專家模型(Mixture-of-Experts, MoE),總參數量為 **6710 億(671B)**,其中每個 token 激活的參數量為 **370 億(37B)**。

3. 加入分支:若找不到答案轉人工

from langchain.schema import HumanMessage
from typing import Literal
from langgraph.types import interrupt, Command# 校驗
def verify(state: State)-> Literal["chatbot","ask_human"]:message = HumanMessage("請根據對話歷史和上面提供的信息判斷,已知的信息是否能夠回答用戶的問題。直接輸出你的判斷'Y'或'N'")ret = llm.invoke(state["messages"]+[message])if 'Y' in ret.content:return "chatbot"else:return "ask_human"# 人工處理
def ask_human(state: State):user_query = state["messages"][-2].contenthuman_response = interrupt({"question": user_query})# Update the state with the human's input or route the graph based on the input.return {"messages": [AIMessage(human_response)]}
from langgraph.checkpoint.memory import MemorySaver# 用于持久化存儲 state (這里以內存模擬)
# 生產中可以使用 Redis 等高性能緩存中間件
memory = MemorySaver()graph_builder = StateGraph(State)graph_builder.add_node("retrieval", retrieval)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_node("ask_human", ask_human)graph_builder.add_edge(START, "retrieval")
graph_builder.add_conditional_edges("retrieval", verify)
graph_builder.add_edge("ask_human", END)
graph_builder.add_edge("chatbot", END)# 中途會被轉人工打斷,所以需要 checkpointer 存儲狀態
graph = graph_builder.compile(checkpointer=memory)
from langchain.schema import AIMessage # 當使用 checkpointer 時,需要配置讀取 state 的 thread_id
# 可以類比 OpenAI Assistants API 理解,或者想象 Redis 中的 key 
thread_config = {"configurable": {"thread_id": "my_thread_id"}}def stream_graph_updates(user_input: str):# 向 graph 傳入一條消息(觸發狀態更新 add_messages)for event in graph.stream({"messages": [{"role": "user", "content": user_input}]},thread_config):for value in event.values():if isinstance(value, tuple):return value[0].value["question"]elif "messages" in value and isinstance(value["messages"][-1], AIMessage):print("Assistant:", value["messages"][-1].content)return Nonereturn Nonedef resume_graph_updates(human_input: str):for event in graph.stream(Command(resume=human_input), thread_config, stream_mode="updates"):for value in event.values():if "messages" in value and isinstance(value["messages"][-1], AIMessage):print("Assistant:", value["messages"][-1].content)
def run():# 執行這個工作流while True:user_input = input("User: ")if user_input.strip() == "":breakquestion = stream_graph_updates(user_input)if question:human_answer = input("Ask Human: "+question+"\nHuman: ")resume_graph_updates(human_answer)
from IPython.display import Image, display# 可視化展示這個工作流
try:display(Image(data=graph.get_graph().draw_mermaid_png()))
except Exception as e:print(e)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

run()
Assistant: DeepSeek-V3 是一個大型混合專家模型(MoE),總參數量為 **6710億(671B)**,其中每個 token 激活的參數量為 **370億(37B)**。  (根據論文 arXiv:2412.19437v2 提供的信息,DeepSeek-V3 的架構明確標注為 671B 參數規模。)
Assistant: 090

LangGraph 還支持:

  • 工具調用
  • 并行處理
  • 狀態持久化
  • 對話歷史管理
  • 歷史動作回放(用于調試與測試)
  • 子圖管理
  • 多智能體協作

更多關于 LangGraph 的 HowTo,參考官方文檔:https://langchain-ai.github.io/langgraph/how-tos

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

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

相關文章

大疆無人機使用eport連接Jetson主板實現目標檢測

所需硬件設備如下: 實現原理: 視頻流獲取:從大疆無人機獲取實時視頻流。數據傳輸:將視頻流傳輸至 Jetson 平臺。目標檢測處理:在 Jetson 上運行目標檢測算法對傳入的視頻幀進行分析 EPort開發套件 大疆官網給出了…

Typora激活與使用

Typora下載 下載地址:Typora 官方中文站 Typora(1.9.5及其以前的版本) 工具:待補充 流程 1.解壓工具 2.將license-gen.exe、node_inject.exe兩個文件放于typora安裝目錄下 3.在typora安裝目錄下運行cmd(可以打開…

圖片拆分工具,自定義宮格切割

軟件介紹 今天推薦一款實用的圖像處理工具——lmage Splitter,支持圖像拆分與格式互轉功能,無廣告干擾,操作簡單流暢,滿足多樣化圖片編輯需求。 軟件優勢 該工具為綠色版設計,無需安裝即可直接運行,下載…

23種設計模式解析--創建型模式

創建型模式(造物主的智慧) 單例模式 模式定義 單例模式(Singleton)確保一個類僅有一個實例,并提供該實例的全局訪問點。核心思想是通過私有化構造函數和靜態成員實現受控的對象創建。核心實現要點 私有構造函數&#x…

全面解析軟件工程形式化說明技術

一、形式化說明技術概述:從模糊到精確的跨越 在軟件工程的發展歷程中,需求說明技術始終是確保軟件系統成功開發的關鍵環節。從早期依賴自然語言的非形式化描述,到如今基于數學和邏輯的形式化方法,這一領域經歷了從模糊到精確的深…

百度網盤自動啟動如何關閉,關閉智能看圖

#某度軟件引起的奔潰#在日常辦公中,有時候雙擊圖片,會自動打開了某度的網盤,很奇怪莫名其妙的為什么會關閉網盤后又自動打開了。如何發現是某度的牛虻軟件在搞鬼的?我右鍵圖片,選擇打開方式,發現有“智能看…

疏老師-python訓練營-Day40訓練和測試的規范寫法

浙大疏錦行 知識點回顧: 彩色和灰度圖片測試和訓練的規范寫法:封裝在函數中展平操作:除第一個維度batchsize外全部展平dropout操作:訓練階段隨機丟棄神經元,測試階段eval模式關閉dropout 作業:仔細學習下測…

【重磅發布】flutter_chen_keyboard -專注于鍵盤相關功能

flutter_chen_keyboard 一個功能強大且易于使用的 Flutter 鍵盤增強庫,專為提升移動應用的鍵盤交互體驗而設計。 📖 庫簡介 flutter_chen_keyboard 是一個專注于鍵盤相關功能的 Flutter 工具庫,旨在為開發者提供更流暢、更智能的鍵盤交互解決…

idea設置注釋--帶日期和作者和描述

最終效果 在File Header中添加如下內容: /*** author ${USER}* date ${DATE} ${TIME}* description ${DESCRIPTION}*/${USER}:IDEA 里設置的用戶名 ${DATE}:當前日期 ${TIME}:當前時間 可以加自定義變量,比如 ${DESCRI…

【Linux】Socket編程——UDP版

📝前言: 這篇文章我們來講講Linux——udpsocket 🎬個人簡介:努力學習ing 📋個人專欄:Linux 🎀CSDN主頁 愚潤求學 🌄其他專欄:C學習筆記,C語言入門基礎&#…

RabbitMQ面試精講 Day 14:Federation插件與數據同步

【RabbitMQ面試精講 Day 14】Federation插件與數據同步 開篇 歡迎來到"RabbitMQ面試精講"系列第14天,今天我們將深入探討RabbitMQ Federation插件與跨集群數據同步機制。在分布式系統架構中,如何實現消息隊列集群間的數據同步是確保業務連續…

AI編程工具 | Trae介紹

描述需求就可以自動創建可運行的完整項目了,確實很強! 終端中的報錯信息都可以快速作為上下文輸入,點擊確認就可以自動修改,賊好使! Trae 編程工具詳細介紹 一、產品簡介 Trae 是字節跳動于 2025 年 1 月 19 日推出的…

【第11話:感知算法基礎3】目標檢測:深度學習目標檢測模型介紹入門及常用模型詳解

深度學習目標檢測模型介紹入門及常用模型詳解 目標檢測是計算機視覺的核心任務,需同時完成目標定位(輸出邊界框坐標)和目標分類(識別類別)。深度學習通過端到端訓練顯著提升了檢測精度和效率,主要分為兩類架…

稿定科技:多云架構下的 AI 存儲挑戰與 JuiceFS 實踐

稿定科技(gaoding.com)是一家專注于為企業和個人提供視覺內容創新方案的科技公司,致力于打造全新的設計方式,幫助更多用戶輕松掌控設計,創造價值。 隨著 AI 技術的加速發展,數據存儲和管理成為支撐公司創新…

徘徊識別場景誤報率↓77%:陌訊動態時序建模方案實戰解析

原創聲明本文為原創技術解析,核心技術參數與架構設計參考自《陌訊技術白皮書》,轉載請注明來源。一、行業痛點:徘徊識別的現實困境在安防監控領域,徘徊行為識別是保障公共安全的關鍵技術(如商場防盜竊、園區防闖入等場…

C# 通過第三方庫INIFileParser管理INI配置文件

C# 通過第三方庫INIFileParser管理INI配置文件目錄前言一、添加動態庫二、添加接口類代碼總結前言 很多時候我們是直接調用系統的C庫中的GetPrivateProfileString和WritePrivateProfileString接口來實現管理INI文件的,這個接口最久可以追溯到上個世紀80年代&#x…

政府數字化大屏系統 - Flask實現方案

下面我將設計一個基于Flask的政府數字化大屏系統,包含數據可視化、實時監控和統計分析功能,全套代碼下載看底部。 設計思路 使用Flask作為后端框架提供數據接口 前端采用響應式設計,適配大屏展示 使用ECharts實現多種數據可視化 模擬實時…

2025年主流開源音視頻播放項目深度解析

音視頻技術作為多媒體領域的核心支撐,其開源生態在近年來呈現爆發式發展。從底層編解碼引擎到跨平臺播放器應用,開源項目已形成完整的技術棧,滿足從個人娛樂到企業級流媒體服務的全場景需求。本文將深入剖析2025年最具影響力的五大開源音視頻…

【C++詳解】AVL樹深度剖析與模擬實現(單旋、雙旋、平衡因?更新、平衡檢測)

文章目錄一、AVL樹的概念二、AVL樹的實現AVL樹的結構AVL樹的插?AVL樹插??個值的?概過程平衡因?更新更新原則更新停?條件插入結點及更新平衡因子的代碼實現旋轉旋轉的原則右單旋右單旋代碼實現左單旋左單旋代碼實現左右雙旋左右雙旋代碼實現右左雙旋代碼實現判斷旋轉中序遍…

C++ 中的 enable_shared_from_this 詳解

# C 中的 enable_shared_from_this 詳解enable_shared_from_this 是 C 標準庫中的一個模板類,用于解決在類的成員函數中需要獲取指向自身的 shared_ptr 的問題。## 基本概念當一個對象由 shared_ptr 管理時,如果你想在對象的成員函數中獲得一個指向自身的…