并发是LLM应用常见的使用场景,LCEL提供了非常简便的方式来实现并发处理。

本篇我们就来学习LCEL这一核心特性——batch/abatch。

1. LCEL并发接口-batch/abatch

(1)接口介绍

batch和abatch是两个非常实用的接口,它们允许并发处理多个用户输入,从而提高程序的执行效率。

  • batch: 开发LLM应用时,有可能需要同时处理多个用户输入(如:多个提示词),batch内部通过线程池并行处理多个用户输入(每个线程都是在调用上一篇介绍的invoke接口),最终汇总结果。
  • abatch: batch的非阻塞接口。

(2)接口语法

batch/abatch是LCEL在Runnable协议中定义的标准接口,LangChain的组件和链(Runnable对象)可以直接调用该方法。

以链chain为例:

  • chain.batch([“input1”, “input2”, …])

  • await chain.abatch([“input1”, “input2”, …])

2.快速上手

以利用LLM做试题解析为例,用batch/abatch功能来批量处理多个试题。

  • 构造任务链
  • 使用batch方法处理
  • 使用abatch方法处理

STEP1: 构造任务链

任务链的构造方法不再赘述,见下面代码。

  • 链的任务是判断题目是否正确。
  • 设置列表变量topics,存放3个题目。

STEP2: 使用batch方法处理

  • 调用语法:chain.batch(topics)
  • 执行效果:任务启动后,马上得到答案,没有因为问题多导致过多等待。

STEP3: 使用abatch方法处理

  • 调用语法:await.chain.abatch(topics)
  • 执行效果:任务启动后,马上得到答案。

3.Batch vs Invoke

看到这里,我们再来回顾一下本文的batch和前文的invoke的区别:

  • batch不仅实现了批量处理多个输入,而且是多线程并行调用LLM,很好的提升了处理效率。
  • invoke更适合需要串行执行。

具体看前文的例子,我们发现耗时的差别如下:

  • 使用invoke处理单个题目,耗时1.13s
  • 使用batch处理3个题目,耗时1.3s

4.小结

Batch/abatch 是LCEL中用于实现并发请求的重要工具,也为开发人员带来高效、简洁的编程体验。

本文关键要点如下:

  • LCEL并发接口-batch/abatch

    • 输入为列表,内部实际是使用线程池执行器并行执行invoke()。
    • LangChain的Runnable对象可以直接调用batch/abatch方法。
  • 实例演示

    • 以让LLM来批改试卷为例,演示batch/abatch语法。

参考文档:翻译的LangChain官方文档

  • 翻译链接:https://jherculesqz.gitbook.io/langchain-guan-fang-wen-dang