国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

2021-10-10 20:36:49

Android Root權限

2018-08-10 05:06:03

提速降費營運商漫游

2023-06-16 14:10:00

TCPUDP網絡通信

2022-05-06 09:21:21

TypeScriptinterfacetype

2024-04-07 08:23:01

JS隔離JavaScript

2011-06-14 12:56:55

SQL Server復災

2022-04-07 08:20:22

typeinterface前端

2022-11-28 07:10:57

2022-06-07 08:14:35

PGPAGETUPLE

2024-12-19 08:00:00

人工智能LLMLangChain

2024-03-05 18:19:07

localhostLinux數據庫

2022-01-06 07:59:32

WebGPUOpenGL引擎

2022-06-06 07:58:52

勒索軟件惡意軟件解密

2022-03-08 15:01:48

負載均衡IP服務器

2023-10-27 07:39:44

IOC容器Spring

2020-10-25 08:45:38

IPv6網絡協議網絡

2022-08-15 07:24:41

WindowsDLL鍵盤

2024-08-12 12:30:27

點贊
收藏

51CTO技術棧公眾號

菠萝菠萝蜜在线观看| 美女欧美视频在线观看免费 | 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 亚洲高清在线免费观看| 亚洲欧美日韩视频二区| 久久久久亚洲精品成人网小说| 欧美精品中文| 亚洲国产精华液| 亚洲香蕉伊在人在线观| 男人的天堂在线免费视频| 自拍视频在线观看一区二区| 国产精品免费在线| 亚洲国产一区二区在线观看| 一本色道久久精品| 精品欧美一区二区在线观看 | 超碰国产在线| 亚洲人永久免费| 精品国产一区二区三区小蝌蚪| 日韩精品在线电影| av资源一区二区| 亚洲福利电影| 国产欧美久久久久久久久| 国内一区二区在线| 亚洲一区bb| 国产伦精品一区二区三区在线观看| 亚洲欧洲日本国产| 国产99久久久国产精品免费看 | 中文字幕一区二区三区四区五区| 亚洲一区欧美激情| 日韩精品最新在线观看| 美女一区二区视频| 福利视频免费在线观看| 懂色av噜噜一区二区三区av| 欧美女人性生活视频| 久久精品在线观看| 蜜桃视频中文字幕| 亚洲一区二区免费视频| 国产精品h片在线播放| 深夜激情久久| 45www国产精品网站| 国产精品传媒精东影业在线| 久久99精品久久久久子伦| 久久99精品久久久久婷婷| 国产极品在线视频| 亚洲一区二区偷拍精品| 成人区精品一区二区不卡| 亚洲四色影视在线观看| 国产一区调教| 亚洲一区二区自拍| 日本亚洲欧美天堂免费| 91精品婷婷国产综合久久性色| free性m.freesex欧美| 精品久久久av| 日韩情爱电影在线观看| 亚洲不卡1区| 国产精品毛片a∨一区二区三区| 欧美孕妇孕交| 亚洲欧美日韩国产精品| 亚洲第一福利专区| 美女一区视频| 久久嫩草精品久久久精品| 欧美一级电影久久| 欧美久久综合网| 手机看片福利永久国产日韩| 99国产精品久久久久久久久久久| caoporen人人| 日韩欧美久久久| 91精品久久久久久综合五月天| 91精品综合久久| 国产精品888| 在线观看你懂得| 亚洲天堂视频在线观看| 日本久久久久久久久久久久| 91久久精品国产91久久| 免费成人在线视频观看| 男女羞羞网站| 亚洲国产精品久久91精品| 国产精品一区二区三区美女| 久草精品电影| 国产精品久久久久久一区二区三区| 成人免费在线电影| 欧美高清在线观看| 日韩av电影天堂| 国产精品三级a三级三级午夜| 制服丝袜亚洲色图| 久久久999免费视频| 亚洲高清免费视频| www.日韩| 91九色极品视频| 国产亚洲精品aa午夜观看| 神马午夜伦理不卡| 国产精品久久色| 99久久精品国产观看| 婷婷成人激情| 国产日韩亚洲欧美| 国产精品视频一二三区| 98色花堂精品视频在线观看| 91亚洲精品在线观看| 欧美最新精品| 国产chinese精品一区二区| 久久久久九九视频| 3344国产永久在线观看视频| 成人网在线免费看| 国产精品久线观看视频| av免费在线一区| 日产精品高清视频免费| 色妹子一区二区| 成人精品影视| 亚洲jjzzjjzz在线观看| 在线一区二区日韩| 风间由美一区| 国产精品99导航| 国产精品国产三级国产aⅴ入口| 在线免费三级电影网站| 欧洲一区二区日韩在线视频观看免费 | 日韩av在线中文| 伊人久久综合97精品| 人人爽香蕉精品| 欧美激情二区| 国产一区二区不卡视频在线观看| www.久久东京| dy888午夜| 欧美一区二区日韩| 亚洲一区日本| 91在线网址| 国产精品成人观看视频免费| 欧美日韩国产丝袜美女| 日韩一区三区| 日本在线丨区| 亚洲字幕在线观看| 在线观看精品一区| 国产精品国码视频| 午夜精品一区| 欧美在线视频日韩| 青青草91久久久久久久久| 国外av网站| 国产精品一区二区女厕厕| 亚洲精品中文在线| 亚洲影院天堂中文av色| 国产网红在线| 成人黄色生活片| 欧美亚洲综合另类| 国产日韩欧美一区| 九七电影韩国女主播在线观看| 丁香五月网久久综合| 久久精品影视| 天堂аⅴ在线最新版在线 | 日韩黄色三级| 色婷婷综合久久久久中文字幕| 欧美激情二区三区| 亚洲图片欧美色图| 久久精品国内一区二区三区水蜜桃| 日本大片在线观看| 99re在线视频观看| 精品日韩一区二区三区| 电影k8一区二区三区久久| 久久99影院| 亚洲欧美在线一区| 久久久精品一品道一区| 精品国产一级毛片| porn视频在线观看| 国产美女视频免费| 欧美高清第一页| 午夜伊人狠狠久久| 日韩有码一区二区三区| 日日狠狠久久| 国产对白在线正在播放| 久久99精品久久久久久水蜜桃| 亚洲欧美中文日韩在线v日本| 欧美momandson| 国产精品videossex国产高清| 九九热精品视频| 欧美日韩免费观看中文| 免费人成网站在线观看欧美高清| 精品久久久久久久久久岛国gif| 在线观看理论片| 国产911在线观看| 日本欧美一级片| 日韩一卡二卡三卡国产欧美| 成人国产精品视频| 成人av二区| 91九色在线播放| 在线视频日韩精品| **性色生活片久久毛片| 亚洲视频综合| 日韩成人综合网站| 欧美色综合一区二区三区| 正在播放一区二区三区| 992tv成人免费视频| 在线播放91灌醉迷j高跟美女| 久久嫩草精品久久久精品一| 亚洲高清成人| 久久影院一区二区三区| 午夜激情在线观看| 日本成人中文字幕在线| 麻豆av福利av久久av| 97视频在线看| 亚洲精品一区av在线播放| 国产精品字幕| 成人在线视频成人|