当前位置: 首页 > news >正文

langchain langGraph 中streaming 流式输出 stream_mode

一. 支持的流模式

官网地址

stream_mode 有values,updates,custom,messages,debug

values:
每个步骤之后都会打印完整值

updates:
只输出在节点中state有变化的值

messages:
只输出在节点(例如:generate_poem)中调用 LLM

debug:
打印每个节点更详细的信息

cusomter:
从图形节点内部流式传输自定义数据。
writer = get_stream_writer()
writer({“custom_key”: “Generating custom data inside node”})

from typing import TypedDict
from langgraph.graph import StateGraph, START, END
from qwen_model import model
class State(TypedDict):topic: strjoke: strdef refine_topic(state: State):return {"topic": state["topic"] + " and cats"}def generate_joke(state: State):return {"joke": f"This is a joke about {state['topic']}"}def generate_poem(state: State):topic=model.invoke("生成一首简单的小诗").contentreturn {"topic":  topic}graph = (StateGraph(State).add_node(refine_topic).add_node(generate_joke).add_node(generate_poem).add_edge(START, "refine_topic").add_edge("refine_topic", "generate_joke").add_edge("generate_joke", "generate_poem").add_edge("generate_poem", END).compile()
)# The stream() method returns an iterator that yields streamed outputs
for stream_event in graph.stream({"topic": "ice cream"},# Set stream_mode="updates" to stream only the updates to the graph state after each node# Other stream modes are also available. See supported stream modes for detailsstream_mode=["values"],
):stream_mode, event = stream_eventprint(f"stream_mode:{stream_mode},chunk={event}")

values:
打印每个节点的state值。从START开始输出接收的值

stream_mode:values,chunk={'topic': 'ice cream'}
stream_mode:values,chunk={'topic': 'ice cream and cats'}
stream_mode:values,chunk={'topic': 'ice cream and cats', 'joke': 'This is a joke about ice cream and cats'}
stream_mode:values,chunk={'topic': '春风拂柳绿,  \n花开映水清。  \n燕语呢喃起,  \n轻风送我行。', 'joke': 'This is a joke about ice cream and cats'}

updates:
只输出在节点中state有变化的值

stream_mode:updates,chunk={'refine_topic': {'topic': 'ice cream and cats'}}
stream_mode:updates,chunk={'generate_joke': {'joke': 'This is a joke about ice cream and cats'}}
stream_mode:updates,chunk={'generate_poem': {'topic': '春风拂柳青,  \n花开映水清。  \n燕语呢喃起,  \n山色入画屏。'}}

messages:

只输出在节点(例如:generate_poem)中调用 LLM

在这里插入图片描述

debug:
打印每个节点更详细的信息
在这里插入图片描述

二.对接前端的流式输出api

使用fastapi框架的StreamingResponse,协议使用text/event-stream,message_generator是一个文本生成器

import json
from collections.abc import AsyncGeneratorfrom fastapi import APIRouter
from fastapi.responses import StreamingResponse
from langchain_core.messages import HumanMessage
from pydantic import BaseModel, Fieldclass StreamInput(BaseModel):"""Basic user input for the agent."""message: str = Field(description="User input to the agent.",examples=["What is the weather in Tokyo?"],)thread_id: str | None = Field(description="Thread ID to persist and continue a multi-turn conversation.",default=None,examples=["847c6285-8fc9-4560-a83f-4e6285809254"],)router = APIRouter()@router.post("/stream", response_class=StreamingResponse)
async def stream(user_input: StreamInput) -> StreamingResponse:return StreamingResponse(message_generator(user_input),media_type="text/event-stream",)async def message_generator(user_input: StreamInput
) -> AsyncGenerator[str, None]:user_msg = {"messages": [HumanMessage(content=user_input.message)]}kwargs = {"input": user_msg,}# 运行图async for stream_event in agent.astream(**kwargs, stream_mode=["updates", "messages", "custom"]):stream_mode, event = stream_eventif stream_mode == "messages":msg, metadata = eventcontent = msg.contentif content:yield f"data: {json.dumps({'type': 'token', 'content': content})}\n\n"yield "data: [DONE]\n\n"
http://www.dtcms.com/a/609997.html

相关文章:

  • C语言在线编译 | 提供便捷高效的编程体验
  • 自建开发工具IDE(三)仙盟在线文件格式功能——东方仙盟炼气期
  • Vue 3 + Vite 集成 Spring Boot 完整部署指南 - 前后端一体化打包方案
  • 自己的网站网站项目ppt怎么做
  • 保健品网站建设策划书太原广告公司
  • 数据库知识整理——SQL数据查询(2)
  • DAPO(Dynamic sAmpling Policy Optimization)
  • Java实现检测本地指定路径下某一个程序是否在运行
  • 酒店网站模板设计方案威联通231p做网站
  • 网站建设解析无锡网站服务
  • C++中有双向映射数据结构吗?Key和Value能否双向查找?
  • 在Java/Android中,List的属性和方法
  • Python 命令行入门指南:从零到一掌握终端操作
  • FunRec-Task3
  • 住房和城乡建设部网站办事大厅做点击率的网站
  • 泉企业网站建设wordpress轻量级主题
  • 【Qt】多线程学习笔记
  • 做旅游景点网站的目的和意义怎么上传网站地图
  • 判断电脑和手机访问网站怎么选择郑州网站建设
  • Java的编译器是用什么语言写的 | 深入探讨Java编译器的实现原理与技术细节
  • 小麦高分子量谷蛋白(HMW-GS)完整提取流程
  • PostIn从初级到进阶(5) - 如何导入PostMan数据,实现数据迁移
  • LeetCode 面试经典 150_二叉树_二叉树展开为链表(74_114_C++_中等)
  • 航空电子全双工交换式以太网(Avionics Full DupleX switched Ethernet,AFDX)
  • 网站建设资费怎么做网站的浏览量统计
  • SpringBoot16-@Configuration 类
  • 【EGO-Planner自主无人机】在编译EGO-Planner源码时遇到的问题
  • 农业无人机实训教学转型—虚拟仿真破解“三高三难”
  • 专做五金正品的网站网站的定位分析
  • Android开发-java版:SQLite数据库