LangChain系列文章
- LangChain 29 调试Debugging 详细信息verbose
- LangChain 30 ChatGPT LLM将字符串作为输入并返回字符串Chat Model将消息列表作为输入并返回消息
- LangChain 31 模块复用Prompt templates 提示词模板
- LangChain 32 输出解析器Output parsers
- LangChain 33: LangChain表达语言LangChain Expression Language (LCEL)
- LangChain 34: 一站式部署LLMs使用LangServe
- LangChain 35: 安全最佳实践深度防御Security
- LangChain 36 深入理解LangChain 表达式语言优势一 LangChain Expression Language (LCEL)
- LangChain 37 深入理解LangChain 表达式语言二 实现prompt+model+output parser LangChain Expression Language (LCEL)
- LangChain 38 深入理解LangChain 表达式语言三 实现RAG检索增强生成 LangChain Expression Language (LCEL)
- LangChain 39 深入理解LangChain 表达式语言四 为什么要用LCEL LangChain Expression Language (LCEL)
- LangChain 40 实战Langchain访问OpenAI ChatGPT API Account deactivated的另类方法,访问跳板机API
- LangChain 41 深入理解LangChain 表达式语言五 为什么要用LCEL调用大模型LLM LangChain Expression Language (LCEL)
- LangChain 42 深入理解LangChain 表达式语言六 Runtime调用不同大模型LLM LangChain Expression Language (LCEL)
- LangChain 43 深入理解LangChain 表达式语言七 日志和Fallbacks异常备选方案 LangChain Expression Language (LCEL)
- LangChain 44 深入理解LangChain 表达式语言八 Runnable接口输入输出模式 LangChain Expression Language (LCEL)
- LangChain 45 深入理解LangChain 表达式语言九 Runnable 调用、流输出、批量调用、异步处理 LangChain Expression Language (LCEL)
- LangChain 46 深入理解LangChain 表达式语言十 Runnable 调用中间状态调试日志 LangChain Expression Language (LCEL)
1. 并行性
让我们来看看LangChain表达语言如何支持并行请求。例如,当使用RunnableParallel(通常写成字典)时,它会并行执行每个元素。
1.1 先创建一个计算方法耗时的方法
在这个calc_time.py
示例中,time.time()
返回当前时间的时间戳(以秒为单位)。通过在您的代码块执行前后分别记录时间,然后计算这两个时间戳的差值,您可以得到执行耗时。
如果您需要更精确地测量时间(例如,毫秒或微秒级别的精度),您可以使用 time.perf_counter()
,它提供了更高分辨率的时钟:
import time
def measure_execution_time(func, *args, **kwargs):
"""测量并返回给定函数的执行时间。
Args:
func: 要测量的函数对象。
*args: 传递给函数的位置参数。
**kwargs: 传递给函数的关键字参数。
Returns:
tuple: (执行结果, 耗时秒数)
"""
start_time = time.perf_counter()
result = func(*args, **kwargs)
end_time = time.perf_counter()
elapsed_time = end_time - start_time
return result, elapsed_time
# 示例:假设 chain1 已经定义并且具有 invoke 方法
# chain1 = ...
# 使用 measure_execution_time 来测量 chain1.invoke 的执行时间
# result, exec_time = measure_execution_time(chain1.invoke, {"topic": "bears"})
# print(f"执行结果: {result}")
# print(f"函数执行耗时: {exec_time} 秒")
1.2 单独执行和并行执行耗时对比
from langchain_core.runnables import RunnablePassthrough
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
import time
from calc_time import measure_execution_time
from dotenv import load_dotenv
load_dotenv()
from langchain_core.runnables import RunnableParallel
model = ChatOpenAI(model="gpt-3.5-turbo")
chain1 = ChatPromptTemplate.from_template("tell me a joke about {topic}") | model
chain2 = (
ChatPromptTemplate.from_template("write a short (2 line) poem about {topic}")
| model
)
combined = RunnableParallel(joke=chain1, poem=chain2)
# result, exec_time = measure_execution_time(chain1.invoke, {"topic": "bears"})
# print(f"执行结果: {result}")
# print(f"函数执行耗时: {exec_time} 秒")
# result, exec_time = measure_execution_time(chain2.invoke, {"topic": "bears"})
# print(f"执行结果: {result}")
# print(f"函数执行耗时: {exec_time} 秒")
result, exec_time = measure_execution_time(combined.invoke, {"topic": "bears"})
print(f"执行结果: {result}")
print(f"函数执行耗时: {exec_time} 秒")
单独执行的时间
⚡ python LCEL/parallelism.py
执行结果: content="Why don't bears like fast food?\n\nBecause they can't catch it!"
函数执行耗时: 2.450785037013702 秒
执行结果: content="Bears roam wild, majestic and free,\nNature's guardians, in mountains and trees."
函数执行耗时: 1.166965335025452 秒
并行执行的耗时
⚡ python LCEL/parallelism.py 1 ↵
执行结果: {'joke': AIMessage(content="Sure, here's a bear joke for you:\n\nWhy don't bears ever wear shoes?\n\nBecause they have bear feet!"), 'poem': AIMessage(content="In forest's embrace,\nBears roam with gentle grace.")}
函数执行耗时: 2.161218732013367 秒
1.3 批处理上的并行性
并行性可以与其他可运行项结合使用。让我们尝试在批处理中使用并行性。
# result, exec_time = measure_execution_time(chain1.batch, [{"topic": "bears"}, {"topic": "cats"}])
# print(f"执行结果: {result}")
# print(f"函数执行耗时: {exec_time} 秒")
# result, exec_time = measure_execution_time(chain2.batch, [{"topic": "bears"}, {"topic": "cats"}])
# print(f"执行结果: {result}")
# print(f"函数执行耗时: {exec_time} 秒")
result, exec_time = measure_execution_time(combined.batch, [{"topic": "bears"}, {"topic": "cats"}])
print(f"执行结果: {result}")
print(f"函数执行耗时: {exec_time} 秒")
单独执行的时间
⚡ python LCEL/parallelism.py
执行结果: [AIMessage(content="Why don't bears wear shoes?\n\nBecause they have bear feet!"), AIMessage(content="Why don't cats play poker in the wild?\n\nToo many cheetahs!")]
函数执行耗时: 3.1468410239904188 秒
zgpeace@zgpeaces-MacBook-Pro /Users/zgpeace/Workspace/LLM/langchain-llm-app develop
⚡ python LCEL/parallelism.py
执行结果: [AIMessage(content="In the forest's embrace,\nMajestic bears leave their trace."), AIMessage(content='Graceful feline souls, whiskers twitching in the night,\nPurring melodies, bringing comfort and delight.')]
函数执行耗时: 2.1072117580333725 秒
批量处理的时间
CPU times: user 507 ms, sys: 125 ms, total: 632 ms
Wall time: 1.49 s
[{'joke': AIMessage(content="Why don't bears wear shoes?\n\nBecause they already have bear feet!"),
'poem': AIMessage(content="Majestic bears roam,\nNature's wild guardians of home.")},
{'joke': AIMessage(content="Sure, here's a cat joke for you:\n\nWhy did the cat sit on the computer?\n\nBecause it wanted to keep an eye on the mouse!"),
'poem': AIMessage(content='Whiskers twitch, eyes gleam,\nGraceful creatures, feline dream.')}]
代码
https://github.com/zgpeace/pets-name-langchain/tree/develop
参考
https://python.langchain.com/docs/expression_language/why