文章目录
一、概述
LangChain表达式语言是一种创建任意自定义链的方法。它建立在 Runnable 协议之上。
二、快速开始
这是所有最重要的LCEL图元的快速参考。
1、invoke 一个 runable
from langchain_core.runnables import RunnableLambda
runnable = RunnableLambda(lambda x: str(x))
runnable.invoke(5)
2、batch 一个 runable
from langchain_core.runnables import RunnableLambda
runnable = RunnableLambda(lambda x: str(x))
runnable.batch([7, 8, 9])
3、stream 一个 runable
from langchain_core.runnables import RunnableLambda
def func(x):
for y in x:
yield str(y)
runnable = RunnableLambda(func)
for chunk in runnable.stream(range(5)):
print(chunk)
# Async variant:
# async for chunk in await runnable.astream(range(5)):
# print(chunk)
4、将runables组合起来
langchain 提供一种 Pipe 操作符:|,该操作符 | 的作用是将其前面的 runable 的输出传给后面的 runable 的输入中。
from langchain_core.runnables import RunnableLambda
runnable1 = RunnableLambda(lambda x: {"foo": x})
runnable2 = RunnableLambda(lambda x: [x] * 2)
chain = runnable1 | runnable2
chain.invoke(2)
5、并行调用可运行文件
from langchain_core.runnables import RunnableLambda, RunnableParallel
runnable1 = RunnableLambda(lambda x: {"foo": x})
runnable2 = RunnableLambda(lambda x: [x] * 2)
chain = RunnableParallel(first=runnable1, second=runnable2)
chain.invoke(2)
# 输出为:{'first': {'foo': 2}, 'second': [2, 2]}
6、将任何function转换为可runable
from langchain_core.runnables import RunnableLambda
def func(x):
return x + 5
runnable = RunnableLambda(func)
runnable.invoke(2)
7、合并输入和输出字典
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
runnable1 = RunnableLambda(lambda x: x["foo"] + 7)
chain = RunnablePassthrough.assign(bar=runnable1)
chain.invoke({"foo": 10})
# {'foo': 10, 'bar': 17}
这段代码的含义是:
- 第三行,创建了一个 RunnableLambda 实例,RunnableLambda 是一个可运行的对象,其核心功能是应用一个函数。这里定义的函数是一个 Lambda 函数,接收一个输入 x,并返回 x[“foo”] 的值加 7。
- 第五行,使用 RunnablePassthrough 类的 assign 方法创建了一个新的处理链。RunnablePassthrough 是一个简单的可运行对象,它将输入直接传递给下一个可运行对象。assign 方法将 runnable1 分配给一个新的键 bar,即它会将 runnable1 的输出赋值给 bar。
- 这一行代码调用 chain 处理链,输入参数是一个字典 {“foo”: 10}。处理链执行的步骤如下:
- 首先,RunnablePassthrough 直接传递输入到下一个步骤。
- 接着,runnable1 被调用,runnable1 计算 x[“foo”] + 7,其中 x[“foo”] 为 10,所以结果是 17。
- 最后,结果被赋值给新的键 bar,形成输出 {“foo”: 10, “bar”: 17}。
8、将输入字典包含在输出字典中
from langchain_core.runnables import (
RunnableLambda,
RunnableParallel,
RunnablePassthrough,
)
runnable1 = RunnableLambda(lambda x: x["foo"] + 7)
chain = RunnableParallel(bar=runnable1, baz=RunnablePassthrough())
chain.invoke({"foo": 10})
# {'bar': 17, 'baz': {'foo': 10}}
9、添加默认调用参数
from typing import Optional
from langchain_core.runnables import RunnableLambda
def func(main_arg: dict, other_arg: Optional[str] = None) -> dict:
if other_arg:
return {**main_arg, **{"foo": other_arg}}
return main_arg
runnable1 = RunnableLambda(func)
bound_runnable1 = runnable1.bind(other_arg="bye")
bound_runnable1.invoke({"bar": "hello"})
#{'bar': 'hello', 'foo': 'bye'}