LangChain的核心概念是Chain,它是一種由多個流程構件組成的有向圖,可以對輸入的文本進行各種轉換和處理,輸出你想要的結果。LangChain提供了一種專門的表達式語言,叫做LCEL(LangChain Expression Language),它可以讓你用簡潔和靈活的語法來定義和操作Chain,無需編寫復雜的代碼。
今天我將帶領大家使用LCEL語法來構建和組合Chain,實現強大的LLM應用。
本文為一個系列,之前內容沒有看過的小伙伴可以點擊鏈接查看:AI課程合集
LCEL是一個用于構建復雜鏈式組件的語言,它支持流式處理、并行化、日志記錄等功能。LCEL的基本語法規則是使用|
符號將不同的組件連接起來,形成一個鏈式結構。|
符號類似于Unix的管道操作符,它將一個組件的輸出作為下一個組件的輸入,從而實現數據的傳遞和處理。
LCEL的語法非常簡潔和靈活,它可以用于各種場景和任務。例如,我們可以使用LCEL來實現以下功能:
prompt = BasePromptTemplate("tell me a short joke about {topic}")model = ChatModel()output_parser = StrOutputParser()joke = ({"topic": RunnablePassthrough()} | prompt | model | output_parser)
這個鏈式結構的作用是,首先根據用戶輸入的主題,生成一個提示,然后將提示傳遞給語言模型,讓它生成一個笑話,最后將笑話轉換為字符串,返回給用戶。我們可以用以下代碼來測試這個鏈式結構:
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!"
通過以上案例,我們能夠了解如何使用LCEL語言構建一個生成笑話的鏈式結構。我將為您解釋其中的每一步:
LCEL語法的核心思想是:一切皆為對象,一切皆為鏈。這意味著,LCEL語法中的每一個對象都實現了一個統一的接口:Runnable,它定義了一系列的調用方法(invoke, batch, stream, ainvoke, …)。這樣,你可以用同樣的方式調用不同類型的對象,無論它們是模型、函數、數據、配置、條件、邏輯等等。而且,你可以將多個對象鏈接起來,形成一個鏈式結構,這個結構本身也是一個對象,也可以被調用。這樣,你可以將復雜的功能分解成簡單的組件,然后用LCEL語法將它們組合起來,形成一個完整的應用。
LCEL語法還提供了一些組合原語,讓你可以更靈活地控制鏈式結構的行為,例如:
parallel
原語將多個對象并行執行,提高效率和性能。fallback
原語為某個對象指定一個備選對象,當主對象執行失敗時,自動切換到備選對象,保證應用的可用性和穩定性。config
原語為某個對象指定一個配置對象,根據運行時的輸入或條件,動態地修改對象的參數或屬性,增加應用的靈活性和適應性。為了更好地理解LCEL語法的優勢,我們可以將它與傳統的編程語言進行對比,看看如果不使用LCEL語法,我們需要做哪些額外的工作。我們仍以上述笑話的生成鏈為例。
這段代碼非常簡潔和清晰,只需要幾行就可以實現我們想要的功能。而且,這段代碼還具有很高的可擴展性和靈活性,例如:
stream
代替invoke
:# 調用笑話對象,傳入一個主題字符串,得到一個笑話字符串的流joke.stream("dog")
batch
代替invoke
:# 調用笑話對象,傳入一個主題字符串的列表,得到一個笑話字符串的列表joke.batch(["dog", "cat", "banana"])
joke.ainvoke("dog")
prompt = BasePromptTemplate("tell me a short joke about {topic}")# 改用gpt-3.5-turbo的llmmodel = OpenAI(model="gpt-3.5-turbo")output_parser = StrOutputParser()joke = ({"topic": RunnablePassthrough()} | prompt | model | output_parser)
# 增加OpenAI的llm作為ChatModel的fallbacksprompt = 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)
以上只是一些簡單的例子,你可以根據自己的需求,使用LCEL語法提供的更多的組合原語,實現更復雜的功能和效果。
那么,如果我們不使用LCEL語法,而是使用傳統的編程語言,我們需要做哪些額外的工作呢?我們以Python為例,看看我們需要寫多少代碼,才能實現與LCEL語法相同的功能。
代碼對比
從上面的代碼可以看出,如果我們不使用LCEL語法,而是使用傳統的編程語言,我們需要寫很多的代碼,才能實現與LCEL語法相同的功能。而且,這些代碼還存在很多的問題,例如:
因此,我們可以看出,LCEL語法相比傳統的編程語言,具有很多的優勢,它可以讓我們更高效、更簡單、更靈活地構建復雜的AI應用。
在本文中,我們介紹了如何使用LangChain的LECL語法。我們介紹了LECL的基本語法以及基于LECL的流、異步等多種用法,并對比了不適用LECL語法開發的情況。
我們希望本文能夠幫助你了解LangChain中特色的LECL語法,鼓勵你嘗試使用LangChain開發自己的應用。
參考資料:
本文鏈接:http://www.www897cc.com/showinfo-26-54153-0.htmlLangChain應用開發指南-熟用LCEL語法掌握Chain的精髓
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 深入ReactiveFeign:反應式遠程接口調用的最佳實踐
下一篇: 使用React微前端的完整指南