自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LangChain應(yīng)用開發(fā)指南——熟用LCEL語(yǔ)法掌握Chain的精髓

開發(fā) 前端
在本文中,我們介紹了如何使用LangChain的LECL語(yǔ)法。我們介紹了LECL的基本語(yǔ)法以及基于LECL的流、異步等多種用法,并對(duì)比了不適用LECL語(yǔ)法開發(fā)的情況。

引言

LangChain的核心概念是Chain,它是一種由多個(gè)流程構(gòu)件組成的有向圖,可以對(duì)輸入的文本進(jìn)行各種轉(zhuǎn)換和處理,輸出你想要的結(jié)果。LangChain提供了一種專門的表達(dá)式語(yǔ)言,叫做LCEL(LangChain Expression Language),它可以讓你用簡(jiǎn)潔和靈活的語(yǔ)法來(lái)定義和操作Chain,無(wú)需編寫復(fù)雜的代碼。

今天我將帶領(lǐng)大家使用LCEL語(yǔ)法來(lái)構(gòu)建和組合Chain,實(shí)現(xiàn)強(qiáng)大的LLM應(yīng)用。

LCEL語(yǔ)法基礎(chǔ)

LCEL是一個(gè)用于構(gòu)建復(fù)雜鏈?zhǔn)浇M件的語(yǔ)言,它支持流式處理、并行化、日志記錄等功能。LCEL的基本語(yǔ)法規(guī)則是使用|符號(hào)將不同的組件連接起來(lái),形成一個(gè)鏈?zhǔn)浇Y(jié)構(gòu)。|符號(hào)類似于Unix的管道操作符,它將一個(gè)組件的輸出作為下一個(gè)組件的輸入,從而實(shí)現(xiàn)數(shù)據(jù)的傳遞和處理。

LCEL的語(yǔ)法非常簡(jiǎn)潔和靈活,它可以用于各種場(chǎng)景和任務(wù)。例如,我們可以使用LCEL來(lái)實(shí)現(xiàn)以下功能:

  • 生成一個(gè)關(guān)于某個(gè)主題的笑話:我們可以將一個(gè)提示模板和一個(gè)語(yǔ)言模型組合起來(lái),形成一個(gè)鏈?zhǔn)浇Y(jié)構(gòu),如下所示:
prompt = BasePromptTemplate("tell me a short joke about {topic}")
model = ChatModel()
output_parser = StrOutputParser()
joke = ({"topic": RunnablePassthrough()} | prompt | model | output_parser)

這個(gè)鏈?zhǔn)浇Y(jié)構(gòu)的作用是,首先根據(jù)用戶輸入的主題,生成一個(gè)提示,然后將提示傳遞給語(yǔ)言模型,讓它生成一個(gè)笑話,最后將笑話轉(zhuǎn)換為字符串,返回給用戶。我們可以用以下代碼來(lái)測(cè)試這個(gè)鏈?zhǔn)浇Y(jié)構(gòu):

joke.invoke("ice cream")
# > "Why did the ice cream go to therapy? \n\nBecause it had too many toppings and couldn't find its cone-fidence!"

通過(guò)以上案例,我們能夠了解如何使用LCEL語(yǔ)言構(gòu)建一個(gè)生成笑話的鏈?zhǔn)浇Y(jié)構(gòu)。我將為您解釋其中的每一步:

圖片

  • 首先,我們傳入用戶想要的主題,例如 "ice cream",作為輸入。
  • 通過(guò){"topic": RunnablePassthrough()},將輸入轉(zhuǎn)化為字典類型{"topic": "ice cream"}
  • 然后,我們使用提示模板組件,根據(jù)用戶輸入的主題,生成一個(gè)提示,例如"tell me a short joke about ice cream",并將其封裝為一個(gè)PromptValue類型的對(duì)象。這個(gè)對(duì)象可以適用于不同類型的語(yǔ)言模型,因?yàn)樗梢陨勺址蛳⑿蛄小?/li>
  • 接著,我們使用大語(yǔ)言模型,會(huì)根據(jù)提示模板生成的提示,生成一段文本,例如"Why did the ice cream go to therapy?\nBecause it had too many toppings and couldn't cone-trol itself!",并將其封裝為一個(gè)ChatMessage類型的對(duì)象。這個(gè)對(duì)象包含了生成者、內(nèi)容和時(shí)間等信息。
  • 最后,我們使用輸出解析器組件,根據(jù)用戶的需求,將語(yǔ)言模型生成的文本轉(zhuǎn)換為不同的格式或類型,例如字符串。這樣,用戶就可以方便地獲取和使用生成的內(nèi)容。

為什么要用LCEL?

LCEL語(yǔ)法的核心思想是:一切皆為對(duì)象,一切皆為鏈。這意味著,LCEL語(yǔ)法中的每一個(gè)對(duì)象都實(shí)現(xiàn)了一個(gè)統(tǒng)一的接口:Runnable,它定義了一系列的調(diào)用方法(invoke, batch, stream, ainvoke, …)。這樣,你可以用同樣的方式調(diào)用不同類型的對(duì)象,無(wú)論它們是模型、函數(shù)、數(shù)據(jù)、配置、條件、邏輯等等。而且,你可以將多個(gè)對(duì)象鏈接起來(lái),形成一個(gè)鏈?zhǔn)浇Y(jié)構(gòu),這個(gè)結(jié)構(gòu)本身也是一個(gè)對(duì)象,也可以被調(diào)用。這樣,你可以將復(fù)雜的功能分解成簡(jiǎn)單的組件,然后用LCEL語(yǔ)法將它們組合起來(lái),形成一個(gè)完整的應(yīng)用。

LCEL語(yǔ)法還提供了一些組合原語(yǔ),讓你可以更靈活地控制鏈?zhǔn)浇Y(jié)構(gòu)的行為,例如:

  • 并行化:你可以使用parallel原語(yǔ)將多個(gè)對(duì)象并行執(zhí)行,提高效率和性能。
  • 回退:你可以使用fallback原語(yǔ)為某個(gè)對(duì)象指定一個(gè)備選對(duì)象,當(dāng)主對(duì)象執(zhí)行失敗時(shí),自動(dòng)切換到備選對(duì)象,保證應(yīng)用的可用性和穩(wěn)定性。
  • 動(dòng)態(tài)配置:你可以使用config原語(yǔ)為某個(gè)對(duì)象指定一個(gè)配置對(duì)象,根據(jù)運(yùn)行時(shí)的輸入或條件,動(dòng)態(tài)地修改對(duì)象的參數(shù)或?qū)傩裕黾討?yīng)用的靈活性和適應(yīng)性。

LCEL語(yǔ)法的優(yōu)勢(shì)

為了更好地理解LCEL語(yǔ)法的優(yōu)勢(shì),我們可以將它與傳統(tǒng)的編程語(yǔ)言進(jìn)行對(duì)比,看看如果不使用LCEL語(yǔ)法,我們需要做哪些額外的工作。我們?nèi)砸陨鲜鲂υ挼纳涉湠槔?/p>

這段代碼非常簡(jiǎn)潔和清晰,只需要幾行就可以實(shí)現(xiàn)我們想要的功能。而且,這段代碼還具有很高的可擴(kuò)展性和靈活性,例如:

  • 如果我們想要以流式的方式獲取笑話,我們只需要改變調(diào)用方法,使用stream代替invoke
# 調(diào)用笑話對(duì)象,傳入一個(gè)主題字符串,得到一個(gè)笑話字符串的流
joke.stream("dog")
  • 如果我們想要同時(shí)處理多個(gè)主題,我們只需要改變調(diào)用方法,使用batch代替invoke
# 調(diào)用笑話對(duì)象,傳入一個(gè)主題字符串的列表,得到一個(gè)笑話字符串的列表
joke.batch(["dog", "cat", "banana"])
  • 如果我們想讓請(qǐng)求異步執(zhí)行只需要
joke.ainvoke("dog")
  • 模型的變更也十分簡(jiǎn)單,只需要變更modal變量的定義即可
prompt = BasePromptTemplate("tell me a short joke about {topic}")
# 改用gpt-3.5-turbo的llm
model = OpenAI(model="gpt-3.5-turbo")
output_parser = StrOutputParser()
joke = ({"topic": RunnablePassthrough()} | prompt | model | output_parser)
  • 同時(shí)LCEL標(biāo)準(zhǔn)模型中的對(duì)象都可以直接增加同類型對(duì)象作為fallbacks,操作上只需要執(zhí)行with_fallbacks方法即可。由于整條鏈亦是LCEL標(biāo)準(zhǔn)模型,因而鏈亦可配置fallbacks
# 增加OpenAI的llm作為ChatModel的fallbacks
prompt = BasePromptTemplate("tell me a short joke about {topic}")
model = ChatModel()
fallback_llm = OpenAI(model="gpt-3.5-turbo")
modal_with_fallback = model.with_fallbacks([fallback_llm])
output_parser = StrOutputParser()
joke = ({"topic": RunnablePassthrough()} | prompt | modal_with_fallback | output_parser)

以上只是一些簡(jiǎn)單的例子,你可以根據(jù)自己的需求,使用LCEL語(yǔ)法提供的更多的組合原語(yǔ),實(shí)現(xiàn)更復(fù)雜的功能和效果。

那么,如果我們不使用LCEL語(yǔ)法,而是使用傳統(tǒng)的編程語(yǔ)言,我們需要做哪些額外的工作呢?我們以Python為例,看看我們需要寫多少代碼,才能實(shí)現(xiàn)與LCEL語(yǔ)法相同的功能。

圖片代碼對(duì)比

從上面的代碼可以看出,如果我們不使用LCEL語(yǔ)法,而是使用傳統(tǒng)的編程語(yǔ)言,我們需要寫很多的代碼,才能實(shí)現(xiàn)與LCEL語(yǔ)法相同的功能。而且,這些代碼還存在很多的問(wèn)題,例如:

  • 代碼的可讀性和可維護(hù)性很差,需要花費(fèi)很多的時(shí)間和精力去理解和修改。
  • 代碼的可擴(kuò)展性和靈活性很低,需要對(duì)代碼進(jìn)行大量的修改,才能實(shí)現(xiàn)不同的功能和效果。
  • 代碼的可復(fù)用性和可移植性很差,需要對(duì)代碼進(jìn)行大量的修改,才能適應(yīng)不同的場(chǎng)景和平臺(tái)。

因此,我們可以看出,LCEL語(yǔ)法相比傳統(tǒng)的編程語(yǔ)言,具有很多的優(yōu)勢(shì),它可以讓我們更高效、更簡(jiǎn)單、更靈活地構(gòu)建復(fù)雜的AI應(yīng)用。

總結(jié)

在本文中,我們介紹了如何使用LangChain的LECL語(yǔ)法。我們介紹了LECL的基本語(yǔ)法以及基于LECL的流、異步等多種用法,并對(duì)比了不適用LECL語(yǔ)法開發(fā)的情況。

我們希望本文能夠幫助你了解LangChain中特色的LECL語(yǔ)法,鼓勵(lì)你嘗試使用LangChain開發(fā)自己的應(yīng)用。

參考資料:

  • [1] Why use LCEL.https://python.langchain.com/docs
責(zé)任編輯:武曉燕 來(lái)源: AI小智
相關(guān)推薦

2011-11-30 16:29:41

2024-08-12 15:23:43

LangChain

2023-10-16 16:05:44

PythonPyCharm編程語(yǔ)言

2011-04-18 11:00:34

使用音頻BlackBerry

2011-11-29 16:38:58

Knockout

2011-12-05 14:50:13

Knockout

2011-12-05 15:44:45

Knockout

2012-01-04 16:21:11

2011-04-15 16:05:00

監(jiān)聽(tīng)UI對(duì)象的改變BlackBerry

2011-04-15 15:16:28

使用圖像對(duì)象畫圖BlackBerry

2011-07-25 16:21:22

Sencha touc

2011-11-29 16:56:30

Knockout

2024-08-01 11:10:52

2022-08-02 08:01:09

開發(fā)插件Chrome前端技術(shù)

2010-06-13 09:27:56

Widget開發(fā)

2024-06-19 10:41:06

2011-06-09 18:24:36

QT Wince

2012-03-26 09:27:40

谷歌安卓開發(fā)谷歌安卓

2023-05-15 18:44:07

前端開發(fā)

2011-04-15 14:22:20

圖片操作UIBlackBerry
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)