当前位置: 首页 > ds >正文

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.xdnf.cn/news/9385.html

相关文章:

  • WPF命令与MVVM模式:打造优雅的应用程序架构
  • 【AI News | 20250527】每日AI进展
  • springboot--实战--大事件--用户接口开发
  • 【机器学习基础】机器学习入门核心算法:支持向量机(SVM)
  • MySQL-查询测试
  • cf1703F
  • leetcode hot100刷题日记——18.搜索插入位置
  • Redis学习打卡-Day8-Redis实践
  • docker环境搭建与常用指令
  • 聊一聊 .NET Dump 中的 Linux信号机制
  • 什么是大端序,什么是小端序,如何记忆它们!!!
  • 2025最新Gemini 2.5 Pro API限制全面解析:最完整的使用指南与优化方案
  • 2025年 RPM软件包常用安装指南
  • mcc Mnc gid1 gid2
  • Dalvik虚拟机、ART虚拟机与JVM的核心区别
  • 爱德华iH80iH160iH600iH1800HTXNRV真空泵系统手侧
  • Solana账户创建与Rust实践全攻略
  • C++类继承详解:权限控制与继承方式解析
  • Linux下目录遍历的实现
  • 各个链接集合
  • 在h5端实现录音发送功能(兼容内嵌微信小程序) recorder-core
  • java-jdk8新特性Stream流
  • 交叉编译工具链冲突
  • nRF Connect SDK开发之(2)编译一个例程
  • 分布式系统
  • ORB-SLAM2学习笔记:ORBextractor的构造函数详解
  • HOW - 从0到1搭建自己的博客站点(四)
  • 10.2sql
  • python-正则表达式
  • 与 PyCharm 官方沟通解决开发环境问题记录(进展:官方已推出2个新的修复版本)