【流式输出】LangChain流式输出的概念

news2024/11/14 13:25:15

在这里插入图片描述

😁 作者简介:一名大四的学生,致力学习前端开发技术
⭐️个人主页:夜宵饽饽的主页
❔ 系列专栏:JavaScript小贴士
👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇气

​🔥​前言:

流式输出是一种极具价值的技术,它允许数据在生成的同时逐步传输,而无需等待整个过程完成,这是我自己的学习笔记,希望可以帮助到大家,欢迎大家的补充和纠正

文章目录

    • Streaming流式输出
      • 1、单个LLM的流式输出
      • 2、从多个链式调用中获取中间结果
      • 3、自定义事件流

Streaming流式输出

单个LLM调用的运行时间通常比传统资源请求运行得更长,当构建需要多个推理步骤的复杂的链式或代理时,这种情况会更加复杂

为了解决这个问题,我们可以采用流式输出,输出一旦生成,就可以立即显示,在langchain框架中实现有三种方法

1、单个LLM的流式输出

在Langchain中,大多数模块都包含.stream方法作为处理流式输出的接口,.stream方法会返回一个迭代器,你可以将其与for await 一起使用...of循环

const azureModel=await getAzureModel()

const prompt=ChatPromptTemplate.fromTemplate(
    "告诉我一个关于{topice}的笑话"
)

const parse=new StringOutputParser()
const chain=prompt.pipe(azureModel).pipe(parse)

const eventStream=await chain.streamEvents(
    {topice:"猫"},
    {version:"v2"}
)

for await (const event of eventStream){
    const kind=event.event
    if(kind==="on_chat_model_stream"){
        console.log(event)
    }
}

2、从多个链式调用中获取中间结果

在langchain中我们可以使用streamEvents方法来实现,调用该方法时,它将返回一个迭代器,该迭代器会生成各种类型的事件,我们可以根据项目的需要筛选和处理这些事件

事件参考:

  • on_llm_start:当大模型开始处理输入时触发该事件。输入内容是大模型的输入,没有输出内容
  • on_llm_stream:当大模型逐步生成并流失传输输出是触发该事件,输出内容是部分输出结果
  • on_llm_end:当大模型处理完成所有输入并生成完整输出是触发该事件,输出内容是完整的输出结果
  • on_chain_start:当一个链式任务开始时触发该事件
  • on_chain_stream:当链式任务的某一个步骤正在执行并产生输出时触发该事件
  • on_chain_end:当链式任务完成时触发该事件
  • on_tool_start:当工具开始开始执行时触发该事件
  • on_tool_stream:当工具逐步生成并流式传输输出时触发该事件
  • on_tool_end:当工具完成执行时触发该事件
  • on_retriever_start:当检索器开始执行时触发该事件
  • on_retriever_chunk:当检索器逐步返回结果时触发该事件
  • on_retriever_end:当检索器完成检索任务时触发该事件
  • on_prompt_start:当提示模版开始执行时触发该事件
  • on_prompt_end:当提示模版完成时触发该事件
const azureModel=await getAzureModel()

const prompt=ChatPromptTemplate.fromTemplate(
    "告诉我一个关于{topice}的笑话"
)

const parse=new StringOutputParser()
const chain=prompt.pipe(azureModel).pipe(parse)

const eventStream=await chain.streamEvents(
    {topice:"猫"},
    {version:"v2"}
)

for await (const event of eventStream){
    const kind=event.event
    if(kind==="on_chat_model_stream"){
        console.log(event)
    }
}

3、自定义事件流

在有些时候,我们可能希望从Runnable中插入自定义回调事件,以便它可以显示在自定义回调处理程序中,例如:如果您有一个包含多个步骤的长时间运行的工具,则可以在步骤之间调度自定义事件,并使用这些自定义事件来监控进度。您还可以向应用程序的最终用户显示这些自定义事件,以向他们展示当前任务的进度。

要自定义事件,需要使用两个属性:namedata

name:字符串的格式,表示自定义的事件名称

data:任何格式,与事件关联的数据,这可以是任何东西,不过建议将器设置为JSON可序列化

//以下代码案例是需要环境支持async_hooks
const azureModel=await getAzureModel()

const reflect=RunnableLambda.from(async (value:string)=>{
    await dispatchCustomEvent("event1",{
        reversed:value.split("").reverse().join("")
    });
    await dispatchCustomEvent("events",5);
    return value
})

//--第一种方法使用eventStream来调用,这种方式更加适合需要实时处理事件的应用场景
const eventStream=await reflect.streamEvents("hello world",{
    version:"v2"
})

for await (const event of eventStream){
    // if(event.event==="on_custom_event"){
    //     console.log(event)
    // }
    console.log(event)
}

//--第二种方法使用回调函数来实现,适合短期的单次任务或调用
let result=await reflect.invoke("hello world",{
    callbacks:[
        {
            handleCustomEvent(eventName,data,runId){
                console.log(eventName,data,runId)
            }
        }
    ]
})

console.log(result)


//输出结果
/**
{
  event: 'on_custom_event',
  run_id: '9eac217d-3a2d-4563-a91f-3bd49bee4b3d',
  name: 'event1',
  tags: [],
  metadata: {},
  data: { reversed: 'dlrow olleh' }
}
{
  event: 'on_custom_event',
  run_id: '9eac217d-3a2d-4563-a91f-3bd49bee4b3d',
  name: 'event2',
  tags: [],
  metadata: {},
  data: 5
}
**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Visual Studio提示‘缺少MSVXXXX.dll文件’和‘应用程序无法正常启动0xc000007b’的解决办法

vs调试bug记录 1提示:缺失MSVCR120D.dll 在该地址下载dll文件: https://cn.dll-files.com/search/?qMSVCR120D.dll 下载之后放入本地C:\Windows\System32文件夹里面,缺失MSVCR120D.dll的错误信息消失 2提示:应用程序无法正常启…

深入解析Linux轻量级进程:线程的概念、原理、优缺点及其与进程的关系与区别

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 📚Linux线程📕什么是线程*可以使用多进程去并发的执行一个进程的代码,那为什么要由线程呢&#x…

Dev C++:简单步骤下载与安装指南

1. 前言 在当今这个数字化时代,编程已成为连接创意与技术的桥梁,它不仅推动着科技的进步,也深刻地改变着我们的生活方式。对于初学者而言,选择一款合适且易于上手的集成开发环境(IDE)是学习编程旅程中的重…

Vmware虚拟机断电重启后无法正常启动报Unmount and run xfs_repair

目录 一、问题描述二、解决方法 一、问题描述 Vmware虚拟机断电重启后无法正常启动,报错信息如下: 二、解决方法 执行以下命令: umount /dev/sda5 xfs_repair -L /dev/sda5 reboot

jmeter响应断言、json断言、断言持续时间、大小断言操作

在jmeter断言当中、常用的有响应断言、json断言、断言持续时间,大小断言等 一、响应断言 Apply to:断言应用的范围,这里默认,通常发出一个请求只触发一个服务器测试字段 响应文本,response响应体内的信息响应代码&am…

awk详解

文章目录 一、概述二、工作原理三、工作流程3.1 运行模式3.2 执行流程 四、基本语法4.1 命令格式 五、实战案例5.1 开始块(BEGIN block)5.1.1print 5.2 内置变量5.3 BEGIN END 运算5.3.1 扩展生产:网卡的ip、流量5.3.2 根分区的可用量5.3.3 a…

python与pytroch相关

1.pytroch模型类 PyTorch 是一个易学且清晰明了的深度学习库。本节讲解如何查看一个模型的结构。 首先,最简单创建模型的方式如下: #导入必要的库 import torch.nn as nn myNetnn.Sequential(nn.Linear(2,10),#第一层(全连接层)&…

Leetcode236经典题目二叉树的最近公共祖先

本次为大家带来的题目是leetcode236二叉树的最近公共祖先 本道题的直观思路是自底向上进行寻找,如果存在的话那么向上返回,如何能够自底向上遍历呢?我们可以利用回溯进行处理,那么需要注意的是进行回溯的时候一定要使用后序遍历来…

Centos7安装FFmpeg详细步骤(已验证成功)

最近我们需要使用FFmpeg来合成视频功能,这就需要用到服务器必须安装FFmpeg了。 FFmpeg 是一款功能强大的跨平台命令行工具,可以处理各种音频和视频文件,包括转换视频和音频格式、剪辑、合并视频和音频、提取音频、添加字幕、添加水印、调整视…

读书学习笔记入门 # Datawhale X 李宏毅苹果书 AI夏令营

文章目录 学习目标:学习内容:Task 1 通过案例了解机器学习机器学习(Machine Learning,ML)和深度学习(Deep Learning,DL)的基本概念什么是回归(regression)什么…

【机器学习】表示学习的基本概念和方法以及编解码结构的基本概念

引言 表示学习(Representation Learning)是机器学习的一个子领域,它专注于学习数据的表示形式,即数据的高层特征或抽象概念 文章目录 引言一、表示学习1.1 表示学习的重要性1.2 表示学习的方法1.3 应用场景1.4 挑战1.5 总结 二、如…

AUTOSAR_EXP_ARAComAPI的5章笔记(2)

返回目录 5.3 Proxy Class Proxy Class从AutoSar元模型的服务接口描述中生成。 ara::com确实标准化了生成的Proxy Class的接口。一个AP产品供应商的工具链将生成一个代理实现类来精确地实现这个接口。 注意: 因为Proxy Class必须提供的接口是由ara::com定义的,所…

教你手机投屏到电视方法,用电视屏幕让家庭蛋糕制作更有趣

心血来潮,我突然想要尝试跟着手机视频制作蛋糕。当我向老妈提起这个想法时,她也表示出了浓厚的兴趣,想要一起学习如何制作蛋糕。 然而,我们很快意识到一个问题:如果我们俩都挤在狭小的厨房里,一边看手机一…

51单片机-LED点阵屏介绍

作者:Whappy 时间:2024.9.3 目的:手撕51 74HC595,原理很简单,就是通过串行输入端SER,将一个字节的数据一位一位的传送到我们的移位寄存器中,图左边第一个区域,则SERCLK就是给移位节…

[STM32]从零开始的STM32 LED教程(小白向)

一、为什么LED会作为第一个例程 大家可能已经发现了,我们大部分的STM32教程都将LED作为教程中的第一个例程。为什么呢?在我看来,之所以把LED作为教程的第一个例程,因为这个实验能够让新手直观的看到实验现象,在操作GPI…

记一次某中学系统越权漏洞

一、确定测试站点 资产的收集依旧是按照弱口令与注册进站的思路进行寻找(具体思路可参考上篇文章,含有完整的收集思路与个人信息搜集方法)。最后确定了该站点,密码依旧存在弱口令: 于是利用默认密码成功登录该站点&am…

cocotb备忘录

按位给和int int后接的值,建议在32之内。大于32位建议按位给,因为int强制类型转换有范围 第二,低位给到低位,高位给到高位 # 将src_ip和dst_ip给到phv中,TMD以后只要报错在这个范围里面,TMD直接马上用手算一遍能不能…

自闭症谱系障碍:探索这一复杂神经发育障碍的奥秘

自闭症,也被称为孤独症谱系障碍(ASD),是一种深刻影响儿童神经发育的复杂障碍。它以独特的社交交流障碍、重复刻板行为以及兴趣范围的极度狭窄为主要特征,为患者及其家庭带来了诸多挑战。 自闭症的成因至今仍是科学界探…

构建私有CA和证书

一、准备 两台虚拟机 192.168.252.148 CA 192.168.252.149 客户端 二、构建私有CA 192.168.252.148 CA 安装openssl 1.检查是否存在 rpm -qa openssl 2.安装或者更新openssl yum install openssl openssl-devel -y 查看CA相关配置 /etc/pki/tls/openssl.cnf这个文件是…

充气泵芯片|充气泵方案芯片SIC8833

充气泵的方案设计功能比较简单,四个压力模块和ADC芯片以及再加个主控芯片大约就构成了其核心功能的器件要求。ADC芯片的功能是将压力传感器所得到压力值转化为可显示的数值,在通过LED或者LCD屏展现出来,就是后面我们测量气压所得到的气压数值…