管道符号“|”的含义是“或者”,Python解析器在解析时a | b语句时,如果发现两个对象之间存在“|”符号,会先尝试让对象b调用a的__or__方法。所以a | b 等价于 a.__or__(b)。
LangChain通过实现Runable类并重写__or__方法内容,来实现LCEL语法。
以下用一段代码来实现原理
基本原理实现
# 定义一个Runable类
class Runable:
def __init__(self,func):
self.func = func
# 重写__or__方法
def __or__(self,other):
def chained_func(*args,**kwargs):
# # self是a,other是b,这里相当于把a方法的返回结果作为入参传递给了b
return other(self.func(*args,**kwargs))
return Runable(chained_func)
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
# 定义一个x*2的func
def double(x):
return x * 2
# 定义一个x+1的func
def add_one(x):
return x + 1
def format_output(x):
return ">>> {x} <<<".format(x=x)
# 使用Runable对以上函数进行包装
add_one = Runable(add_one)
double = Runable(double)
# 使用Runable对象的__or__方法
# chain = add_one.