type
status
date
slug
summary
tags
category
icon
password

前言

流式输出一直是agent开发里很重要的一部分,可以让用户不需要等待长时间的响应,及时看到AI输出的部分信息。
在Langgraph中,有几种不同的流式输出方式,这篇文章将对这些方式进行阐释和总结。
以下是我实验使用的graph:
notion image
第一层是我用来分离user_input的 ,没什么用。
第二层security check用来检查user_input是否包含危险指令,如果拒绝就进入reject_node。
最后的chat_node用来产生最终的response,它里面其实是一个带着搜索功能的react agent。
整体的state如下:

 

一、获取values(stream_mode=”values”)

以上是使用”values”模式调用图的方法,我们可以看到本质上是输出了每一层的state(第一个输出是我传递进去的state)。
值得注意的是,由于chat_node内部我只拿了react agent最后的ai消息,这里values模式没有进入chat_node内部的react agent里的节点,所以不包含任何工具信息。也就是说,langgraph仍然是按照每一个节点获取数据。

 

二、获取updates(stream_mode=”updates”)

updates模式也很好理解。values返回每一层的state,而updates只返回每一层更新的部分:
在这里,attach_input层设置了初始值,security_check层更新了security状态,而chat_node更新了消息。和values一样,updates也是以节点为单位返回的。

 

三、获取debug记录(stream_mode=”debug”)

debug模式本质上就是对每一层给出了更多的信息:
可以看到每一层输出了两个记录,一个是task,包含时间戳、步骤、该层的state和触发器。一个是task_result,包含时间戳、步骤、该层的更新,并额外提供了interrupts和errors信息,主要是帮助开发人员调试使用。

 

四、获取自定义输出(stream_mode=”custom”)

除了预设的输出模式外,我们也可以自定义流式输出内容,但这依赖一些额外的组件。
我们在reject_node和chat_node这两层中定义了三个输出点,接下来使用:
输出为:
值得注意的是,如果在chat_node里我们换成:
这种方式会逐节点的返回我们react agent里每一层的输出(包括Tools),但是不会流式返回消息,仍然是等agent把整个消息生成完之后再返回。

 

五、流式获取消息(stream_mode=”messages”)

那么,我们该如何真正做到流式获取每一层的消息呢?这里要用到的其实是messages模式:
输出为:
我们可以看到,所有的消息都能流式产生,并且会自动进入我们的react agent里获取数据。
可以通过metadata进行更精细的控制,我们看一下每一个chunk的metadata:
可以看到,进入react agent之后,step被重新计数了。我们也可以获取更多精细的信息,例如checkpoint_ns,使用的llm等。

 

六、多种输出模式并行使用

其实就是把stream_mode参数变成一个list。
输出如下:

 

总结

langgraph中流式输出大概就是这5种模式。前四种基本都是逐节点的“流式”,而不是真正流式的输出大模型消息。最后一种messages模式可以用来对大模型的返回进行流式的输出。

📎 参考文章

 
期末碎碎念【大模型基础系列】一、从了解Token开始
Loading...
HeartBird
HeartBird
Learning AI
最新发布
LangGraph案例分享:Build.inc
2025-5-4
【大模型基础系列】一、从了解Token开始
2025-5-4
期末碎碎念
2025-5-4
Langgraph中几种流输出模式总结
2025-4-14
机器学习中的常用指标(一)
2025-4-6
最初的随笔
2025-4-4