LCEL 可以轻松的构建复杂的链,并灵活调用它们,是因为LCEL基于Runnable协议封装了一系列组合方法和调用接口。

之前我们介绍了LCEL的核心调用接口invoke/ainvokestream/astreambatch/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