【langgraph 从入门到精通graphApi 篇】流式输出与 Streaming
第 10 章流式输出与 Streaming文章目录第 10 章流式输出与 Streaming10.1 本章目标10.2 核心概念stream_mode 七种模式对比v2 vs v3 流式 API10.3 实战实战 1Token 级打字机效果messages 模式实战 2多模式组合流式v2 统一格式实战 3自定义流式事件custom 模式实战 4v3 事件流式 API推荐10.4 API 速查10.5 错误与避坑指南坑 1同步 stream() 在 async 函数中调用坑 2messages 模式未过滤不需要的模型输出坑 3custom 模式在节点外调用 get_stream_writer()坑 4v2 格式未判断 chunk 类型10.6 最佳实践总结10.1 本章目标学完本章你将能够理解stream()和astream()的区别和使用场景掌握所有stream_mode模式values/updates/debug/messages/custom/checkpoints/tasks学会 v2 统一格式和 v3 事件流式 API实现 Token 级打字机效果和自定义流式事件10.2 核心概念stream_mode 七种模式对比模式输出内容典型用途values每步后完整 State 快照查看完整状态变化updates每步增量更新含节点名了解哪个节点改了什么messagesLLM Token 流式输出(token, metadata)打字机效果custom通过get_stream_writer()的自定义数据进度条、状态通知debug尽可能多的调试信息排查问题checkpointscheckpoint 创建事件监控持久化tasks任务启动/完成事件监控并行任务v2 vs v3 流式 API特性v2v3推荐APIstream(mode[...], versionv2)stream_events(versionv3)输出格式统一 StreamPart 格式类型化投影中断检测需手动处理stream.interrupts属性最终状态需手动收集stream.output属性10.3 实战实战 1Token 级打字机效果messages 模式fromtypingimportTypedDict,Annotatedfromlanggraph.graphimportStateGraph,START,END,add_messagesfromlangchain_core.messagesimportBaseMessage,HumanMessage,SystemMessagefromlangchain_openaiimportChatOpenAIclassState(TypedDict):messages:Annotated[list[BaseMessage],add_messages]llmChatOpenAI(modelgpt-4o,temperature0.7,streamingTrue)defchat_node(state:State)-dict:responsellm.invoke([SystemMessage(content你是一个友好的助手)]list(state[messages]))return{messages:[response]}builderStateGraph(State)builder.add_node(chat,chat_node)builder.add_edge(START,chat)builder.add_edge(chat,END)graphbuilder.compile()# # 流式输出Token 级打字机效果# print(AI: ,end,flushTrue)forchunkingraph.stream({messages:[HumanMessage(content写一首关于编程的短诗)]},stream_modemessages,):ifisinstance(chunk,tuple):msg_chunk,metadatachunkifhasattr(msg_chunk,content)andmsg_chunk.content:print(msg_chunk.content,end,flushTrue)实战 2多模式组合流式v2 统一格式# 同时使用多种 stream_modeforchunkingraph.stream({messages:[HumanMessage(content写一首诗)]},stream_mode[values,updates,messages],versionv2,):chunk_typechunk.get(type)ifchunk_typevalues:print(f[values] 消息数:{len(chunk[data].get(messages,[]))})elifchunk_typeupdates:fornode_name,updateinchunk[data].items():print(f[updates] 节点 {node_name} 更新了 State)elifchunk_typemessages:msg_chunk,metadatachunk[data]ifhasattr(msg_chunk,content)andmsg_chunk.content:print(msg_chunk.content,end,flushTrue)实战 3自定义流式事件custom 模式fromlanggraph.configimportget_stream_writerimporttimedeflong_running_node(state:State)-dict:模拟长时间运行的节点通过 custom 模式发送进度通知。writerget_stream_writer()# 获取流式写入器writer({progress:0,status:开始处理...})time.sleep(0.5)writer({progress:30,status:正在分析数据...})time.sleep(0.5)writer({progress:60,status:正在生成结果...})time.sleep(0.5)writer({progress:100,status:处理完成})return{messages:[AIMessage(content处理完成)]}# 接收自定义事件forchunkingraph.stream({messages:[HumanMessage(content开始处理)]},stream_mode[custom,messages],versionv2,):ifchunk[type]custom:eventchunk[data]print(f\n [{event[progress]}%]{event[status]},end)elifchunk[type]messages:msg_chunk,_chunk[data]ifhasattr(msg_chunk,content)andmsg_chunk.content:print(f\nAI:{msg_chunk.content},end)实战 4v3 事件流式 API推荐streamgraph.stream_events({messages:[HumanMessage(content写一首诗)]},versionv3,)# 类型化投影直接遍历 LLM 消息 tokenformsginstream.messages:fortokeninmsg.text:print(token,end,flushTrue)# 获取最终状态finalstream.outputprint(f\n\n最终消息数:{len(final[messages])})# 检查中断ifstream.interrupted:print(f图被中断:{stream.interrupts})10.4 API 速查API完整签名入参说明返回值说明.stream(input, stream_mode)stream(input, stream_mode, version)input: 初始 State;stream_mode: 模式或模式列表;version:v2Iterator[dict]同步流式.astream(input, stream_mode)astream(input, stream_mode, version)同 streamAsyncIterator[dict]异步流式stream_modevalues模式名无完整 State 快照每步后完整状态stream_modeupdates模式名无增量更新每个节点的变更stream_modemessages模式名无(token, metadata)LLM Token 流stream_modecustom模式名无自定义数据通过 get_stream_writerstream_modedebug模式名无调试信息节点执行详情get_stream_writer()get_stream_writer()无Writer 函数在节点中发送自定义事件.stream_events(input, v3)stream_events(input, versionv3)input: 初始 State;version:v3EventsStreamv3 事件流式 API推荐10.5 错误与避坑指南坑 1同步 stream() 在 async 函数中调用# ❌ 错误写法asyncdefbad_handler():forchunkingraph.stream(...):# 同步 stream 在 async 中阻塞事件循环print(chunk)# ✅ 正确写法asyncdefgood_handler():asyncforchunkingraph.astream(...):# 使用 astreamprint(chunk)坑 2messages 模式未过滤不需要的模型输出# ❌ 错误所有 LLM 输出都混在一起forchunkingraph.stream(...,stream_modemessages):print(chunk[0].content)# 可能包含内部模型的输出# ✅ 正确使用 tags 过滤modelChatOpenAI(modelgpt-4o).with_config({tags:[user_facing]})forchunkingraph.stream(...,stream_modemessages):msg_chunk,metadatachunkifuser_facinginmetadata.get(tags,[]):print(msg_chunk.content)坑 3custom 模式在节点外调用 get_stream_writer()# ❌ 错误写法writerget_stream_writer()# 在节点外调用 → 报错# ✅ 正确写法defmy_node(state:State)-dict:writerget_stream_writer()# 在节点内调用writer({status:ok})坑 4v2 格式未判断 chunk 类型# ❌ 错误假设所有 chunk 都是 messagesforchunkingraph.stream(...,stream_mode[values,messages],versionv2):print(chunk[data][0].content)# values 类型的 chunk 没有 .content# ✅ 正确先判断类型forchunkingraph.stream(...,stream_mode[values,messages],versionv2):ifchunk[type]messages:msg_chunk,_chunk[data]print(msg_chunk.content)10.6 最佳实践总结生产环境使用astream()异步流式不阻塞事件循环支持更多并发Token 流式用messages模式调试用debug模式各取所需使用 v2 统一格式处理多模式组合versionv2统一返回StreamPart新项目优先使用 v3 事件流式 API类型化投影更安全、更易用自定义进度通知用custom模式配合get_stream_writer()实现实时进度

相关新闻

窗口堆叠与映射:chwso与mapw命令的终极应用指南

窗口堆叠与映射:chwso与mapw命令的终极应用指南

窗口堆叠与映射:chwso与mapw命令的终极应用指南 【免费下载链接】core Set of window manipulation tools 项目地址: https://gitcode.com/gh_mirrors/core106/core 在X窗口系统的世界里,窗口管理是一项核心技能。wmutils工具集中的chwso和mapw命…

2026/10/11 1:05:27 阅读更多 →
C++哈希表核心原理与性能优化实战指南

C++哈希表核心原理与性能优化实战指南

1. 项目概述:为什么我们需要哈希表?如果你写过C程序,处理过用户数据、游戏道具ID或者网络请求的缓存,大概率遇到过这样的场景:你需要根据一个特定的“键”(比如用户ID、商品编号、URL字符串)来快…

2026/10/11 10:08:36 阅读更多 →
人生错题集的庖丁解牛

人生错题集的庖丁解牛

人生真正的高手,不是从不犯错的人,而是能够把错误整理成经验,把经历提炼成智慧的人。学生时代有错题本: 不是为了记录: “我哪里失败了。”而是为了找到: “我为什么会错。” “下一次如何避免。” “我应该…

2026/10/2 14:47:03 阅读更多 →

最新新闻

iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

iMX8M异构多核开发:A53与M4的Rpmsg核间通信全解析

拿到一块iMX8M板卡,A53那边跑着Linux做业务逻辑,M4这边想跑FreeRTOS管实时控制,第一个绕不开的问题就是:这两个核之间到底怎么通信。我在实际项目里试过几种土办法——共享变量太脆弱,串口又太慢,敲了半天代…

2026/10/14 20:53:22 阅读更多 →
802.11-2020 PDF高效阅读指南:条款定位与测试基线实战

802.11-2020 PDF高效阅读指南:条款定位与测试基线实战

简介:此PDF为IEEE 802.11-2020标准的正式版全文,属于无线局域网领域的核心规范,面向网络工程师、通信专业学生与科研人员,用于理解WLAN介质访问控制层与物理层的完整定义。该版本由IEEE计算机协会LAN/MAN标准委员会开发&#xff0…

2026/10/14 20:53:22 阅读更多 →
ArcGIS Pro 2.5发布OSGB三维模型失败原因与修复指南

ArcGIS Pro 2.5发布OSGB三维模型失败原因与修复指南

1. 为什么OSGB在ArcGIS Pro 2.5里突然“变难了”——从模型加载到服务发布的断层真相你是不是也遇到过这样的情况:用ContextCapture或Pix4D生成的OSGB倾斜摄影模型,在本地ArcGIS Pro里打开时缩放流畅、纹理清晰,连瓦片层级切换都丝滑&#xf…

2026/10/14 20:53:22 阅读更多 →
Wing 模拟器中的 sim.Container:从 entrypoint 测试快照看自定义容器启动与底层实现

Wing 模拟器中的 sim.Container:从 entrypoint 测试快照看自定义容器启动与底层实现

编程语言编译器云原生语言运行时 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mirrors/wi/wing 点击查看 免…

2026/10/14 20:53:22 阅读更多 →
JDK 11.0.15 Linux部署指南:TLS 1.3与GC调优实战

JDK 11.0.15 Linux部署指南:TLS 1.3与GC调优实战

简介:本资源为Linux平台下Java 11.0.15正式版JDK标准发行包(jdk-11.0.15_linux-x64_bin.tar.gz),面向Java初学者、Linux服务器开发者及需要稳定LTS版本JDK的生产环境部署人员,解决跨平台开发、服务端编译运行及JVM调优…

2026/10/14 20:53:22 阅读更多 →
Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

Dubbo服务注册与暴露全流程解析:从Spring容器启动到注册中心

1. 从一次线上故障说起&#xff1a;为什么要搞清楚服务注册与暴露很多同学用 Dubbo 做微服务&#xff0c;配置文件里写个<dubbo:service>或者加个DubboService注解&#xff0c;服务就能被调用了&#xff0c;至于背后发生了什么&#xff0c;基本靠“框架自动搞定”这句话糊…

2026/10/14 20:52:20 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →