🦜Langchain v0.2中基于runnables的流式事件支持

type
status
date
slug
summary
tags
category
icon
password
😀
大模型在推理时由于要对下一个字的概率进行计算,所以无论多么牛逼的LLM,在推理的时候或多或少都有一些延迟,而这种延迟在类似Chat的场景里,体验非常不好,除了在LLM上下功夫外,提升最明显的就是从用户体验着手,采用类似流式输出的方式,加快反馈提升用户体验,让用户感觉快乐很多,这也是为什么chatG{T会采用这种类似打字机效果的原因。流式在langchain前面版本已经支持不少,在0.2版本里,主要是增加了事件支持,方便开发者对流可以有更细致的操作颗粒度。我们来系统看下如何使用它。
 

流的主要接口

我们知道从0.1大版本开始,langchain就支持所谓的runnable协议,为大部分组件都添加了一些交互接口,其中流的接口有:
  • 同步方式的stream以及异步的astream:他们会以流的方式得到chain的最终结果。
  • 异步方式的astream_event和astream_log:这两个都可以获得到流的中间步骤和最终结果。
 

简单使用:直接使用大模型输出流

notion image
 

Chain中的流输出

notion image
 

高级使用:在chain中使用流式输出json结构

很多时候的实际场景是,我们希望接口输出的是一个json结构,这样在前端应用层面会比较灵活,但是如果是流式输出,很可能因为字符结构没有输出结束会导致json报错,这种情况可以这样处理:
notion image
 
我们看到流的输出总是保持这合法的json结构,从而避免了报错,如果我们期待在这种结构下,可以以流式来取到国家名称该怎么做?是的这里就要在Json输出后,继续处理。
notion image
 
 

不支持流式的组件处理

并不是所有的组件都支持流式输出,比如检索器就不支持,在原生的langchain中,当你给不支持stram的组件调用流接口时,一般不会有打字机效果,而是和使用invoke效果差不多。而当你使用LCEL去调用类似检索器组件的时候,它依然可以搞出来打字机效果,这也是为什么要尽量使用LCEL的原因。我们看个例子:
原生的检索器在这种情况下只会返回最终结果,并没有流的效果:
而使用LCEL调用后,则可以输出中间的过程:
结果:
注意我使用了百川的嵌入模型
notion image
 
 

v0.2的核心特性:流中的事件支持 🚨

🔔
注意:如要使用该特性,你首先要确认自己的langchain_core版本等于0.2
官方给到了一些注意事项:
  • 使用流要尽量使用异步方式编程。
  • 如果你自定义了函数一定要配置callback。
  • 不使用LCEL的话尽量使用.astram来访问LLM。
langchain将流的过程细化,并在每个阶段给了开发者一个事件钩子:
notion image
 

在chatmodel中使用:

🔔
注意:version=v2这个参数表明events事件流依然是一个beta API,后面肯定还有更改,所以商业应用要慎重!该参数只在 langchain-core>=0.2.0作用!
notion image
 

在Chain中的使用:

notion image
 

事件过滤

结合事件以及配置参数,可以很方便的找出你想要的阶段数据
notion image
 
 

回调传播

🔔
如果在工具中使用调用可运行项,则需要将回调传播到可运行项;否则,不会生成任何流事件。
notion image
Loading...

No results found.