likes
comments
collection
share

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

作者站长头像
站长
· 阅读数 31

开篇

    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)之间如何传递数据的。(这样也更好理解上一篇最后的内容)

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

简单解析

这里主要用到了Python的魔法函数__or__,所以"|"这里对于Python实现还是比较简单的,若大家对此感兴趣,可以持续关注我哈
同时,我们也可以看到LangChain底层也是通过这种“方式”实现的

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

思考题

# LangChain还支持这种形式pipe连接多个Runnable对象,你可以自行实现下:)
my_chain = hello.pipe(welcome).pipe(attach_date)

LangChain的其它相关函数

    Runnable对象支持的函数比较多,如下所示:官网API地址: 

    api.python.langchain.com/en/stable/r…

这里挑比较有代表性的三个给大家介绍,

RunnableLambda

    让我们再回到LangChain中,看看RunnableLambda是怎么用的

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

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)

输出结果

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

分析过程

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

Bind

    以后Tool相关知识的会用到它

    程序&输出结果

AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)

    不加bind(stop...)呈现的效果如下:

期待下篇吧~ ㊗️大家周末愉快

转载自:https://juejin.cn/post/7361976432250486799
评论
请登录