AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)
开篇
EL简单实现,原理初探
AI菜鸟向前飞 — LangChain系列之六 - 深入浅出LCEL与Chain(上篇)
上一篇文档给大家介绍的Expression Language 特别提到了,
每个运行对象(即:Runnable)通过"|"(管道)连接组成了Chain,可以通过更快速书写且更易读的方式带来了很好的体验效果,在文章中的最后,我给大家展示了每一个Runnable对象的输入/输出Schema,可能有些小伙伴还是有点懵,这样我通过一个简单的实例,自己来实现一个Pipeline
程序实现
class MyPipeline:
def __init__(self, func):
self.func = func
def __or__(self, otherfunc):
def _func(*args, **kwargs):
return otherfunc(self.func(*args, **kwargs))
return MyPipeline(_func)
def __call__(self, *args, **kwargs) :
return self.func(*args, **kwargs)
def invoke(self, *args, **kwargs):
return self.__call__(*args, **kwargs)
再准备一下
def hello(name) -> str:
return f"hello,{name}。"
def welcome(greeting) -> str:
return f"欢迎来到我的公众号, {greeting}"
def attach_date(mstr) -> str:
return f"{mstr} 现在是{datetime.now().strftime("%Y-%m-%d")}。"
# 为什么这里要写这么麻烦,后面介绍RunnableLambda你就懂了
hello = MyPipeline(hello)
welcome = MyPipeline(welcome)
attach_date = MyPipeline(attach_date)
试出效果
# my_chain = mychain = hello.__or__(welcome).__or__(attach_date)
my_chain = hello | welcome | attach_date
print(test.invoke("Song榆钱儿"))
输出结果
- 1
欢迎来到我的公众号, hello,Song榆钱儿。现在是2024-04-26。
分析过程
以图代言 —— 可以直接看懂通过管道(“|”)让可运行对象(Runnable)之间如何传递数据的。(这样也更好理解上一篇最后的内容)
简单解析
这里主要用到了Python的魔法函数__or__,所以"|"这里对于Python实现还是比较简单的,若大家对此感兴趣,可以持续关注我哈
同时,我们也可以看到LangChain底层也是通过这种“方式”实现的
思考题
# LangChain还支持这种形式pipe连接多个Runnable对象,你可以自行实现下:)
my_chain = hello.pipe(welcome).pipe(attach_date)
LangChain的其它相关函数
Runnable对象支持的函数比较多,如下所示:官网API地址:
api.python.langchain.com/en/stable/r…
这里挑比较有代表性的三个给大家介绍,
RunnableLambda
让我们再回到LangChain中,看看RunnableLambda是怎么用的
RunnableLambda能将普通函数转换为Runnable对象,并使用EL(Expression Language)语法
with_fallbacks
程序
from langchain_openai import ChatOpenAI
from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template("{text}")
# 我的OpenAI Key已经过期,调用它肯定报错
model_openai = ChatOpenAI()
# 使用我本地启动的Ollama llama3大语言模型,肯定没问题
model = ChatOllama(model="llama3", temperature=0)
output_parser = StrOutputParser()
chain = prompt | model_openai.with_fallbacks([model]) | output_parser
response = chain.invoke({"text": "你好啊, AI小助手"})
print(response)
输出结果
分析过程
Bind
以后Tool相关知识的会用到它
程序&输出结果
不加bind(stop...)呈现的效果如下:
期待下篇吧~ ㊗️大家周末愉快
转载自:https://juejin.cn/post/7361976432250486799