AI菜鸟向前飞 — LangChain系列之七 - 深入浅出

开篇

EL简单实现,原理初探

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

上一篇文档给大家介绍的Expression Language 特别提到了,


每个运行对象(即:Runnable)通过"|"(管道)连接组成了Chain,可以通过更快速书写且更易读的方式带来了很好的体验效果,在文章中的最后,我给大家展示了每一个Runnable对象的输入/输出Schema,可能有些小伙伴还是有点懵,这样我通过一个简单的实例,自己来实现一个`Pipeline`

程序实现

1
2
3
4
5
6
7
8
9
10
11
12
13
ruby复制代码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)
再准备一下
1
2
3
4
5
6
7
8
9
10
11
12
13
python复制代码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)

试出效果

1
2
3
scss复制代码# my_chain = mychain = hello.__or__(welcome).__or__(attach_date)
my_chain = hello | welcome | attach_date
print(test.invoke("Song榆钱儿"))

输出结果

  • 1
1
复制代码欢迎来到我的公众号, hello,Song榆钱儿。现在是2024-04-26。

分析过程

以图代言 —— 可以直接看懂通过管道(“|”)让可运行对象(Runnable)之间如何传递数据的。(这样也更好理解上一篇最后的内容)

图片

简单解析

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

图片

1
复制代码

图片

思考题

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

LangChain的其它相关函数

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


[api.python.langchain.com/en/stable/r…](https://api.python.langchain.com/en/stable/runnables/langchain_core.runnables.base.Runnable.html#langchain_core.runnables.base.Runnable)

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

RunnableLambda

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

图片

RunnableLambda能将普通函数转换为Runnable对象,并使用EL(Expression Language)语法

with_fallbacks

程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ini复制代码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...)呈现的效果如下:

图片

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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%