如何将LCEL从序列执行改为并行执行?
摘要:1. 引言 在 LLM 应用的开发浪潮中,LangChain 框架迅速成为最受欢迎的工具之一。随着应用的主键复杂化,复杂的 RAG、智能体(Agent)、多步骤推理等需求变得普遍,早期的编程范式逐渐显露出了局限性,面向对象的链式构建方式在应
1. 引言
在 LLM 应用的开发浪潮中,LangChain 框架迅速成为最受欢迎的工具之一。随着应用的主键复杂化,复杂的 RAG、智能体(Agent)、多步骤推理等需求变得普遍,早期的编程范式逐渐显露出了局限性,面向对象的链式构建方式在应对这种复杂性时显得非常笨拙和难以维护。所以 LangChain 在 2023 年 8 月推出了 LCEL(LangChain Expression Language, LangChain 表达式语言),进行了范式的升级。
1.1. 从命令式到声明式
在没有 LCEL 之前,构建链的方式很传统,通常依赖于命令式的、面向对象的方式,例如使用 LLMChain 类,开发者需要实例化类,配置参数,然后显式地调用执行方法,就像用基本的积木一块一块地手动拼接。这种方式虽然直观,但在构建复杂应用时会导致代码冗长、逻辑流难以追踪,并且深度定制化相对困难。
LCEL 引入了一种声明式的组合方法,开发者不再需要详细描述“如何”执行每一步,而是通过一种简洁的语法来描述“做什么”——定义数据应该如何在一个组件网络中流动。这种声明式的特性将执行优化的责任交给了 LangChain 框架本身。开发者只需构建一个由 Runnable 对象组成的计算图,框架就能在运行时智能地决定最高效的执行策略。这不仅极大地简化了代码,也为一系列强大的生产级特性奠定了基础。
做个对比吧。
LLMChain 的工作很简单,接受一个输入,使用提示模板(PromptTemplate)格式化输入,然后将格式化后的提示词发送给 LLM,最后返回 LLM 的输出。
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 1. 实例化 LLM 模型
llm = OpenAI(temperature = 0.7)
# 2. 构建提示词模板
prompt = PromptTemplate(
input_variables = ["product"],
template = "What is a good name for a company that makes {product}?",
)
# 3. 构建链,将零件通过参数传入
chain = LLMChain(llm = llm, prompt = prompt)
# 4. 运行链,显示调用 run()
result = chain.run("colorful socks")
print(result)
可以看到有这么几个问题:
很简单的调用 LLM 回答问题,也需要四个步骤,那么对于复杂应用,嵌套和组合多个链会让代码变得很长
业务逻辑流程其实是比较难追踪的。比如 A 链的输出要作为 B 链的输入,就需要手动处理这个传递过程,当这类过程变得复杂,整体结构会变得不清晰。
若要深度定制也会有困难。如果想在链的执行过程中加入一些自定义的逻辑,比如对 LLM 的输出进行清洗之后再传递给下一步,通常就需要创建一个全新的、继承自 LLMChain 的子类,重写它的方法。这就显得很重了。
现在同样的需求,使用 LCEL 写一遍。
# 使用新的模块
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 提示词与 LLM 实例化与之前类似
prompt = PromptTemplate.from_template(
"What is a good name for a company that makes {product}?"
)
llm = ChatOpentAI(temperature = 0.7)
# 使用 | 操作符声明式组合链
# 含义:创建一个流程,数据先流向 prompt 模板进行格式化,然后其结果自动流向 llm 模型进行调用
chain = prompt | llm
# 使用统一的 invoke 方法执行
result = chain.invoke({"product": "colorful socks"})
print(result.content)
代码看起来真的清爽很多。
重点在 | 操作符,意味着『将左边组件的输出,作为右边组件的输入』。
以及 LCEL 链有一个统一的接口 .invoke() 进行执行。
