LangGraph 实现了一个流式传输系统,用于实时更新信息。对于基于大型语言模型(LLMs)构建的应用程序来说,流式传输对于增强其响应性至关重要。这是因为大型语言模型在处理复杂的自然语言任务时,可能会存在一定的延迟。而通过流式传输,可以在模型还在处理数据的过程中,就将部分结果逐步展示给用户,而不是让用户等待一个完整的响应,从而让用户能够更快地获得反馈,提高了应用程序的交互性。
官方文档:https://docs.langchain.com/oss/python/langgraph/streaming
- Stream graph state(流式传输图状态):可以通过“updates”和“values”模式获取状态更新/值。其中,“updates”模式会流式传输图在每一步之后的状态更新,如果在同一个步骤中进行了多次更新(例如,运行了多个节点),这些更新将分别流式传输;而“values”模式则会流式传输图在每一步之后的完整状态值。
- Stream subgraph outputs(流式传输子图输出):包括父图和任何嵌套子图的输出。通过在父图的.stream()方法中设置subgraphs=True,可以实现这一点。输出将以(namespace, data)元组的形式流式传输,其中namespace是一个包含调用子图的节点路径的元组,例如(“parent_node:
“, “child_node: “)。 - Stream LLM tokens(流式传输LLM令牌):可以从任何地方捕获令牌流,包括节点内部、子图内部或工具内部。这使得能够实时获取大型语言模型(LLM)的输出令牌,从而提升应用的响应性和用户体验。
- Stream custom data(流式传输自定义数据):可以直接从工具函数发送自定义更新或进度信号。这为开发者提供了更大的灵活性,可以根据需要自定义流式传输的数据内容,以满足特定的应用需求。
- Use multiple streaming modes(使用多种流式传输模式):可以选择以下多种流式传输模式:
- values(完整状态):流式传输每一步之后图的完整状态值。
- updates(状态增量):流式传输每一步之后图的状态更新。
- messages(LLM令牌+元数据):流式传输2元组(LLM令牌,元数据),这些元数据包含有关图节点和LLM调用的详细信息。
- custom(任意用户数据):流式传输任意用户定义的数据。
- debug(详细跟踪):在图执行过程中尽可能多地流式传输信息,包括节点名称和完整状态等详细信息。
支持的流模式(stream_mode)
将以下一种或多种流模式作为列表传递给 stream() 或 astream() 方法:
| 模式 | 描述 |
|---|---|
values |
每个图步骤后流式传输完整状态值。 |
updates |
每个步骤后流式传输状态的增量更新。 |
custom |
从图中节点流式传输自定义数据。 |
messages |
从调用 LLM 的节点流式传输生成的 token 及元数据(元组)。 |
debug |
尽可能多地流式传输调试信息。 |
支持将多种模式作为列表同时传递,如:
1 | stream_mode=["updates", "messages", "custom"] |
定义一个常见的图
1 | from typing import TypedDict |
流式传输stream_mode=”values”
在图表的每个步骤之后传输状态的完整值
1 | for chunk in graph.stream( |
执行结果
1 | {'topic': '冰激凌'} |
说明:values 则输出完整状态值。
流式传输stream_mode=”updates”
将图表每一步之后的更新流式传输到状态
1 | for chunk in graph.stream( |
执行结果
1 | {'refine_topic': {'topic': '冰激凌和小狗'}} |
说明:updates 模式输出节点的状态更新
流式传输stream_mode=”debug”
在图表的整个执行过程中传输尽可能多的信息
1 | for chunk in graph.stream( |
执行结果
1 | {'step': 1, 'timestamp': '2025-09-18T08:51:31.478123+00:00', 'type': 'task', 'payload': {'id': '671c3949-69b8-8e90-b997-e76a1f711f5f', 'name': 'refine_topic', 'input': {'topic': '冰激凌'}, 'triggers': ('branch:to:refine_topic',)}} |
从以上结果来看,可以看打执行的详细信息,每一个步骤执行
LLM token 流式传输stream_mode=”messages”
为调用LLM的图形节点传输LLM令牌和元数据
需要接入大模型
1 | from langchain_deepseek import ChatDeepSeek |
执行结果(流式输出的)
1 | 小狗|走进|一家|冰|激|凌|店|,|店员|问|:“|想要|什么|口|味的|?” |
说明:每生成一个 token 就会立即输出,并附带上下文信息。
工具中自定义数据流式输出stream_mode=”custom”
1 | # @Time:2025/9/30 14:48 |
注意:必须在 LangGraph 执行上下文中调用 get_stream_writer(),否则无效。