type
status
date
slug
summary
tags
category
icon
password
前言
流式输出一直是agent开发里很重要的一部分,可以让用户不需要等待长时间的响应,及时看到AI输出的部分信息。
在Langgraph中,有几种不同的流式输出方式,这篇文章将对这些方式进行阐释和总结。
以下是我实验使用的graph:

第一层是我用来分离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模式可以用来对大模型的返回进行流式的输出。
📎 参考文章
- 作者:HeartBird
- 链接:https://blog.heartbird.site/article/1d41ac30-0542-8069-ae8d-c16be93c6760
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。