在构建复杂的AI应用时,LangGraph作为一个强大的工具,为我们提供了灵活的图结构程序设计能力。今天,我们将深入探讨LangGraph中的一个关键特性:流式响应模式。这个特性不仅能提高应用的响应速度,还能为用户提供更加流畅的交互体验。
LangGraph中的流式响应:与传统LLM有何不同?
在LangGraph中,编译后的图程序本质上是一个Runnable可运行组件。与传统的大语言模型(LLM)不同,LangGraph支持多种流式模式输出。传统LLM的流式模式通常是一个词一个词地输出,而LangGraph的流式响应每次输出的是一个节点的数据状态。这种设计为我们提供了更细粒度的控制和更丰富的数据展示方式。
两种基本的流式模式
LangGraph提供了两种主要的流式响应模式,每种模式都有其特定的使用场景:
-
values模式:
- 返回图的完整状态值(总量)
- 每个节点调用后,返回图的完整状态
- 适用于需要随时了解整个图状态的场景
-
updates模式:
- 返回图的状态更新(增量)
- 每个节点调用后,只返回状态的变化部分
- 适用于只关注变化部分,或需要节省带宽的场景
如何使用流式模式?
使用流式模式非常简单。在调用stream()
函数时,只需传递stream_mode
参数即可配置不同的流式响应模式。让我们以ReACT智能体为例,来看看如何使用这两种模式:
# values模式示例
inputs = {"messages": [("human", "2024年北京半程马拉松的前3名成绩是多少?")]}
for chunk in agent.stream(
inputs,
stream_mode="values",
):
print(chunk["messages"][-1].pretty_print())
# updates模式示例
for chunk in agent.stream(
inputs,
stream_mode="updates",
):
print(chunk)
在values模式下,每次输出都是完整的数据状态。而在updates模式下,返回的是字典格式的增量数据,键为节点名称,值为状态的更新。
当前限制与未来展望
虽然LangGraph的流式响应机制已经为我们提供了强大的功能,但它仍然存在一些限制。目前,虽然我们可以正确获取每个节点的数据,但等待时间仍然较长,特别是涉及大语言模型的节点。这是因为节点本身也应该支持流式输出。理想情况下,大语言模型节点在图的流式输出下应该保持其固有的流式特性,而不是等待完整输出后再返回。
理想的Agent输出方式
市面上常见的Agent系统(如Coze、Dify、智谱、GPTs等)采用了更优的方案:每个步骤(如知识库检索、工具调用、LLM生成内容)完成后立即流式返回。这种方式能够提供更快的响应速度和更好的用户体验。
Agent 执行了几个步骤:知识库检索、工具调用、LLM生成内容,当每个步骤完成之后都会流式返回内容给前端,并且在一些相对耗时的步骤,例如 LLM生成内容 也在该步骤内进行了流式输出,这样可以避免用户亦或者 API 接口长时间没有响应导致连接中断,也能提升用户体验。
结语
LangGraph的流式响应机制为我们构建高效、响应迅速的AI应用提供了强大的工具。通过合理利用values和updates两种模式,我们可以根据具体需求优化应用的性能和用户体验。虽然当前还存在一些限制,但随着技术的不断发展,我们可以期待LangGraph在未来提供更加完善和高效的流式处理能力。
在实际应用中,建议开发者根据具体场景选择合适的流式模式,并持续关注LangGraph的更新,以便利用最新的特性来优化您的AI应用。
标签:LangGraph,模式,响应,流式,LLM,节点 From: https://www.cnblogs.com/muzinan110/p/18541095