LCEL 可以轻松的构建复杂的链,并灵活调用它们,是因为LCEL基于Runnable
协议封装了一系列组合方法和调用接口。
之前我们介绍了LCEL的核心调用接口invoke/ainvoke
、stream/astream
、batch/abatch
,本篇开始我们来学习LCEL的组合方法。
1. LCEL的组合原语
LCEL的主要组合原语有两种:**RunnableSequence(串行组合)**和 RunnableParallel( 并行组合)。
(1)RunnableSequence: 串行组合
方法简介:
RunnableSequence可以将多个链组成一个串行工作流,各链串行执行。
每个链的输出是下个链的输入,最后一个链的输出就是该整个工作流的输出。
组合语法:
RunnableSequence的原始调用语法如下:
1
RunnableSequence对象 = RunnableSequence(first=组件1, middle=[组件2, 组件3, ...], last=组件n)
RunnableSequence在构建串行工作流的示例如下:
1
串行工作流对象 = RunnableSequence(first=chain1, middle=[chain2, chain3, ...], last=chainn)
LCEL实现了用管道符
|
来做串行组合的连接符。我们之前的案例都是在用这种方式来做串行组合。1
串行工作流对象 = chain1 | chain2 | ... | chainn)
(2)RunnableParallel: 并行组合
方法简介:
- RunnableParallel可以把多个链组成并行工作流,各链并行执行。
- 各链的输入是相同的,整个工作流的输出是用各链的输出构造的字典。
组合语法:
RunnableParallel的调用语法如下:
1
RunnableParallel对象 = RunnableParallel({"Key1": 组件1, "Key2": 组件2, ..., "Keyn": 组件n})
由于
Runnable
支持类型转换,所以也可以这样调用:1
RunnableParallel对象 = RunnableParallel(Key1=组件1, Key2=组件2, ..., Keyn=组件n)
RunnableParallel的输出是字典格式,是由原键+组件执行结果组成的键值对,示例如下
1
{'Key1': 组件1的结果, 'Key2': 组件2的结果, ..., 'Keyn': 组件n的结果}
RunnableParallel构建工作流的示例如下:
1
并行工作流对象 = RunnableParallel({"Key1": chain1, "Key2": chain2, ..., "Keyn": chainn})
(3)RunnableSequence和RunnableParallel的组合使用
遵循LCEL Runnable
协议的组件都可以使用上述两种方式组合。同时,由于组合成的链也是一个Runnable对象,这就意味着在一个链里可以混合使用RunnableSequence和RunnableParallel两种组合方式,进而实现了串并结合的工作流。
2.快速上手
下面通过一个实例来看下RunnableSequence和RunnableParallel的用法。
示例场景:利用LLM做病情摘要,然后提供治疗建议,最后把结果翻译成英文和日语。
我们用4个链实现上述功能,然后用RunnableSequence和RunnableParallel组合成完整工作流。
STEP1: 构建chain1:病情简介
- 引入相关类库,构建第一个链chain1,任务是根据疾病标题和患者年龄生成病情简介。
- 先执行chain1观察下输出结果,输出内容符合预期。
STEP2: 构建chain2:治疗方案
- 构建第二个链chain2,任务是根据病情简介生成治疗方案。
- 执行chain2观察输出结果,LLM给出了治疗方案。
STEP3:构建Chain3、Chain4:文本翻译
- 构建Chain3、Chain4,任务是把指定的文本内容分别翻译成英文、日语
STEP4: 构建工作流链medical_chain:组合chain1~chain4
基于上面4个任务链,工作流设计为:首先生成病情简介,然后根据病情生成治疗方案,最后把治疗方案同时翻译成英语、日语。
因此,工作流链medical_chain组合如下:
- chain1、chain2与后面的翻译链(chain3、chain4)是串行组合
- chain3、chain4使用RunnableParallel组合,把chain2的输出作为输入,并行执行
- 执行medical_chain观察结果,得到了英语和日语的治疗方案。
3.小结
本篇介绍了LCEL的两种主要的组合原语:**RunnableSequence(串行组合)**和 RunnableParallel( 并行组合)。
关键要点如下:
RunnableSequence
- 可以将多个链组成一个串行工作流,各链串行执行。支持用管道符
|
组合。 - 每个链的输出是下个链的输入,最后一个链的输出就是该整个工作流的输出。
- 可以将多个链组成一个串行工作流,各链串行执行。支持用管道符
RunnableParallel
- 可以把多个链组成并行工作流,各链并行执行。
- 各链的输入是相同的,整个工作流的输出是用各链的输出构造的字典。
实例演示
- 用RunnableSequence和RunnableParallel构建了一个诊疗工作流。
参考文档:翻译的LangChain官方文档
- 翻译链接:https://jherculesqz.gitbook.io/langchain-guan-fang-wen-dang