|
LLM之LangChain:LangChain 0.1.0 版本發(fā)布的簡介、安裝和使用方法、案例應用之詳細攻略
相關文章Py之Langchain:Langchain(LLM大型語言模型應用程序框架/將LLMs個體進行flow的能力)的簡介、安裝、使用方法之詳細攻略https://yunyaniu.blog.csdn.net/article/details/127779588 LangChain 0.1.0 版本發(fā)布的簡介LangChain 已經(jīng)存在了一年多,隨著它發(fā)展成為構(gòu)建 LLM 應用程序的默認框架,它發(fā)生了很多變化。正如我們在一個月前預覽的那樣,我們最近決定對 LangChain 軟件包架構(gòu)進行重大更改,以更好地組織項目并加強基礎。 具體而言,我們進行了兩個重大的架構(gòu)更改:將 langchain-core 和合作伙伴軟件包(或者是放入 langchain-community 中,或者是獨立的合作伙伴軟件包)從 langchain 中分離出來。 作為提醒,langchain-core 包含主要的抽象、接口和核心功能。這段代碼是穩(wěn)定的,已經(jīng)遵循了一個多月的更嚴格的版本控制政策。 然而,langchain 本身仍然保持在 0.0.x 版本上。將所有版本都放在次要版本 0 上創(chuàng)建了一些挑戰(zhàn): >> 用戶無法確信更新不會有破壞性的變化 >> 隨著我們采取“維護一切”的方式以減少破壞性變化和棄用通知,langchain 變得臃腫且不穩(wěn)定 然而,從今天開始發(fā)布 langchain 0.1.0,所有未來的發(fā)布都將遵循一個新的版本標準。具體而言: >> 對公共 API 的任何破壞性更改將導致次要版本號的提升(第二位數(shù)) >> 任何錯誤修復或新功能將導致修補版本號的提升(第三位數(shù)) 我們希望這一點,再加上之前的架構(gòu)更改,將: >> 明確傳達是否進行了破壞性更改,使開發(fā)者可以放心地更新 >> 為正式棄用和刪除舊代碼提供途徑,減少冗余 >> 更負責任地處理集成(它們的 SDK 通常與 LangChain 一樣迅速變化) 即使在發(fā)布 0.2 版本之后,我們?nèi)匀怀兄Z維護 0.1 的分支,但僅修補關鍵的錯誤。在本文的最后,您可以了解更多關于我們的計劃。 在重新架構(gòu)軟件包以邁向穩(wěn)定的 0.1 版本的過程中,我們抓住機會與數(shù)百名開發(fā)者交流,了解他們?yōu)楹问褂?LangChain 以及他們喜歡其中的哪些方面。這些意見指導了我們的方向和重點。我們還利用這個機會在下面概述的核心領域中為 Python 和 JavaScript 版本帶來了一致性。 雖然某些集成和更為輔助的鏈可能是特定于語言的,但核心抽象和關鍵功能在 Python 和 JavaScript 軟件包中都得到了相同的實現(xiàn)。 我們想分享我們聽到的意見以及我們不斷改進 LangChain 的計劃。我們希望通過分享這些經(jīng)驗,增加透明度,讓其他人更好地使用、理解和為 LangChain 做出貢獻。畢竟,LangChain 的一個巨大部分是我們的社區(qū)——包括用戶群體和2000多名貢獻者——我們希望每個人都能參與其中。 文章地址:LangChain v0.1.0 文檔地址:langchain 0.1.0 — 🦜🔗 LangChain 0.1.0 Python GitHub 討論,地址:LangChain v0.1.0 · langchain-ai/langchain · Discussion #15712 · GitHub Python v0.1.0 指南,地址:GitHub - hwchase17/langchain-0.1-guides at blog.langchain.dev JS v0.1.0 指南,地址:GitHub - bracesproul/langchainjs-0.1-guides at blog.langchain.dev YouTube 演示,地址:https://www./watch?v=Fk_zZr2DbQY&list=PLfaIDFEXuae0gBSJ9T0w7cu7iJZbH3T31&pp=gAQBiAQB&ref=blog.langchain.dev 1、第三方集成人們最喜歡 LangChain 的一點是我們?nèi)绾?span style="color:#ff0000;">輕松地讓他們在任何堆棧上開始構(gòu)建。我們有近700個集成,從LLMs到向量存儲到工具,供代理使用。 LangChain 通常被用作將構(gòu)建 LLM 應用程序所需的所有不同組件“粘合”在一起的工具,因此優(yōu)先考慮強大的集成生態(tài)系統(tǒng)對我們非常重要。 大約一個月前,我們開始進行一些變更,我們認為這些變更將改善集成的穩(wěn)健性、穩(wěn)定性、可擴展性和一般的開發(fā)者體驗。我們將所有第三方集成都拆分到 langchain-community 中——這使我們能夠集中處理與集成相關的工作。我們還開始將各個集成拆分到它們自己的軟件包中。到目前為止,我們已經(jīng)為約10個軟件包執(zhí)行了此操作,包括 OpenAI、Google 和 Mistral。這樣做的一個好處是更好的依賴管理——以前,所有依賴項都是可選的,嘗試安裝特定版本時可能會導致一些麻煩。現(xiàn)在,如果集成位于自己的軟件包中,我們可以更嚴格地版本化它們的要求,從而更容易安裝。另一個好處是版本控制。通常,第三方集成會發(fā)生變化,需要進行破壞性變更?,F(xiàn)在,可以在獨立的集成軟件包中以適當?shù)陌姹究刂品从尺@些變化。 2、可觀察性構(gòu)建 LLM 應用程序涉及將一個非確定性組件放在系統(tǒng)的中心。這些模型通常會輸出意外的結(jié)果,因此對系統(tǒng)中發(fā)生的事情進行可見性是至關重要的。 我們希望使 langchain 盡可能可觀察和可調(diào)試,無論是通過架構(gòu)決策還是通過我們在一旁構(gòu)建的工具。 我們以幾種方式著手解決這個問題。 我們解決這個問題的主要方式是通過構(gòu)建 LangSmith。 LangSmith 提供的主要價值主張之一是為您的 LLM 應用程序提供最佳的調(diào)試體驗。我們記錄確切發(fā)生的每個步驟,每個步驟的輸入是什么,每個步驟的輸出是什么,每個步驟需要多長時間等數(shù)據(jù)。我們以用戶友好的方式顯示這些數(shù)據(jù),使您能夠識別哪些步驟花費的時間最長,進入一個游樂場以調(diào)試意外的 LLM 響應,跟蹤令牌使用情況等等。即使在私人測試版中,對 LangSmith 的需求也是壓倒性的,我們正在大力投資于可伸縮性,以便在未來幾個月內(nèi)發(fā)布公共測試版,然后使其普遍可用。我們還已經(jīng)支持企業(yè)版本,為那些有嚴格數(shù)據(jù)隱私政策的企業(yè)提供了在 VPC 內(nèi)部署的選項。 我們還以其他方式解決了可觀察性的問題。我們長期以來一直在管道的不同日志級別中內(nèi)置了冗長和調(diào)試模式。我們最近引入了可視化您創(chuàng)建的鏈以及獲取所有使用的提示的方法。 3、可組合性雖然有預構(gòu)建的鏈以幫助入門,但我們經(jīng)??吹綀F隊超越這些架構(gòu)并希望自定義他們的鏈——不僅僅是自定義提示,還包括自定義協(xié)調(diào)的不同部分。 在過去的幾個月里,我們在 LangChain 表達語言(LCEL)上進行了大量投資。這使得可以組合任意序列,提供與數(shù)據(jù)工程管道(批處理、并行化、回退)相同的許多好處。 它還提供了一些對 LLM 工作負載獨特的好處,主要是 LLM 特定的可觀察性(上面已涵蓋),以及本文后面將要介紹的流式傳輸。 LCEL 的組件位于 langchain-core 中。我們已經(jīng)開始為 LangChain 中的特定鏈創(chuàng)建更高級別的入口點。這些將逐漸替換先前的(現(xiàn)在稱為“Legacy”)鏈,因為使用 LCEL 構(gòu)建的鏈將獲得流式傳輸、易于定制、可觀察性、批處理、自動重試等功能。我們的目標是使這個過渡變得無縫。以前可能是這樣做的: ConversationalRetrievalChain.from_llm(llm, …) 我們希望簡單地做成這樣: create_conversational_retrieval_chain(llm, …) 在底層,它將創(chuàng)建一個特定的 LCEL 鏈并返回它。如果要修改邏輯——沒問題!因為它全部都是用 LCEL 編寫的,所以可以輕松地修改其中的一部分,而無需子類化任何內(nèi)容或覆蓋任何方法。 LangChain 中有很多鏈,其中許多都被廣泛使用。在替代構(gòu)造函數(shù)存在并被使用和經(jīng)過良好測試之前,我們不會棄用鏈的舊版本。 4、流式傳輸LLMs 有時可能需要一段時間才能響應。向最終用戶顯示正在執(zhí)行工作而不是盯著空白屏幕非常重要。這可以采用從 LLM 流式傳輸令牌或流式傳輸中間步驟(如果鏈或代理運行時間更長)的形式。 我們在這兩方面都投入了大量資源。所有使用 LCEL 構(gòu)建的鏈都公開了標準的 stream 和 astream 方法,我們在流式傳輸方面進行了大量工作,確保不僅僅在 LLM 調(diào)用中進行流式傳輸(例如,在輸出解析器中也進行)。所有鏈還公開了一個標準的 astream_log 方法,該方法在 LCEL 鏈中流式傳輸所有步驟。然后,可以過濾這些步驟以輕松獲取中間步驟和其他信息。 對于大多數(shù) LLM 應用程序而言,流式傳輸(令牌和中間步驟)是關鍵的用戶體驗組成部分,使用 LangChain 可以輕松實現(xiàn)這一點。 5、輸出解析LangChain 的主要用途之一是“工具使用”——使用 LLMs 調(diào)用其他工具。 確保 LLM 以可以在下游應用程序中使用的結(jié)構(gòu)化格式返回信息對于啟用 LLM 執(zhí)行操作至關重要。 我們在這方面進行了大量工作,引入了輸出解析器的概念,以提供良好的開發(fā)體驗。 LangChain的主要用例之一是“工具使用” - 使用LLMs調(diào)用其他工具。 確保LLM以結(jié)構(gòu)化格式返回信息,以便在下游應用中使用對于使LLMs能夠采取行動至關重要。 我們在這方面投入了大量工作,引入了輸出解析的概念,以提供良好的開發(fā)人員體驗。 實現(xiàn)這一目標的主要方式之一是通過OpenAI函數(shù)調(diào)用。我們不僅使指定輸出格式變得簡單(使用Pydantic、JSON模式甚至是函數(shù)),而且還輕松處理響應。我們還支持幾種不同的編碼方法(JSON、XML、Yaml),用于在您想要使用不支持OpenAI函數(shù)調(diào)用的模型時進行提示。當您需要使用提示時,您還需要適當?shù)闹噶罡嬖VLLM如何響應 - 所有輸出解析器都配備了一個get_format_instructions方法來獲取這些指令。 我們還在輸出解析器方面投資了更高級的功能,如允許它們在生成時通過部分結(jié)果進行流式處理以改善用戶體驗。這包括從結(jié)構(gòu)化格式(如JSON、XML和CSV)中流式處理部分結(jié)果。對于輸出解析,有時可能會有些棘手 - 為了解析JSON blob,大多數(shù)JSON解析器需要一個完整的JSON blob。許多我們的輸出解析器包含內(nèi)置邏輯,以執(zhí)行部分解析。 6、檢索我們看到開發(fā)人員構(gòu)建的主要類型的應用程序之一是與其私有數(shù)據(jù)交互的應用程序。 能夠輕松地將您的數(shù)據(jù)與LLMs結(jié)合使用是LangChain的一個非常重要的部分。這通常涉及兩個不同的組件 - 攝取(準備數(shù)據(jù))和檢索(檢索數(shù)據(jù)),我們都已經(jīng)構(gòu)建出來了。 在攝取方面,攝取的一個重要部分是將您正在處理的文本分割成塊。盡管這可能看似微不足道,但通常最好的方法往往是微妙的,而且通常特定于您正在處理的文檔類型。我們有15種不同的文本拆分器,一些經(jīng)過優(yōu)化以適應特定文檔類型(如HTML和Markdown),以使開發(fā)人員在此過程中具有最大的控制權。相關數(shù)據(jù)通常會發(fā)生變化,而我們的攝取系統(tǒng)設計用于生產(chǎn)規(guī)模的應用程序。我們提供了一個索引API,允許您重新攝入內(nèi)容,同時忽略未更改的部分 - 為大量工作負載節(jié)省時間和成本。 在檢索方面,我們投資于更先進的方法,同時使檢索更具生產(chǎn)力。我們實施了來自學術界的先進檢索策略(如FLARE和Hyde),創(chuàng)建了我們自己的策略(如Parent Document和Self-Query),并從其他行業(yè)解決方案中借鑒了一些(如Multi-Query - 源自搜索中常用的查詢擴展)。我們還確保支持生產(chǎn)關注點,如每用戶檢索 - 對于存儲多個用戶的文檔的任何應用程序都至關重要。 重要的是,盡管LangChain提供了構(gòu)建先進檢索系統(tǒng)所需的所有組件,但我們在如何實現(xiàn)這一目標上并不過于武斷。這導致許多其他庫構(gòu)建在LangChain之上,以提供更具意見的檢索方法 - 例如EmbedChain和GPTResearcher。 7、代理LangChain最早因其代理工作負載而聞名。這可能意味著兩件事: >> 工具使用:使LLM調(diào)用函數(shù)或工具 >> 推理:如何最好地使LLM多次調(diào)用工具,以及以何種順序(或根本不調(diào)用工具!) 在工具使用方面,我們主要涵蓋了我們認為至關重要的組件: >> 與大量第三方工具的集成 >> 以適應這些工具的輸入模式的方式結(jié)構(gòu)LLMs的響應 >> 以LCEL指定這些工具應該被調(diào)用的自定義方式的靈活方式 在推理方面,我們有一些不同的“代理”方法,可以基本上被視為在循環(huán)中運行的LLM,每次迭代決定它需要調(diào)用哪個(如果有的話)工具,然后觀察該工具的結(jié)果。我們從一開始就引入了ReAct(一種早期的提示策略),并迅速添加了許多其他類型,包括使用OpenAI函數(shù)調(diào)用的類型,使用它們的新工具調(diào)用API的類型,優(yōu)化對話的類型等等。 通過靈活和可擴展的工具支持和先進的推理功能,LangChain已成為使LLMs能夠采取行動的默認方式。 與檢索類似,盡管LangChain提供了代理的構(gòu)建塊,但我們還看到了一些更具意見的框架構(gòu)建在其上。一個很好的例子是CrewAI,它基于LangChain構(gòu)建,提供了一個更容易的界面,用于多代理工作負載。 8、LangChain 0.2盡管我們剛剛發(fā)布了LangChain 0.1,但我們已經(jīng)在思考0.2。對我們來說,一些重要的事情是: >> 用LCEL重寫傳統(tǒng)鏈(具有更好的流式處理和調(diào)試支持) >> 添加新類型的鏈 >> 添加新類型的代理 >> 提高我們的生產(chǎn)攝取能力 >> 刪除舊的和未使用的功能 重要的是,即使我們對刪除一些舊的和遺留的代碼以使langchain更加精簡和專注感到興奮,我們也希望維護對仍在使用舊版本的人的支持。這就是為什么我們將保持0.1作為一個穩(wěn)定的分支(修復關鍵錯誤)至少在0.2發(fā)布后的3個月內(nèi)。我們計劃在今后的每個穩(wěn)定發(fā)布中執(zhí)行此操作。 如果您一直想要開始貢獻,現(xiàn)在是個好時機。我們最近在GitHub上添加了一個很好的入門問題,如果您正在尋找一個開始的地方。 9、One More ThingLangChain v0.1.0的一個很大的部分是穩(wěn)定性和專注于上述核心區(qū)域?,F(xiàn)在我們已經(jīng)確定了人們喜歡LangChain的方面,我們可以開始在那些方面添加更先進和完整的工具。 人們喜歡LangChain的主要原因之一是它對代理的支持。大多數(shù)代理基本上被定義為在某種循環(huán)中運行LLM。到目前為止,我們進行這種操作的唯一方式是使用AgentExecutor。我們向AgentExecutor添加了許多參數(shù)和功能,但它仍然只是運行循環(huán)的一種方式。 我們很高興地宣布langgraph的發(fā)布,這是一個允許創(chuàng)建語言代理作為圖形的新庫。 這將允許用戶創(chuàng)建更自定義的循環(huán)行為。您可以定義顯式的規(guī)劃步驟、顯式的反思步驟,或者輕松地將其硬編碼,使得特定工具始終首先被調(diào)用。 它受Pregel和Apache Beam的啟發(fā)。當前公開的接口是受NetworkX啟發(fā)的,看起來像這樣:
我們過去六個月一直在進行這方面的工作,與用戶進行了測試。它目前支持OpenGPTs。在接下來的幾周內(nèi),我們將添加更多示例和文檔 - 我們對此感到非常激動! 在這里嘗試一下。 10、Conclusion隨著生態(tài)系統(tǒng)的發(fā)展,LangChain已經(jīng)發(fā)生了顯著變化。我們非常感謝我們的社區(qū)和用戶一直以來的支持和建設。通過這個0.1版本,我們花時間了解您在LLM框架中想要和需要什么,并承諾繼續(xù)構(gòu)建它。隨著社區(qū)需求的演變(或者如果我們遺漏了什么),我們希望聽取您的反饋,以便我們可以解決它。人們說:“千里之行始于足下。” - 或者在我們的情況下,版本0.1。 LangChain 0.1.0 版本的安裝和使用方法pip install langchain LangChain 0.1.0 版本的案例應用更新中…… |
|
|