LangGraph + LLM + stream_mode

文章目錄

      • LLM 代碼
      • values
      • messages
      • updates
      • messages + updates
      • messages + updates 2


LLM 代碼

from dataclasses import dataclassfrom langchain.chat_models import init_chat_model
from langgraph.graph import StateGraph, STARTfrom langchain_openai import ChatOpenAI
# 初始化 llm 
model_name = 'glm-4-flash' 
base_url = 'https://open.bigmodel.cn/api/paas/v4'
api_key = '6eeeb21...bPJyrc8e'  llm = ChatOpenAI(openai_api_base=base_url,model = model_name,api_key = api_key,temperature=0.1, # streaming=True,  
)@dataclass
class MyState:topic: strjoke: str = ""def call_model(state: MyState):"""Call the LLM to generate a joke about a topic"""llm_response = llm.invoke( # (1)![{"role": "user", "content": f"給我講一個關于 {state.topic} 的笑話"}])return {"joke": llm_response.content}graph = (StateGraph(MyState).add_node(call_model).add_edge(START, "call_model").compile()
)message = {"topic": "冰淇淋"}

values


events = graph.stream(message,  stream_mode="values",
) 

-- event :  {'topic': '冰淇淋'}
-- event :  {'topic': '冰淇淋', 'joke': '有一天,冰淇淋去參加一個聚會,它走進房間后,看到大家都在聊天,于是它決定找個地方坐下。\n\n冰淇淋走到一個角落,看到一把椅子,它說:“嘿,椅子,我坐這里可以嗎?”\n\n椅子回答:“當然可以,不過你得小心,我可是‘冷板凳’。”\n\n冰淇淋一愣,然后笑著說:“哦,原來如此,那我就不客氣了,謝謝你的提醒!”'}

messages


for message_chunk, metadata in graph.stream( # (2)!{"topic": "ice cream"},stream_mode="messages", 
):print('\n')print('-- message_chunk : ', message_chunk) print('-- metadata : ', metadata) if message_chunk.content:print(message_chunk.content, end="|", flush=True)

-- metadata :  
{'langgraph_step': 1,'langgraph_node': 'call_model','langgraph_triggers': ('branch:to:call_model', ),'langgraph_path': ('__pregel_pull', 'call_model'),'langgraph_checkpoint_ns': 'call_model:ee4d452e-bd6a-6176-fb64-086b7793dd96','checkpoint_ns': 'call_model:ee4d452e-bd6a-6176-fb64-086b7793dd96','ls_provider': 'openai', 'ls_model_name': 'glm-4-flash','ls_model_type': 'chat','ls_temperature': 0.1
}    -- message_chunk :  content='為什么' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'為什么|-- message_chunk :  content='冰淇淋' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'冰淇淋|-- message_chunk :  content='總是' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'總是|-- message_chunk :  content='那么' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'那么|-- message_chunk :  content='開心' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'開心|-- message_chunk :  content='?\n\n因為它' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'?因為它|-- message_chunk :  content='總是' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'總是|-- message_chunk :  content='笑' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'|-- message_chunk :  content='得' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'|-- message_chunk :  content='“' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'|-- message_chunk :  content='冰' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'|-- message_chunk :  content='”' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'|-- message_chunk :  content='裂' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'|-- message_chunk :  content='!' additional_kwargs={} response_metadata={} id='run--a3723e25-7094-4fad-8339-fdd41da406e4'|-- message_chunk :  content='😄' additional_kwargs={} response_metadata={'finish_reason': 'stop', 'model_name': 'glm-4-flash'} id='run--a3723e25-7094-4fad-8339-fdd41da406e4' usage_metadata={'input_tokens': 13, 'output_tokens': 20, 'total_tokens': 33, 'input_token_details': {}, 'output_token_details': {}}😄|%                                   

updates

for chunk in graph.stream(message,stream_mode="updates"
):print(chunk)

{'call_model': {'joke': '有一天,冰淇淋去參加一個聚會,它走進房間后,看到大家都在聊天,于是它決定找個地方坐下。\n\n冰淇淋走到一個角落,看到一把椅子,它說:“嘿,椅子,我坐這里可以嗎?”\n\n椅子回答:“當然可以,不過你得小心,我可是個‘冷’椅子。”\n\n冰淇淋一愣,然后笑著說:“哦,原來您是個‘冷’椅子啊,那我可得小心別融化了。”\n\n大家聽了都笑了,椅子也跟著笑了起來,從此,冰淇淋和椅子成了好朋友,每次聚會都會帶來歡樂。'}
}

messages + updates

for chunk in graph.stream(message,stream_mode=["messages", "updates"],
):print('\n', chunk )   

('messages', (AIMessageChunk(content = '有一天', additional_kwargs = {}, response_metadata = {}, id = 'run--8ecc7304-693a-44f5-84ca-7164e02cb8ec'), {'langgraph_step': 1,'langgraph_node': 'call_model','langgraph_triggers': ('branch:to:call_model', ),'langgraph_path': ('__pregel_pull', 'call_model'),'langgraph_checkpoint_ns': 'call_model:9ea3643a-d6f7-88c5-c9ea-4e355adb32c9','checkpoint_ns': 'call_model:9ea3643a-d6f7-88c5-c9ea-4e355adb32c9','ls_provider': 'openai','ls_model_name': 'glm-4-flash','ls_model_type': 'chat','ls_temperature': 0.1 })
)('messages', (AIMessageChunk(content = ',', additional_kwargs = {}, response_metadata = {},  id = 'run--8ecc7304-693a-44f5-84ca-7164e02cb8ec'), { 'langgraph_step': 1,'langgraph_node': 'call_model','langgraph_triggers': ('branch:to:call_model', ),'langgraph_path': ('__pregel_pull', 'call_model'),'langgraph_checkpoint_ns': 'call_model:9ea3643a-d6f7-88c5-c9ea-4e355adb32c9','checkpoint_ns': 'call_model:9ea3643a-d6f7-88c5-c9ea-4e355adb32c9','ls_provider': 'openai','ls_model_name': 'glm-4-flash','ls_model_type': 'chat','ls_temperature': 0.1	})
)('messages', (AIMessageChunk(content = '冰淇淋', additional_kwargs = {}, response_metadata = {}, id = 'run--8ecc7304-693a-44f5-84ca-7164e02cb8ec'), {'langgraph_step': 1,'langgraph_node': 'call_model','langgraph_triggers ': ('branch: to: call_model ',), 'langgraph_path': ('__pregel_pull', 'call_model'),'langgraph_checkpoint_ns': 'call_model:9ea3643a-d6f7-88c5-c9ea-4e355adb32c9','checkpoint_ns': 'call_model:9ea3643a-d6f7-88c5-c9ea-4e355adb32c9','ls_provider': 'openai','ls_model_name': 'glm-4-flash','ls_model_type': 'chat','ls_temperature': 0.1}
))...('messages', (AIMessageChunk(content = '!”', additional_kwargs = {}, response_metadata = {}, id = 'run--4e59a246-6974-4416-a22b-64a0f11605e3'), {'langgraph_step': 1,'langgraph_node': 'call_model','langgraph_triggers': ('branch:to:call_model', ),'langgraph_path': ('__pregel_pull', 'call_model'),'langgraph_checkpoint_ns': 'call_model:d2654764-3e30-1059-8493-ec47cc229898','checkpoint_ns': 'call_model:d2654764-3e30-1059-8493-ec47cc229898','ls_provider': 'openai','ls_model_name': 'glm-4-flash','ls_model_type': 'chat','ls_temperature': 0.1
}))('messages', (AIMessageChunk(content = '', additional_kwargs = {}, response_metadata = {'finish_reason': 'stop','model_name': 'glm-4-flash'}, id = 'run--4e59a246-6974-4416-a22b-64a0f11605e3', usage_metadata = {'input_tokens': 14,'output_tokens': 130,'total_tokens': 144,'input_token_details': {},'output_token_details': {}}), {'langgraph_step': 1,'langgraph_node': 'call_model','langgraph_triggers': ('branch:to:call_model', ),'langgraph_path': ('__pregel_pull', 'call_model'),'langgraph_checkpoint_ns': 'call_model:d2654764-3e30-1059-8493-ec47cc229898','checkpoint_ns': 'call_model:d2654764-3e30-1059-8493-ec47cc229898','ls_provider': 'openai','ls_model_name': 'glm-4-flash','ls_model_type': 'chat','ls_temperature': 0.1
}))('updates', {'call_model': {'joke': '有一天,冰淇淋去參加一個聚會,它走進房間后,看到大家都在聊天,于是它決定找個地方坐下。它走到一個角落,看到一把椅子,就坐了下來。\n\n冰淇淋剛坐下,突然椅子開始顫動,然后椅子上的一個按鈕亮了起來。冰淇淋好奇地按了按鈕,結果椅子上突然冒出一句話:“你坐得有點重,小心我融化了!”\n\n大家聽了都哈哈大笑,冰淇淋也尷尬地笑了。這時,一個朋友走過來,拍了拍冰淇淋的肩膀說:“別擔心,我們這里都是‘融融’的氣氛,大家都很歡迎你!”'}
})

messages + updates 2

# updates 會打印出錯 
for msg_type, (message_chunk, metadata) in graph.stream(message,stream_mode=["messages", "updates"],
):print('\n-- msg_type : ', msg_type ) print('-- message_chunk : ', message_chunk) print('-- metadata : ', metadata) 

-- metadata 2:  
{'langgraph_step': 1,'langgraph_node': 'call_model','langgraph_triggers': ('branch:to:call_model', ),'langgraph_path': ('__pregel_pull', 'call_model'),'langgraph_checkpoint_ns': 'call_model:a3f28959-0172-a7a9-797f-3ada4609cdc1','checkpoint_ns': 'call_model:a3f28959-0172-a7a9-797f-3ada4609cdc1','ls_provider': 'openai','ls_model_name': 'glm-4-flash','ls_model_type': 'chat','ls_temperature': 0.1
}**************************-- msg_type :  messages
-- message_chunk :  content='有一天' additional_kwargs={} response_metadata={} id='run--d0984020-e413-44f0-bacb-ba4667ee10c3'-- msg_type :  messages
-- message_chunk :  content=',' additional_kwargs={} response_metadata={} id='run--d0984020-e413-44f0-bacb-ba4667ee10c3'-- msg_type :  messages
-- message_chunk :  content='冰淇淋' additional_kwargs={} response_metadata={} id='run--d0984020-e413-44f0-bacb-ba4667ee10c3'...-- msg_type :  messages
-- message_chunk :  content='了' additional_kwargs={} response_metadata={} id='run--d0984020-e413-44f0-bacb-ba4667ee10c3'-- msg_type :  messages
-- message_chunk :  content='!”' additional_kwargs={} response_metadata={} id='run--d0984020-e413-44f0-bacb-ba4667ee10c3'-- msg_type :  messages
-- message_chunk :  content='' additional_kwargs={} response_metadata={'finish_reason': 'stop', 'model_name': 'glm-4-flash'} id='run--d0984020-e413-44f0-bacb-ba4667ee10c3' usage_metadata={'input_tokens': 14, 'output_tokens': 144, 'total_tokens': 158, 'input_token_details': {}, 'output_token_details': {}}*****('updates', {'call_model': {'joke': '有一天,冰淇淋去參加一個聚會,它走進房間后,看到大家都在聊天,于是它決定找個地方坐下。它走到一個角落,看到一把椅子,就坐了下來。\n\n冰淇淋剛坐下,突然椅子開始顫動,然后椅子上的一個按鈕亮了起來。冰淇淋好奇地按了按鈕,結果椅子上突然冒出一句話:“你坐得有點重,小心我融化了!”\n\n大家聽了都哈哈大笑,冰淇淋也尷尬地笑了。這時,一個朋友走過來,拍了拍冰淇淋的肩膀說:“別擔心,我們這里都是‘融融’的氣氛,大家都很歡迎你!”'}
})

2025-05-27(二)

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

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

相關文章

Pydantic 學習與使用

Pydantic 學習與使用 在 Fastapi 的 Web 開發中的數據驗證通常都是在使用 Pydantic 來進行數據的校驗,本文將對 Pydantic 的使用方法做記錄與學習。 **簡介:**Pydantic 是一個在 Python 中用于數據驗證和解析的第三方庫,它現在是 Python 使…

批量文件重命名工具

分享一個自己使用 python 開發的小軟件,批量文件重命名工具,主要功能有批量中文轉拼音,簡繁體轉換,大小寫轉換,替換文件名,刪除指定字符,批量添加編號,添加前綴/后綴。同時還有文件時…

多語言視角下的 DOM 操作:從 JavaScript 到 Python、Java 與 C#

多語言視角下的 DOM 操作:從 JavaScript 到 Python、Java 與 C# 在 Web 開發中,文檔對象模型(DOM)是構建動態網頁的核心技術。它將 HTML/XML 文檔解析為樹形結構,允許開發者通過編程方式訪問和修改頁面內容、結構和樣…

【C/C++】紅黑樹學習筆記

文章目錄 紅黑樹1 基本概念1.1 定義1.2 基本特性推理1.3 對比1.4 延伸1.4.1 簡單判別是否是紅黑樹1.4.2 應用 2 插入2.1 插入結點默認紅色2.2 插入結點2.2.1 插入結點是根結點2.2.2 插入結點的叔叔是紅色2.2.3 插入結點的叔叔是黑色場景分析LL型RR型LR型RL型 3 構建4 示例代碼 …

網絡通信的基石:深入理解幀與報文

在這個萬物互聯的時代,我們每天都在享受著網絡帶來的便利——從早晨查看天氣預報,到工作中的視頻會議,再到晚上刷著短視頻放松。然而,在這些看似簡單的網絡交互背后,隱藏著精密而復雜的數據傳輸機制。今天,…

STM32 SPI通信(硬件)

一、SPI外設簡介 STM32內部集成了硬件SPI收發電路,可以由硬件自動執行時鐘生成、數據收發等功能,減輕CPU的負擔 可配置8位/16位數據幀、高位先行/低位先行 時鐘頻率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主機模型、主或從操作 可…

尚硅谷redis7-11-redis10大類型之總體概述

前提:我們說的數據類型一般是value的數據類型,key的類型都是字符串。 redis字符串【String】 string類型是二進制安全的,意思是redis的string可以包含任何數據,比如jpg圖片或者序列化的對象。 string類型是Redis最基本的數據類型,一個redis中字符串va…

【遞歸、搜索與回溯算法】專題一 遞歸

文章目錄 0.理解遞歸、搜索與回溯1.面試題 08.06.漢諾塔問題1.1 題目1.2 思路1.3 代碼 2. 合并兩個有序鏈表2.1 題目2.2 思路2.3 代碼 3.反轉鏈表3.1 題目3.2 思路3.3 代碼 4.兩兩交換鏈表中的節點4.1 題目4.2 思路4.3 代碼 5. Pow(x, n) - 快速冪5.1 題目5.2 思路5.3 代碼 0.理…

C#實現List導出CSV:深入解析完整方案

C#實現List導出CSV:深入解析完整方案 在數據交互場景中,CSV文件憑借其跨平臺兼容性和簡潔性,成為數據交換的重要載體。本文將基于C#反射機制實現的通用CSV導出方案,結合實際開發中的痛點,從基礎實現、深度優化到生產級…

字符串day7

344 反轉字符串 字符串理論上也是一個數組&#xff0c;因此只需要用雙指針即可 class Solution { public:void reverseString(vector<char>& s) {for(int i0,js.size()-1;i<j;i,j--){swap(s[i],s[j]);}} };541 反轉字符串 自己實現一個反轉從start到end的字符串…

Grafana XSSOpenRedirectSSRF漏洞復現(CVE-2025-4123)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前…

私服 nexus 之間遷移 npm 倉庫

本文介紹如何將一個 Nexus 特定倉庫中的 npm 包內容遷移到另一個 Nexus 特定倉庫。此過程適用于需要重構倉庫結構或合并倉庫的場景。 遷移腳本 以下是完整的遷移腳本&#xff0c;它會自動完成以下操作&#xff1a; 從源倉庫獲取所有 npm 包列表下載每個包的 .tgz 文件解壓并…

Django ToDoWeb 服務

我們的任務是使用 Django 創建一個簡單的 ToDo 應用程序,允許用戶添加、查看和刪除筆記。我們將通過設置 Django 項目、創建 Todo 模型、設計表單和視圖來處理用戶輸入以及創建模板來顯示任務來構建它。我們將逐步實現核心功能以有效地管理 todo 項。 Django ToDoWeb 服務 …

阿里云服務器遭遇DDoS攻擊?低成本第三方高防解決方案全解析

阿里云服務器因高性能和穩定性備受青睞&#xff0c;但其DDoS高防服務的價格常讓中小企業望而卻步。面對動輒每月數萬元的防護成本&#xff0c;許多用戶不禁疑問&#xff1a;能否通過第三方高防服務保護阿里云服務器&#xff1f;如何實現低成本高效防御&#xff1f; 本文將結合技…

2025山東CCPC補題

2025山東CCPC補題 目錄 2025山東CCPC補題K - UNO&#xff01; &#xff08;雙端隊列的簡單應用&#xff09;M - 第九屆河北省大學生程序設計競賽 &#xff08;二進制枚舉模擬&#xff09;J - Generate 01 String 感覺這場比賽的題目挺不錯的&#xff1b;沒有說那些為了算法而算…

體繪制學習

一、基本概念 體繪制是對一個三維物體數據進行采樣與擬合的過程。 在體繪制中用vtkVolume渲染數據 渲染數據類數據轉換類幾何渲染vtkActorvtkPolyDataMapper體渲染vtkVolumevtkVolumeRayCastMapper 體繪制常用算法如下。 光線投射法。 優點是可視化結果質量好。缺點是計算…

告別“盤絲洞”車間:4-20mA無線傳輸如何重構工廠神經網?

4-20ma無線傳輸是利用無線模塊將傳統的溫度、壓力、液位等4-20mA電流信號轉換為無線信號進行傳輸。這一技術突破了有線傳輸的限制&#xff0c;使得信號可以在更廣泛的范圍內進行靈活、快速的傳遞&#xff0c;無線傳輸距離可達到50KM。達泰4-20ma無線傳輸模塊在實現工業現場應用…

VB.NET與SQL連接問題解決方案

1.基本連接步驟 使用SqlConnection、SqlCommand和SqlDataReader進行基礎操作&#xff1a; vb.net Imports System.Data.SqlClient Public Sub ConnectToDatabase() Dim connectionString As String "ServermyServerAddress;DatabasemyDataBase;Integrated Security…

ElasticSearch--DSL查詢語句

ElasticSearch DSL查詢文檔 分類 查詢類型功能描述典型應用場景示例語法查詢所有匹配所有文檔&#xff0c;無過濾條件數據預覽/測試json { "query": { "match_all": {} } }全文檢索查詢對文本字段分詞后匹配&#xff0c;基于倒排索引搜索框模糊匹配、多字段…

DDR4讀寫壓力測試

1.1測試環境 1.1.1整體環境介紹 板卡&#xff1a; pcie-403板卡 主控芯片&#xff1a; Xilinx xcvu13p-fhgb2104-2 調試軟件&#xff1a; Vivado 2018.3 代碼環境&#xff1a; Vscode utf-8 測試工程&#xff1a; pcie403_user_top 1.1.2硬件介紹 UD PCIe-403…