LLM 代码
from dataclasses import dataclass
from langchain.chat_models import init_chat_model
from langgraph.graph import StateGraph, START
from 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: str
joke: 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(二)