深入浅出 LangGraph —— 第9章:流式输出:实时响应用户

用LangGraph搭建智能体—AI Agents in LangGraph(四、持久化和流式输出) 本节学习了持久化和流式输出,最后还有个异步流式输出,按部就班即可。 阅读详情

📖 本章学习目标

  • ✅ 理解为什么流式输出对 AI 应用体验至关重要
  • ✅ 掌握 stream() 的多种模式(values/updates/messages/custom)
  • ✅ 学会使用 streamEvents 获取细粒度执行事件
  • ✅ 实现 HTTP SSE 和 WebSocket 的流式集成
  • ✅ 掌握自定义流式数据写入(StreamWriter)的使用
  • ✅ 避免常见的流式陷阱和性能问题

一、为什么流式输出是刚需

1、等待的代价

ChatGPT 刚出来的时候,用户等待完整回复可能需要10-30秒。流式输出(Streaming) 改变了这一切。使用流式输出,用户能看到文字一个字一个字地出现,感觉上响应几乎是即时的。

对比体验:

方式用户体验感知延迟适用场景
等待完整响应(invoke)页面空白10秒 → 突然出现全文⭐⭐ 差后台批处理
逐 Token 流式(stream)立刻看到第一个字,逐渐补全⭐⭐⭐⭐⭐ 优聊天界面
节点状态流式看到 Agent 的每步执行进度⭐⭐⭐⭐ 好复杂任务监控

流式输出

用户发送消息

立即显示第一个字

逐字显示...

完整回复

2、LangGraph 的流式层次

graph.stream()

values 模式
每步后完整 State

updates 模式
每步后 State 增量

messages 模式
逐 Token 消息流

custom 模式
自定义数据流

streamEvents 模式
完整执行事件

五种流式模式对比:

模式数据粒度数据量适用场景
values完整State大状态快照监控
updates增量更新中节点执行追踪
messages逐Token小聊天打字机效果
custom自定义灵活进度条、分步展示
streamEvents事件流最大调试和可视化

二、基础流式模式

1、values 模式:每步完整状态

步骤1:准备环境
import * as dotenv from 'dotenv';
dotenv.config();

import { MessagesAnnotation, StateGraph, MemorySaver } from '@langchain/langgraph';
import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage } from '@langchain/core/messages';
步骤2:创建图
const model = new ChatOpenAI({ model: 'gpt-4o-mini' });
const checkpointer = new MemorySaver();

const graph = new StateGraph(MessagesAnnotation)
  .addNode('chat', async (state) => {
    const response = await model.invoke(state.messages);
    return { messages: [response] };
  })
  .addEdge('__start__', 'chat')
  .addEdge('chat', '__end__')
  .compile({ checkpointer });
步骤3:使用values模式流式输出
async function streamValues() {
  const config = { configurable: { thread_id: 'stream-demo' } };
  
  // stream() 返回异步迭代器
  for await (const chunk of graph.stream(
    { messages: [new HumanMessage('介绍一下流式输出的优点')] },
    { ...config, streamMode: 'values' }
  )) {
    // 每个节点执行后,输出完整的当前 State
    const msgs = chunk.messages;
    console.log(`[values] 消息数: ${msgs.length},最新: ${msgs[msgs.length-1].content.slice(0, 50)}...`);
  }
}

await streamValues();
// 输出:
// [values] 消息数: 2, 最新: 流式输出的优点包括: 1. 降低感知延迟...

代码解读:

  • graph.stream():返回 AsyncGenerator,可用 for await 遍历
  • streamMode: 'values':每个节点执行后,输出当前完整的 State
  • 适用于:需要知道每步执行后的完整状态,如进度条显示

优势:

  1. 可以看到每一步的完整状态
  2. 适合调试和监控
  3. 可以保存中间状态用于恢复

劣势:

  1. 数据量大,每次传输完整State
  2. 不适合高频更新场景

2、updates 模式:只看变化的部分

async function streamUpdates() {
  const config = { configurable: { thread_id: 'stream-updates-demo' } };
  
  for await (const chunk of graph.stream(
    { messages: [new HumanMessage('你好')] },
    { ...config, streamMode: 'updates' }
  )) {
    // chunk 是 { 节点名: 该节点返回的状态增量 } 的对象
    for (const [nodeName, nodeUpdate] of Object.entries(chunk)) {
      console.log(`[updates] 节点 "${nodeName}" 完成,更新:`, 
        JSON.stringify(nodeUpdate).slice(0, 100));
    }
  }
}

await streamUpdates();
// 输出:
// [updates] 节点 "chat" 完成,更新: {"messages":[{"content":"你好!有什么可以帮助你的?"}]}

streamMode: 'updates'只输出每个节点更新了什么(增量),而非完整 State,比 values 模式数据量更小,适合需要精确追踪哪个节点改了什么的场景。

优势:

  1. 数据量小,只传输变化部分,高效精准
  2. 清晰看到每个节点的贡献
  3. 适合多节点工作流监控

3、messages 模式:逐 Token 输出

这是最重要的流式模式,让用户看到 LLM 逐字生成内容:

async function streamMessages() {
  const config = { configurable: { thread_id: 'stream-msg-demo' } };
  
  process.stdout.write('AI: ');
  
  for await (const [message, metadata] of graph.stream(
    { messages: [new HumanMessage('写一首五言绝句')] },
    { ...config, streamMode: 'messages' }
  )) {
    // message 是每个生成的 Token(或消息片段)
    if (message.content) {
      process.stdout.write(message.content as string);
    }
  }
  
  console.log('\n[生成完毕]');
}

await streamMessages();
// 输出(逐字显示):
// AI: 春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。
// [生成完毕]

代码解读:

  • streamMode: 'messages':每生成一个 Token 就产生一个事件
  • 解构 [message, metadata]: message 是消息片段,metadata 包含节点信息
  • process.stdout.write:不换行地逐字输出,模拟打字机效果
  • 这是实现 ChatGPT 风格打字机效果的标准做法

工作原理:

  1. LLM开始生成第一个token
  2. 立即通过stream返回给客户端
  3. 客户端显示该token
  4. 重复直到生成完毕

优势:

  1. 极低的首字延迟(TTFT < 500ms)
  2. 用户体验极佳
  3. 适合长文本生成

实际应用:

  • ChatGPT网页版
  • Claude对话界面
  • 所有现代AI聊天应用

三种模式对比示例:

// 假设图有3个节点: plan → execute → review

// values模式: 输出3次完整State
for await (const state of graph.stream(input, { streamMode: 'values' })) {
  console.log('完整State:', state); // 每次都包含所有字段
}

// updates模式: 输出3次增量
for await (const updates of graph.stream(input, { streamMode: 'updates' })) {
  console.log('增量更新:', updates); // 只包含变化的字段
}

// messages模式: 输出N次token(N=token数量)
for await (const [msg] of graph.stream(input, { streamMode: 'messages' })) {
  console.log('单个token:', msg.content); // 逐字输出
}

三、streamEvents:完整执行事件

1、获取细粒度事件流

streamEvents 提供图执行的完整事件序列,适合构建详细的执行监控:

async function streamWithEvents() {
  const config = { configurable: { thread_id: 'events-demo' } };
  
  for await (const event of graph.streamEvents(
    { messages: [new HumanMessage('帮我规划一次旅行')] },
    { ...config, version: 'v2' }
  )) {
    switch (event.event) {
      case 'on_chain_start':
        console.log(`🚀 图开始执行`);
        break;
      case 'on_chain_stream':
        // 每个 Token 都触发此事件
        if (event.data.chunk?.content) {
          process.stdout.write(event.data.chunk.content);
        }
        break;
      case 'on_tool_start':
        console.log(`\n🔧 工具调用开始: ${event.name}`, event.data.input);
        break;
      case 'on_tool_end':
        console.log(`✅ 工具执行完成: ${event.name}`);
        break;
      case 'on_chain_end':
        console.log(`\n🏁 图执行完成`);
        break;
    }
  }
}

await streamWithEvents();

输出:

🚀 图开始执行
正在规划旅行路线...
🔧 工具调用开始: search_flights { from: "北京", to: "上海" }
✅ 工具执行完成: search_flights
航班查询完成,继续规划...
🏁 图执行完成

代码解读:

  • streamEvents(input, { version: 'v2' }):使用 v2 事件格式(推荐),旧版本是v1,字段结构复杂
  • event.event: 事件类型字符串,常见类型如上
  • event.name: 触发事件的组件名称(节点名、工具名等)
  • event.data:事件相关数据(input/output/chunk 等)
  • 适合构建 Agent 执行可视化面板

常见事件类型:

  • on_chain_start/end: 图/节点开始/结束
  • on_chain_stream: 流式数据块
  • on_tool_start/end: 工具调用开始/结束
  • on_custom_event: 自定义事件

事件流示意图:

LLM LangGraph 应用程序 LLM LangGraph 应用程序 streamEvents(input) on_chain_start 调用LLM token 1 on_chain_stream(token 1) token 2 on_chain_stream(token 2) ...更多tokens on_chain_end 完成

2、事件过滤和聚合

// 只关注特定事件
for await (const event of graph.streamEvents(input, config)) {
  // 只处理工具调用事件
  if (event.event.startsWith('on_tool_')) {
    console.log('工具事件:', event.name, event.event);
  }
  
  // 只处理特定节点的事件
  if (event.metadata?.langgraph_node === 'agent') {
    console.log('Agent节点事件:', event.event);
  }
}

四、自定义流式写入

1、在节点内主动推送数据

有时你想在节点执行过程中(而非节点完成后)实时推送中间结果:

import { RunnableConfig } from '@langchain/core/runnables';
import { dispatchCustomEvent } from '@langchain/core/callbacks/dispatch';

async function longTaskNode(
  state: typeof MessagesAnnotation.State,
  config: RunnableConfig
) {
  const steps = ['分析需求', '制定方案', '生成代码', '验证结果'];
  
  for (let i = 0; i < steps.length; i++) {
    // 在节点内部主动推送进度事件
    await dispatchCustomEvent(
      'progress_update',
      { step: steps[i], progress: (i + 1) / steps.length * 100 },
      config
    );
    
    // 模拟耗时操作
    await new Promise(resolve => setTimeout(resolve, 500));
  }
  
  const response = await model.invoke(state.messages);
  return { messages: [response] };
}

代码解读:

  • dispatchCustomEvent(name, data, config):主动推送自定义事件
    • name是事件名,在 streamEvents 中通过 on_custom_event 接收
    • config 参数必须从节点函数的第二个参数获取并传入
    • 适用于:进度条、分步骤显示、长时间任务的实时状态更新
接收自定义事件
// 接收自定义事件
for await (const event of graph.streamEvents(input, config)) {
  if (event.event === 'on_custom_event' && event.name === 'progress_update') {
    const { step, progress } = event.data as { step: string; progress: number };
    console.log(`进度: ${progress.toFixed(0)}% - ${step}`);
  }
}

// 输出:
// 进度: 25% - 分析需求
// 进度: 50% - 制定方案
// 进度: 75% - 生成代码
// 进度: 100% - 验证结果

五、HTTP SSE 集成

1、在 Express 中实现 SSE 流式接口

SSE: 查看MDN相关文档《Server-sent events》。

步骤1:安装依赖
npm install express @types/express
步骤2:创建SSE端点
import express from 'express';
import { HumanMessage } from '@langchain/core/messages';

const app = express();
app.use(express.json());

app.post('/chat/stream', async (req, res) => {
  // 设置 SSE 响应头
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');
  res.setHeader('X-Accel-Buffering', 'no'); // Nginx兼容
  res.flushHeaders();

  const { message, threadId } = req.body;
  const config = { configurable: { thread_id: threadId } };

  try {
    for await (const [msgChunk] of graph.stream(
      { messages: [new HumanMessage(message)] },
      { ...config, streamMode: 'messages' }
    )) {
      if (msgChunk.content) {
        // SSE 格式:data: xxx\n\n
        res.write(`data: ${JSON.stringify({ token: msgChunk.content })}\n\n`);
      }
    }
    // 发送完成标志
    res.write(`data: ${JSON.stringify({ done: true })}\n\n`);
  } catch (error) {
    res.write(`data: ${JSON.stringify({ error: String(error) })}\n\n`);
  } finally {
    res.end();
  }
});

app.listen(3000, () => {
  console.log('SSE服务器运行在 http://localhost:3000');
});

代码解读:

  • Content-Type: text/event-stream:SSE 的固定 MIME 类型
  • Cache-Control: no-cache:防止代理缓存
  • Connection: keep-alive:保持连接打开
  • X-Accel-Buffering: no:Nginx兼容,禁用缓冲
  • res.flushHeaders():立即发送响应头,建立 SSE 连接
  • data: xxx\n\n:SSE 标准格式,每条消息以两个换行结尾
  • 前端用 EventSource API 或 fetch + ReadableStream 消费

SSE格式说明:

  • 每条消息以"data: "开头
  • 以"\n\n"(双换行)结尾
  • 可以包含多个字段:event, id, retry等
步骤3:前端消费SSE
// 前端JavaScript代码
const eventSource = new EventSource('/chat/stream', {
  headers: { 'Content-Type': 'application/json' },
});

let fullResponse = '';

eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  
  if (data.token) {
    // 逐字追加到显示区域
    fullResponse += data.token;
    document.getElementById('response').textContent = fullResponse;
  } else if (data.done) {
    // 完成,关闭连接
    eventSource.close();
    console.log('生成完成');
  } else if (data.error) {
    // 错误处理
    console.error('错误:', data.error);
    eventSource.close();
  }
};

eventSource.onerror = (error) => {
  console.error('SSE连接错误:', error);
  eventSource.close();
};

SSE工作流程图:

LangGraph Express服务器 浏览器 LangGraph Express服务器 浏览器 loop [流式输出] POST /chat/stream 设置SSE响应头 响应头(200 OK) stream(messages模式) token data: {"token":"x"}\n\n 显示token data: {"done":true}\n\n 关闭EventSource

2、WebSocket 替代方案

对于双向通信场景,WebSocket 更合适:

import WebSocket from 'ws';

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  ws.on('message', async (message) => {
    const { text, threadId } = JSON.parse(message.toString());
    
    for await (const [msgChunk] of graph.stream(
      { messages: [new HumanMessage(text)] },
      { configurable: { thread_id: threadId }, streamMode: 'messages' }
    )) {
      if (msgChunk.content) {
        ws.send(JSON.stringify({ type: 'token', content: msgChunk.content }));
      }
    }
    
    ws.send(JSON.stringify({ type: 'done' }));
  });
});

六、最佳实践和踩坑指南

💡 实践 1:根据场景选择合适的流式模式

场景推荐模式原因
聊天界面打字机效果messages逐 Token 展示,首字延迟低
多节点执行进度展示updates知道每个节点的完成情况
完整执行监控/调试streamEvents最细粒度的事件
长任务进度条自定义事件节点内部主动推送
状态快照保存values完整State便于恢复

💡 实践 2:流式输出中的错误处理

async function safeStream(input: typeof MessagesAnnotation.State) {
  try {
    for await (const chunk of graph.stream(input, config)) {
      yield chunk; // 继续向上传递
    }
  } catch (error) {
    console.error('流式输出中断:', error);
    yield { error: String(error) }; // 推送错误事件
  }
}

原因:流式过程中任何错误都应该优雅处理,而不是直接崩溃。

💡 实践 3:控制流式频率

// 批量发送tokens,减少网络请求
let buffer = '';
let count = 0;

for await (const [msgChunk] of graph.stream(input, config)) {
  if (msgChunk.content) {
    buffer += msgChunk.content;
    count++;
    
    // 每10个token或每100ms发送一次
    if (count >= 10) {
      sendToClient(buffer);
      buffer = '';
      count = 0;
    }
  }
}

// 发送剩余内容
if (buffer) {
  sendToClient(buffer);
}

原因:过于频繁的small packets会增加网络开销,适当批量化提升性能。

⚠️ 常见问题

问题现象解决方案
混用 invoke 和 stream结果格式不一致确定一种调用方式,统一接口
SSE 连接被代理截断流式失效,等待完整响应配置 Nginx 关闭缓冲:proxy_buffering off
客户端未处理 SSE 关闭连接永久挂起服务端发送 done 事件,客户端监听后关闭 EventSource
streamEvents v1/v2 混用事件格式解析错误统一使用 version: 'v2',字段结构更清晰
忘记设置CORS前端无法连接SSE添加Access-Control-Allow-Origin响应头
内存泄漏长时间运行后内存增长及时关闭未使用的stream,清理event listeners

📝 本章小结

核心知识点回顾

知识点关键要点应用场景
streamMode: 'values'每步完整 State状态快照监控
streamMode: 'updates'每步增量更新节点执行追踪
streamMode: 'messages'逐 Token 输出聊天打字机效果
streamEvents完整执行事件流调试和可视化
自定义事件节点内主动推送进度条、分步展示
HTTP SSEServer-Sent Events单向流式通信
WebSocket双向实时通信交互式应用

🎯 动手练习

练习 1:打字机效果聊天界面

  • 目标:在命令行实现逐字显示的对话效果
  • 要求:
    1. 使用 messages 模式
    2. 字符间有50ms延迟,模拟真实打字
    3. 支持多轮对话,保持上下文
  • 验收标准:
    • AI 回复像真实打字一样逐字出现
    • 打字速度适中,不太快也不太慢
    • 多轮对话流畅,无卡顿

练习 2:多节点执行进度条

  • 目标:3节点工作流,实时显示每个节点的执行状态
  • 要求:
    1. 用 updates 模式
    2. 节点开始时显示"执行中⏳",完成后显示"✅"
    3. 显示总进度百分比
  • 验收标准:
    • 控制台实时更新,无闪烁
    • 最终所有节点标记完成
    • 进度准确反映执行情况

练习 3:SSE 流式 API

  • 目标:实现一个 Express SSE 端点,前端 EventSource 消费
  • 要求:
    1. 支持 thread_id,实现多轮流式对话
    2. 处理错误情况(网络断开、LLM错误等)
    3. 前端显示打字机效果
  • 验收标准:
    • 浏览器能看到 AI 回复逐字出现
    • 刷新页面后对话历史保留
    • 错误情况下优雅降级

练习 4:自定义进度事件

  • 目标:长任务节点主动推送进度
  • 要求:
    1. 创建耗时5秒的处理节点
    2. 每秒推送一次进度更新
    3. 前端显示进度条动画
  • 验收标准:
    • 进度条平滑从0%到100%
    • 每步都有明确的状态提示
    • 任务完成后显示结果

📚 延伸阅读


下一章:第10章 —— 记忆系统:短期与长期记忆

本地大模型编程实战(27)初探langgraph的流式输出 对于 `LLM(大语言模型)`,流式传输已成为一种越来越受欢迎的功能。其理念是在 `LLM` 生成令牌时就快速返回,而不是等待创建完整响应后再返回全部内容。 对于简单的场景,流式传输实际上非常容易实现,但当涉及到智能体之类的应用时,它会变得复杂,这些智能体有自己的运行逻辑,可能会阻止我们尝试进行流式传输。 本文将探讨 `langchain` 的流式输出,后面将实现**智能体最终结果的流式输出**。 阅读详情

相关推荐

使用LangGraph调用大模型:智能体流式输出

要流式传输agent输出方式,将stream()或astream()方法与结合使用stream_mode=“updates”。 这将在agent每个步骤后发出一个事件.

ai agent知识 1668

LangGraph 流式输出全攻略:从基础用法到高级特性的深度解析

通过,我们可以在节点内部主动发送自定义数据:pythonquery: strgraph = (.compile()# 流式传输自定义数据为用户提供更流畅的实时交互体验优化内存使用,处理大规模输出精确监控和调试复杂流程实现 LLM 生成内容的实时展示。

佑瞻的博客 3682

LangGraph智能体持久化与流式输出实战:从状态管理到实时交互

在构建智能体应用时,状态管理和实时交互是两大核心挑战。状态管理涉及对智能体工作流运行状态的持久化存储,其核心原理是通过检查点机制序列化并保存状态对象,这为智能体提供了记忆能力,是实现多轮对话和错误恢复的技术基础。流式输出则是将大模型生成文本的token预测过程实时分块推送,其技术价值在于显著降低用户感知延迟,提供即时反馈,从而提升交互体验。在工程实践中,这两项技术常应用于客服机器人、复杂任务助手等需要长期会话和实时反馈的场景。本文聚焦于LangGraph框架,深入探讨如何通过检查点机制实现状态持久化,并利用

weixin_30606461的博客 467

LangGraph的stream流式输出与自定义事件

 除了langgraph官方定义的事件,我们还可以自定义事件,自定义事件例如输出流等等,工作流外部就可以进行监听.可以通过adispatch_custom_event的方式来发生自定义事件数据,外部进行监听捕获事件,完成自定义需求...

分享不一样的技术,与你一起共同成长! 2471

LangGraph流式输出实战:智能体与大模型的高效交互

本文深入探讨了如何利用LangGraph的stream_mode实现智能体与大模型交互的流式输出。通过解析values、updates、messages、custom和debug五种核心模式,并结合实战案例,详细展示了如何构建响应迅速、体验流畅的AI应用,有效解决传统同步交互的“等待焦虑”,提升用户交互体验。

assembly8low的博客 740

langgraph流式运行图

langgraph流式运行图

luohualiushui1的专栏 1051

LangGraph中如何使用流式输出

【代码】LangGraph中如何使用流式输出。

qq_43588095的博客 2165

二维卡尔曼滤波位置,速度融合

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

Johnlee2019的博客 8451

LangGraph-流式输出(Streaming)

(如进度、日志、内部状态)messages在涉及 LLM 的节点(如调用聊天模型)时,按 token / 元数据分段输出 LLM 的响应(或中间 token)debug尽可能输出最全面的信息,包括节点名、状态、更新等,是调试用途的流式模式。

czhcc的专栏 2001

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

本文详细介绍了如何使用SpannableStringBuilder在Android平台上构建专业级AI对话界面,涵盖流式文本处理、富文本解析、交互优化等核心技术。通过实战代码示例,帮助开发者实现类似DeepSeek的AI产品交互效果,提升用户体验和应用专业度。

weixin_28358083的博客 198

Protege新手入门:5分钟搞定本体建模基础(附实战案例)

本文为Protege本体建模新手提供了一份快速入门指南。通过构建一个关于“披萨”的实战案例,详细讲解了从环境准备、定义核心类(Classes)、建立对象属性(Object Properties)到设置数据属性(Data Properties)和创建个体的完整流程。文章旨在帮助读者绕过复杂理论,在5分钟内直观掌握本体建模的基础操作,快速建立知识图谱构建的信心。

weixin_28335283的博客 283

超强实时响应:LangGraph流式处理与事件驱动AI系统实战

你还在为AI系统的实时数据处理延迟发愁吗?当用户请求需要毫秒级响应时,传统批处理架构是否让你束手无策?本文将带你掌握LangGraph流式处理核心技术,通过事件驱动架构实现实时数据流的AI系统,从基础原理到实战案例,全程干货让你快速上手。 读完本文你将获得: - 3种核心流式处理模式的实现方法 - 5个实战案例的完整代码解析 - 7个性能优化技巧与常见问题解决方案 - 1套可直接复用的事件驱动架...

gitblog_00914的博客 930

FPGA可重构技术

介绍FPGA 可重构技术的实现方法,包括全局重构和部分重构

航天领域资深码农,型号经验丰富,一线干货分享 1989

LangGraph 流式输出

本文深入解析 LangGraph 流式输出机制,涵盖 Token 级与状态级流的核心区别。详细讲解 astream_events 和 astream 等关键 API 的实战用法,并拓展“流式冒泡”机制以处理并行节点输出。结合最佳实践,指导开发者构建响应迅速、交互流畅的 AI 应用程序。

m0_62967939的博客 372

MOS 管驱动设计细节,波形分析

一般认为MOSFET是电压驱动的,不需要驱动电流。然而,在MOS的G S两级之间有结电容存在,这个电容会让驱动MOS变的不那么简单。 如果不考虑纹波和EMI等要求的话,MOS管开关速度越快越好,因为开关时间越短,开关损耗越小,而在开关电源中开关损耗占总损耗的很大一部分,因此MOS管驱动电路的好坏直接决定了电源的效率。 对于一个MOS管,如果把GS之间的电压从0拉到管子的开启电压所用的时间越短,那么MOS管开启的速度就会越快。与此类似,如果把MOS管的GS电压从开启电压降到0V的时间越短,那么MOS管关断的

m0_50862404的博客 1万+

INCA软件操作指南:手把手教你生成和解析DCM标定数据文件

本文详细介绍了INCA软件在汽车ECU开发中生成和解析DCM标定数据文件的全流程。从A2L文件导入到DCM文件生成,再到HEX文件导出,手把手教你掌握标定数据处理的实用技巧,包括参数标定、曲线标定和常见问题排查,帮助工程师提升工作效率。

weixin_29271053的博客 1056

十一、LangGraph的持久化和流式输出

LangGraph提供了强大的持久化和流式处理机制,支持构建智能代理系统。其核心功能包括:1. 检查点机制(Checkpointer)实现状态持久化,支持多种存储后端,允许中断恢复和多会话管理;2. 流式处理(Streaming)实时输出执行过程,提升交互体验;3. 支持同步/异步调用方式,可捕获细粒度事件。通过状态图(StateGraph)管理节点执行流程,结合工具调用和LLM处理,实现复杂任务处理。示例展示了如何创建支持记忆的代理,通过thread_id维护会话上下文,并演示了流式输出和错误恢复功能。

nzlyll的博客 1367

蓝牙耳机充电仓——功能框架

数据传输:大部分充电仓会跟耳机通信,控制耳机开机、关机和进入可搜索模式等等。蓝牙耳机给大家的生活带来便利,来讲讲TWS蓝牙耳机的搭档充电仓吧!方便携带:如果耳机单独带着,指定能弄丢一个,有了充电仓就安全多了。收纳保护:把珍爱的耳机放入充电仓里,防止丢失、磕碰、刮花等。给耳机充电:提供电力补给,让耳机持续使用。

改变自己现在能改变的,珍惜自己现在所拥有的 8949

深入浅出:LangChain.js 中的流式输出(Streaming)与 SSE 协议实战

摘要: 本文探讨了在LangChain.js中实现Agent和LangGraph流式输出的方法。针对大模型推理速度慢的问题,流式输出通过SSE协议分段传输结果,提升用户体验。文章详细介绍了Agent流式输出的两种模式(updates和messages),并提供了服务端(Node.js/Express)和客户端的代码示例。对于LangGraph,同样支持这两种流式模式,展示了如何通过.stream()方法实现状态更新和消息的实时传输。这些技术能有效优化LLM应用的响应延迟问题。

Web分享 1581

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

langgraph的流式处理

本节介绍了langgraph的流式处理的几种方式,及其使用场景

关注于AI应用开发,探索将传统信息化软件用AI重做一遍 950

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LangChain 流式输出(Streaming)

LangChain结合LangGraph实现了强大的流式输出系统,支持实时反馈代理运行状态。该系统提供三种核心流式模式:代理进度更新(updates)、LLM Token流式传输(messages)和自定义数据推送(custom)。通过stream_mode参数可灵活配置输出内容,支持多模式并行传输。典型应用包括实时显示工具调用过程、逐Token输出LLM响应以及推送自定义状态信息。该系统显著提升了基于大语言模型应用的交互体验,特别适用于需要低延迟反馈的场景。开发者可根据需求选择不同流式模式,或组合使用以实

言之。 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【LangGraph v1.0-08】LangGraph v1.0 流式处理与实时监控:构建响应式 Agent 完全指南

LangGraph v1.0 流式处理与实时监控指南 摘要:LangGraph v1.0 提供了企业级流式处理系统,解决了AI Agent的延迟问题。其流式架构基于事件驱动模型,支持六种流式模式(values/updates/messages/custom/debug/tools),可实时展示处理进度、Token使用和节点状态。核心特性包括零阻塞传输、多模态并发和子图穿透。通过StreamWriter可实现自定义事件流,在工具内部实现细粒度监控。选型建议:Updates模式适合监控场景,Values模式适合

模界 | AI工程化实践者 1098

基于 FastAPI+LangGraph 实现流式响应的智能数据查询

本文介绍了基于FastAPI框架实现支持流式响应的智能数据查询接口方案。系统采用SSE协议实时推送查询处理进度,结合LangGraph工作流引擎处理复杂查询流程。项目采用分层架构设计,包含接口层、服务层和核心配置层,实现依赖注入、生命周期管理和全链路请求追踪等工程化实践。关键技术包括FastAPI异步支持、StreamingResponse流式响应、ContextVar请求上下文管理,以及MySQL、Elasticsearch等多数据源集成。

实战怎么玩,你就怎么学 1196

6 LangGraph的stream流式输出

看到 _start:关注 data.input,看它接收了什么。看到 _stream:关注 data.chunk,看它吐出了什么(实时内容)。看到 Chain:这是流程/容器。看到 Model:这是AI 思考。看到 Tool:这是外部操作。

qq_28611929的博客 556

用 Serverless Framework 将 LangGraph JS 流式 Agent 部署到 AWS Bedrock AgentCore:实时 Token SSE 输出实战

本文围绕仓库内 [langgraph-streaming 示例](https://link.gitcode.com/i/e5d0c42d08b0154e08e8a6a21c9ffa56) 展开,讲解如何用 Serverless Framework 将基于 LangGraph JS 的 ReAct Agent 部署到 AWS Bedrock AgentCore,并以 `async function*

gitblog_00896的博客 430
上一篇: 深入浅出 LangGraph —— 第8章:人机交互:中断与审批流程
下一篇: 深入浅出 LangGraph —— 第10章:记忆系统:短期与长期记忆
FrontAI
博客等级 码龄1年 61粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值