成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LangChain的LCEL和Runnable你搞懂了嗎

人工智能
本篇主要聊了LangChain的LCEL表達式,以及LangChain鏈的原理,以及常用的幾個Runnable的定義和應用場景。

LangChain的LCEL估計行業內的朋友都聽過,但是LCEL里的RunnablePassthrough、RunnableParallel、RunnableBranch、RunnableLambda又是什么意思?什么場景下用?

一、LCEL的定義和原理

LangChain的核心是Chain,即對多個組件的一系列調用。

LCEL是LangChain 定義的表達式語言,是一種更加高效簡潔的調用一系列組件的方式。

LCEL使用方式就是:以一堆管道符("|")串聯所有實現了Runnable接口的組件。

比如這樣:

prompt_tpl = ChatPromptTemplate.from_messages(
    [
        ("system", "{parser_instructions}"),
        ("human", "列出{cityName}的{viewPointNum}個著名景點。"),
    ]
)

output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()

model = ChatOpenAI(model="gpt-3.5-turbo")

chain = prompt_tpl | model | output_parser

response = chain.invoke(
    {"cityName": "南京", "viewPointNum": 3, "parser_instructions": parser_instructions}
)

所以LangChain為了讓組件能以LCEL的方式快速簡潔的被調用,計劃將所有組件都實現Runnable接口。比如我們常用的PromptTemplate 、LLMChain 、StructuredOutputParser 等等。

管道符("|")在Python里就類似or運算(或運算),比如A|B,就是A.or(B)。

那對應到LangChain的Runnable接口里,這個or運算是怎么實現的呢?一起看到源碼:

LangChain通過or將所有的Runnable串聯起來,在通過invoke去一個個執行,上一個組件的輸出,作為下一個組件的輸入。

LangChain這風格怎么有點像神經網絡呀,不得不說,這個世界到處都是相似的草臺班子。嗨!

總結起來講就是:LangChain的每個組件都實現了Runnable,通過LCEL方式,將多個組件串聯到一起,最后一個個執行每個組件的invoke方法。上一個組件的輸出是下一個組件的輸入。

二、Runnable的含義和應用場景

1.RunnablePassthrough

① 定義

RunnablePassthrough 主要用在鏈中傳遞數據。RunnablePassthrough一般用在鏈的第一個位置,用于接收用戶的輸入。如果處在中間位置,則用于接收上一步的輸出。

② 應用場景

比如,依舊使用上面的例子,接受用戶輸入的城市,如果輸入城市是南京,則替換成北京,其余不變。代碼如下。此處的{}和RunnablePassthrough.assign()是同一個語義。

chain = (
    {
        "cityName": lambda x: '北京' if x["cityName"] == '南京' else x["cityName"],
        "viewPointNum": lambda x: x["viewPointNum"],
        "parser_instructions": lambda x: x["parser_instructions"],
    }
    | prompt_tpl
    | model
    | output_parser
)

2.RunnableParallel

① 定義

RunnableParallel看名字里的Parallel就猜到一二,用于并行執行多個組件。通過RunnableParallel,可以實現部分組件或所有組件并發執行的需求。

② 應用場景

比如,同時要執行兩個任務,一個列出城市著名景點,一個列出城市著名書籍。

prompt_tpl_1 = ChatPromptTemplate.from_messages(
    [
        ("system", "{parser_instructions}"),
        ("human", "列出{cityName}的{viewPointNum}個著名景點。"),
    ]
)
prompt_tpl_2 = ChatPromptTemplate.from_messages(
    [
        ("system", "{parser_instructions}"),
        ("human", "列出關于{cityName}歷史的{viewPointNum}個著名書籍。"),
    ]
)

output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()

model = ChatOpenAI(model="gpt-3.5-turbo")

chain_1 = prompt_tpl_1 | model | output_parser
chain_2 = prompt_tpl_2 | model | output_parser
chain_parallel = RunnableParallel(view_point=chain_1, book=chain_2)

response = chain_parallel.invoke(
    {"cityName": "南京", "viewPointNum": 3, "parser_instructions": parser_instructions}
)

3.RunnableBranch

① 定義

RunnableBranch主要用于多分支子鏈的場景,為鏈的調用提供了路由功能,這個有點類似于LangChain的路由鏈。我們可以創建多個子鏈,然后根據條件選擇執行某一個子鏈。

② 應用場景

比如,有多個回答問題的鏈,先根據問題找到分類,然后在使用具體的鏈回答問題。

model = ChatOpenAI(model="gpt-3.5-turbo")
output_parser = StrOutputParser()

# 準備2條目的鏈:一條物理鏈,一條數學鏈
# 1. 物理鏈
physics_template = """
你是一位物理學家,擅長回答物理相關的問題,當你不知道問題的答案時,你就回答不知道。
具體問題如下:
{input}
"""
physics_chain = PromptTemplate.from_template(physics_template) | model | output_parser

# 2. 數學鏈
math_template = """
你是一個數學家,擅長回答數學相關的問題,當你不知道問題的答案時,你就回答不知道。
具體問題如下:
{input}
"""
math_chain = PromptTemplate.from_template(math_template) | model | output_parser

# 4. 其他鏈
other_template = """
你是一個AI助手,你會回答一下問題。
具體問題如下:
{input}
"""
other_chain = PromptTemplate.from_template(other_template) | model | output_parser


classify_prompt_template = """
請你對以下問題進行分類,將問題分類為"數學"、"物理"、"其它",不需要返回多個分類,返回一個即可。
具體問題如下:
{input}

分類結果:
"""
classify_chain = PromptTemplate.from_template(classify_prompt_template) | model | output_parser

answer_chain = RunnableBranch(
    (lambda x: "數學" in x["topic"], math_chain),
    (lambda x: "物理" in x["topic"], physics_chain),
    other_chain
)

final_chain =  {"topic": classify_chain, "input": itemgetter("input")} | RunnableLambda(print_info) | answer_chain
# final_chain.invoke({"input":"地球的半徑是多少?"})
final_chain.invoke({"input":"對y=x求導的結果是多少?"})

4.RunnableLambda

① 定義

要說牛批還得是RunnableLambda,它可以將Python 函數轉換為 Runnable對象。這種轉換使得任何函數都可以被看作 LCEL 鏈的一部分,我們把自己需要的功能通過自定義函數 + RunnableLambda的方式包裝一下,集成到 LCEL 鏈中,這樣算是可以跟任何外部系統打通了。

② 應用場景

比如,在執行過程中,想在中間插入一段自定義功能(如 打印日志 等),可以通過自定義函數 + RunnableLambda的方式實現。

def print_info(info: str):
    print(f"info: {info}")
    return info

prompt_tpl_1 = ChatPromptTemplate.from_messages(
    [
        ("system", "{parser_instructions}"),
        ("human", "列出{cityName}的{viewPointNum}個著名景點。"),
    ]
)

output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()

model = ChatOpenAI(model="gpt-3.5-turbo")

chain_1 = prompt_tpl_1 | model | RunnableLambda(print_info) | output_parser


response = chain_1.invoke(
    {"cityName": "南京", "viewPointNum": 3, "parser_instructions": parser_instructions}
)

三、總結

本篇主要聊了LangChain的LCEL表達式,以及LangChain鏈的原理,以及常用的幾個Runnable的定義和應用場景,希望對你有幫助。

責任編輯:趙寧寧 來源: 程序員半支煙
相關推薦

2018-10-20 16:05:12

iOSAPP開發

2019-08-28 08:57:05

2022-05-06 09:21:21

TypeScriptinterfacetype

2021-10-10 20:36:49

Android Root權限

2018-08-10 05:06:03

提速降費營運商漫游

2024-04-07 08:23:01

JS隔離JavaScript

2023-06-16 14:10:00

TCPUDP網絡通信

2022-04-07 08:20:22

typeinterface前端

2024-12-19 08:00:00

人工智能LLMLangChain

2011-06-14 12:56:55

SQL Server復災

2024-03-05 18:19:07

localhostLinux數據庫

2022-11-28 07:10:57

2022-06-07 08:14:35

PGPAGETUPLE

2022-06-06 07:58:52

勒索軟件惡意軟件解密

2022-01-06 07:59:32

WebGPUOpenGL引擎

2023-12-26 08:12:14

LCEL語法異步

2022-07-27 08:01:29

CMS垃圾回收器

2020-10-25 08:45:38

IPv6網絡協議網絡

2022-08-15 07:24:41

WindowsDLL鍵盤

2024-08-12 12:30:27

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产福利视频在线观看 | 国产精品久久久久久久岛一牛影视 | 国产精品123区 | 成人在线一区二区三区 | 四虎影院在线播放 | 日韩高清一区二区 | 国产欧美在线 | 精品视频一区二区三区四区 | 久久99精品视频 | 狠狠色网 | 久久久久一区二区三区四区 | 国产成人av一区二区三区 | 久久精品国产一区二区电影 | 欧美在线视频不卡 | 亚洲永久字幕 | 超碰电影| 国产精品成人国产乱一区 | 自拍偷拍亚洲欧美 | 日韩电影一区二区三区 | 国产成人精品av | 欧美一区二区三区久久精品 | 99re国产| 女人精96xxx免费网站p | 天天天久久久 | 国产1区 | 国产精品久久久久久久久久三级 | 精品久久久久久久 | 高清亚洲 | 亚洲一级黄色 | 草久视频 | 国产91亚洲精品 | 中文字幕二区 | 成人免费视频观看 | 在线视频亚洲 | 亚洲人成人一区二区在线观看 | 天天草天天干 | 五月天国产 | 久久精品99 | 四虎永久影院 | 亚洲不卡在线观看 | 一本一道久久a久久精品蜜桃 |