【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/7/24 20:27:33 阅读更多 →
C++哈希表核心原理与性能优化实战指南

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

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

2026/7/21 17:55:58 阅读更多 →
人生错题集的庖丁解牛

人生错题集的庖丁解牛

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

2026/7/23 6:04:31 阅读更多 →

最新新闻

Poolside Laguna S 2.1模型调用指南:从API集成到生产部署

Poolside Laguna S 2.1模型调用指南:从API集成到生产部署

在 AI 模型服务化部署领域,如何让一个强大的编码模型快速、低成本地被全球开发者调用,一直是工程实践中的核心挑战。Poolside 公司推出的 Laguna S 2.1 模型近期正式上线 OpenRouter 平台,标志着专业级编码助手开始进入标准化 API 服务时代。…

2026/7/25 5:58:42 阅读更多 →
图论建模与二分图判定:从CCPC赛题看DFS/BFS算法实战

图论建模与二分图判定:从CCPC赛题看DFS/BFS算法实战

1. 项目概述:从一道赛题看图的算法实战最近在带学生备赛,刷到一道挺有意思的题目——P10048 “[CCPC 2023 北京市赛] 图”。这题名起得直白,就叫“图”,但内容可一点都不简单,它考察的是对图论基础概念的深刻理解以及将…

2026/7/25 5:58:42 阅读更多 →
AI指令改图技术如何提升电商素材生产效率

AI指令改图技术如何提升电商素材生产效率

1. 项目概述:AI改图如何重塑电商素材生产流程在电商行业摸爬滚打这些年,最让我头疼的就是永无止境的修图需求。从主图精修到场景合成,从尺寸调整到批量水印,每个环节都在和时间赛跑。去年双11期间,我们团队3个设计师连…

2026/7/25 5:58:42 阅读更多 →
C++11多线程异步编程:future、async、promise与packaged_task实战解析

C++11多线程异步编程:future、async、promise与packaged_task实战解析

1. 项目概述:为什么C11的多线程异步操作值得深挖?如果你写过C,尤其是在处理一些需要等待I/O、网络请求或者复杂计算的场景时,肯定对“阻塞”这个词深恶痛绝。在C11标准之前,我们要么依赖平台特定的API(比如…

2026/7/25 5:58:42 阅读更多 →
WSL2配置Autoware图形界面问题解决方案

WSL2配置Autoware图形界面问题解决方案

1. 问题现象与初步排查最近在Windows WSL环境下折腾Autoware时遇到了一个典型问题:程序启动后能看到日志输出,但始终无法正常显示RVIZ可视化界面,甚至有时整个Autoware直接启动失败。这种情况在WSL环境中其实相当常见,特别是对于依…

2026/7/25 5:58:41 阅读更多 →
工业AI模型蒸馏:解决边缘设备算力与精度的矛盾

工业AI模型蒸馏:解决边缘设备算力与精度的矛盾

1. 工业场景中的AI模型困境在工业质检、设备预测性维护等实际场景中,我们经常遇到这样的矛盾:一方面需要高精度AI模型保证检测准确率,另一方面又受限于边缘设备的算力和内存。去年我在某汽车零部件工厂就遇到典型案例——部署在产线上的视觉检…

2026/7/25 5:57:41 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 5:08:22 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 5:13:53 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻