并发是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