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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…