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

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

在这里插入图片描述

😁 作者简介:一名大四的学生,致力学习前端开发技术
⭐️个人主页:夜宵饽饽的主页
❔ 系列专栏: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.kler.cn/news/289170.html

相关文章:

  • Python教程:使用 Python 和 PyHive 连接 Hive 数据库
  • windows核心编程,纤程使用---->UNIX服务器应用程序移植到Windows中
  • 在更新python虚拟环境pip版本时,由于更新失败导致pip丢失的修复
  • GD - EmbeddedBuilder - 给已有工程换MCU
  • 【IPV6从入门到起飞】2-1 获取你的IPV6(手机、CPE等)
  • LVS Keepalived nginx haproxy 区别
  • 设计模式-原型适配器桥接外观
  • 基于大数据分析景区消费行为影响因素研究【消费等级预测、携程,去哪网数据抓取】
  • 亿图图示下载安装教程EdrawMax Pro 13版超详细图文教程
  • 前端面试:webSocket如何兼容低浏览器?
  • 安防监控视频平台LntonAIServer视频智能分析平台新增视频质量诊断功能
  • 机器学习数学公式推导之降维
  • Python加载 TorchScript 格式的 ResNet18 模型分类该模型进行预测并输出预测的类别和置信度
  • 【运维监控】prometheus+node exporter+grafana 监控linux机器运行情况(2)
  • 【wsl2】从C盘迁移到G盘
  • redroid搭建云手机学习笔记(一)
  • C++ ─── List的模拟实现
  • django orm的Q和~Q的数据相加并不一定等于总数
  • Golang | Leetcode Golang题解之第380题O(1)时间插入、删除和获取随机元素
  • [SDK]-按钮静态文本与编辑框控件
  • Vue-cli的使用
  • MySQL三大日志详解
  • 【区块链 + 房产建筑】透明建造系统 | FISCO BCOS应用案例
  • Windows安装docker,启动ollama运行open-webui使用AIGC大模型写周杰伦歌词
  • Unity实战案例 2D小游戏HappyGlass(模拟水珠)
  • 解剖学上合理的分割:通过先验变形显式保持拓扑结构|文献速递--基于深度学习的医学影像病灶分割
  • 域与活动目录
  • Mudo03 vscode配置相应的文件的搜索路径,库文件的搜索路径以及想要的链接库
  • 【Redis之一:下载安装Redis】
  • Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListMap