LangChain和Hub的前世今生

程序员半支烟發表於2024-06-26

作為LLM(大模型)開發框架的寵兒,LangChain在短短几年內迅速崛起,成為開發者們不可或缺的工具。本文將帶你探討LangChain和LangChainHub的發展歷程。

1. LLM開發框架的寵兒

這兩年人工智慧領域發展迅猛,LLM(大模型)的出現功不可沒。LLM的發展將整個人工智慧領域往前推進了一大步,將人工智慧這道狹窄的門撐寬了不少,讓我們這些平凡的普通人也有機會擠進人工智慧的發展中。

普通開發者在人工智慧領域能做什麼呢?目前可以發力的領域是:開發基於LLM的App。開發LLM的App有多種實現方式,LangChain是比較流行的一種。

伴隨著人工智慧的發展,這兩年LangChain發展迅猛,GitHub上的star數飆升,近期更是成功融資2億美刀,足見其受歡迎程度。

早期的LangChain只是作為一個工具或者膠水,整合了多個LLM和多種外部元件(比如記憶、檢索、向量資料庫、工具集等等),方便開發者快速開發基於LLM的App。

我估計,當時LangChain的創始人對LangChain的定位也不是很清晰,只是覺得AI應用開發是個不錯的風口,先搞了再說,這也很符合創業和商業邏輯。

2. 現在的LangChain

隨著LLM的發展,一切逐步走向確定性(業內一致認為LLM App是未來的方向),而且可能伴隨著商業化的要求,LangChain對自己的定位發生了一些改變。

早期的LangChain可能只是想抓住一波LLM的風口,對於自身的定位也不是很清晰,隨著LLM領域更多的發力點在構建基於LLM的App上,LangChain也趕緊調整了自身的定位。

不再定位在:膠水、工具集合等等理念了。更多的強調自己是:構建LLM App的最大社群,基於LangChain可以開發出可推理的應用程式。

調整了定位,生態也自然做了調整,同時軟體架構也隨之變化,比如:軟體包上做了很多重構和重組,核心能力 和 周邊社群生態 的邊界越發清晰。

同時,還加入了LangSmith用於監控LLM應用,還有LangServe用於部署LLM應用。一切的步伐都在朝著商業化發展。

至此LangChain調整為以下幾個核心模組:

  • LangChain-Core:抽象LangChain的核心 和 LangChain 表示式語言。
  • LangChain-Community:整合的各種第三方部件。
  • LangChain:構成LLM應用程式需要的 鏈、代理和檢索等。
  • LangSmith:開發者平臺,可讓 除錯、測試、評估和監控 基於任何 LLM 框架上構建的鏈,並與 LangChain 無縫整合。
  • LangServe:用於將 LangChain 的應用 部署為 REST API。

這幾點我們從官網的架構圖清晰可見。也可以認為此時的LangChain變成了一個SAAS化的開發者平臺。而它提供的元件、工具、監控、部署等生態,也都是為了讓開發者方便的開發出LLM App,然後部署到這個平臺上。

LangChain是一個優秀的LLM開源框架,也無法避免走上常規的開源軟體商業化的套路。

3. 早期的LangChainHub

LangChain早期推出的各種元件中LangChainHub是其中一個比較有意思的專案。

早期LangChainHub對自己的定位如下:LangChainHub 受 Hugging Face Hub 啟發,是一個用於發現和提交常用的 提示、鏈、代理等的平臺。早期,LangChainHub以Prompt集合為起點,然後很快擴充套件到 鏈 和 代理。

這個定位我們從之前的LangChainHub在github倉庫上的目錄可見一斑。

此時的LangChainHub 可以理解為LangChain 工具包 或者說 元件中心,裡面提供了高質量的元件方便開發者使用。確確實實是一個分享和探索Prompt、鏈 和Agent的地方。

比如,我們要基於reAct機制實現一個Agent,如果自己寫一堆Prompt(提示詞)那就太費勁了。此時,在LangChainHub就有許多現成可用的Prompt模板,使用簡單又省事,所以LangChainHub迅速流行開。

4. 現在的LangChainHub

那現在的LangChainHub在新的LangChain架構圖的哪裡呢?我也覺得挺奇怪的,LangChainHub也是算生態裡較為重要的版塊,架構圖裡居然沒提。

後來發現,LangChainHub被放到了LangSmith裡。這個從新版的官方文件也是清晰可見。

這也算合情合理吧,畢竟LangSmith是一個開發者平臺,用於除錯、測試、評估、監控基於LLM框架的鏈,在這個平臺上,可以使用和建立Prompt。

早期的時候LangChainHub有Prompt、Chain、Agent,現在也只有Prompt了。我個人對LangChainHub的定位多少覺得有些悲涼了,LangChainHub淪為了Prompt模板倉庫。

我認為這背後存在兩種可能的原因:

  • 可能是商業化的要求吧,將常用的Prompt模板挪到開發者平臺LangSmith裡,畢竟LangSmith是有各種付費計劃的。
  • 可能是官方對於LangChainHub裡的內容開始做收縮,聚焦於Prompt,畢竟Prompt比較獨立 而且易於交付。而Chains 和 Agents 相對來說,交付難度高一些,變動性也低,所以官方直接將 Chains 和 Agents 沉澱到自己的核心庫裡,這樣也能保證Chains 和 Agents 的質量,保證自己的口碑。

LangChainHub真的是始於Prompt,終於Prompt!!!當然啦,以後的LangChainHub怎麼發展就不得而知了。

慶幸的是,我們大部分場景還是使用Prompt模板居多,此時的LangChainHub裡依舊能找到大咖們貢獻的複雜常用的Prompt模板,降低了我們使用ReAct、Tool的門檻。

5. LangChainHub的使用

下面我們透過一個示例,來看看如何使用LangChainHub。

5.1. 拆解LangChainHub的Prompt

比如:要實現一個reAct機制,如果我們自己寫提示詞,那太複雜了。但是LangChainHub上已經有大佬定義好了相關提示詞。

比如:structured-chat-agenthttps://smith.langchain.com/hub/hwchase17/structured-chat-agent),提示詞寫的還是有點複雜的,大致意思就是:告訴LLM,它可以使用一堆什麼格式的工具,然後先推理,選擇合適的工具,執行之後,進行觀察,觀察完了之後,繼續推理,如果有答案了,就回複使用者。

具體內容如下:

5.2. 使用LangChainHub

使用LangChainHub上的Prompt就2步:

  1. 匯入LangChainHub庫
  2. 從Hub上拉取對應的提示詞

接下來舉個例子,比如,LLM在直接計算浮點數加減時會出現錯誤,我要做一個基於reAct框架的AI Agent,讓這個Agent幫我精準計算浮點數。這裡使用LangChainHub裡的structured-chat-agent來簡化我的流程。

具體程式碼如下:

from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor, tool
from langchain.memory import ConversationBufferMemory
from langchain.schema import HumanMessage
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="gpt-3.5-turbo",
    openai_api_key="sk-xnAKVC6V0LzBwqGK9fE59cFcBc3f40DcBf96C135112dFb63",
    openai_api_base="https://api.aigc369.com/v1",
)


# 定義工具
class SumNumberTool(BaseTool):
    name = "數字相加計算工具"
    description = "當你被要求計算2個數字相加時,使用此工具"

    def _run(self, a, b):
        return a["title"] + b["title"]


# 加入到工具合集
tools = [SumNumberTool()]

# 使用reAct的提示詞
prompt = hub.pull("hwchase17/structured-chat-agent")

# 建立Agent
agent = create_structured_chat_agent(llm=model, tools=tools, prompt=prompt)

# 建立記憶元件
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

# 建立Agent執行器
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)

agent_executor.invoke({"input": "你幫我算下 3.941592623412424 + 4.3434532535353的結果"})

6. 總結

本文主要聊了LangChain和LangChainHub的發展變遷,還介紹了LangChainHub的使用,希望對你有幫助!

=====>>>>>> 關於我 <<<<<<=====

本篇完結!歡迎點贊 關注 收藏!!!

原文連結:https://mp.weixin.qq.com/s/lpv3q4y34m1VSmR0AEN6Rw

相關文章