【橘子大模型】Runnable和Chain以及串行和并行

一、Runnable

前面我们实现了一些关于如何和大模型进行交互的操作。那么我们此时来回顾一下我们当前进行的结构。
在这里插入图片描述
我们已经很清楚这些操作的具体含义了,所以我这里就不在多介绍了。我们来看其中的几个点
1、用户那边就是客户,没啥说的。
2、langchain,这个是中间的框架。
3、template,关键就在这里,我们大部分业务编码其实都在这里到目前为止。
我们使用各种template来处理一些业务。

promptTemplate = ChatPromptTemplate([
    ("system", "假如你是一个研究{cityMajor}的专家。"),
    ("human", "介绍一下当前的经济环境。"),
])

prompt = promptTemplate.invoke({
   
   "cityMajor": "山西经济"})
content = llm.invoke(prompt).content
print(f"大模型回答的结果正文是{
     
     content}")

我们构建起来一个模板之后,关键的一步就是执行invoke操作,包括llm也是执行invoke操作。而且除了invoke我们还可以执行stream,batch等操作。
我们先来看一下模板的文档,我们随便找一个,比如说BasePromptTemplate,他作为基类,文档比较全,下面那些子类忽略了一些文档,可能是他们不想重复写吧。
在这里插入图片描述
我们看到他说模板实现了标准的Runnable接口,该接口具有一系列方法,我们来看一下这个Runnable接口。
在这里插入图片描述
许多组件基本都基于这个抽象,我们来看一下这个模板类的文档

class BasePromptTemplate(
    RunnableSerializable[dict, PromptValue], Generic[FormatOutputType], ABC
):

我们看到他是实现了RunnableSerializable这个接口的。而RunnableSerializable的文档如下介绍。

RunnableSerializable implements the standard Runnable Interface. 🏃
他是实现了标准的Runnable接口的,所以这些组件实现了RunnableSerializable基本就是实现了Runnable接口

而Runnable接口是有这些方法的,所以其实我们可以大胆的下一个结论,你能看到的能调这几个方法的基本都是Runnable的实现类。
在这里插入图片描述
所以我们再来看我们的代码:

llm = ChatOllama(
    base_url = "http://127.0.0.1:11434",
    model = "deepseek-r1:8b",
    temperature = 0.5,
    num_predict = -2,
    max_tokens = 250
)

promptTemplate = ChatPromptTemplate([
    ("system", "假如你是一个研究{cityMajor}的专家。"),
    ("human", "介绍一下当前的经济环境。"),
])

prompt = promptTemplate.invoke({
   
   "cityMajor": "山西经济"})
content = llm.invoke(prompt).content
print(f"大模型回答的结果正文是{
     
     content}")

这里面promptTemplate.invoke, llm.invoke 其实promptTemplate和llm都是Runnable了。你去看他的类就知道,他们都是实现了RunnableSerializable的。所以我们的结构图中这部分就是Runnable。
在这里插入图片描述
ok,我们到这里为止,引入了一个概念叫做Runnable。那我们接下来看看这个Runnable

Runnable概念官方文档位于Runnable
我就不一个字一个字的去翻译这个文档了,这是翻译工具的活。我挑其中一段来说一下。

Runnable 方式定义了一个标准接口,允许 Runnable 组件:Invoked,Batched,Streamed等等操作。这些我们也都说过了。
但是他还有一个比较不错的功能,就是组合。
组合:可以使用 LangChain 表达式语言 (LCEL) 组合多个 Runnable 以协同工作,以创建复杂的管道。
这就是我们今天要说的第二个概念,LCEL组合Runnable

1、LCEL组合Runnable

他的功能很强大,而且非常多,具体可以去看文档。我们这里来做个分析操作来改造一下我们前面的代码。
我们说每一个组件现在都可以被我们认为成一个Runnable。其实就是一个任务,作为javaer可以理解为一个方法。
作为方法,必然就有输入(构建参数),输出(返回值)。那么我们多个Runnable也就是多个方法的时候,方法1的输出就可以作为方法2的输入。这种就可以形成一个链路。而LCEL就是做这个的,他可以整合我们的Runnable形成一个链路,然后顺着链路去调用。
我们先看一个没有LCEL的我们咋做的。

1.1常规做法

from langchain_core.prompts import ChatPromptTemplate

promptTemplate = ChatPromptTemplate(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值