一、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(

最低0.47元/天 解锁文章
514

被折叠的 条评论
为什么被折叠?



