LangChain:構建、實驗和分析語言模型和智能體的強大Python庫
核心要點:
LangChain是一個功能強大的Python庫,使開發人員和研究人員能夠創建、實驗和分析語言模型和智能體。它為自然語言處理(NLP)愛好者提供了一套豐富的功能,從構建自定義模型到高效地操作文本數據。在本綜合指南中,我們將深入探討LangChain的基本組件,並演示如何在Python中利用其強大功能。
環境設置:
要學習本文,請創建一個新文件夾,並使用pip安裝LangChain和OpenAI:
<code class="language-bash">pip3 install langchain openai</code>
智能體(Agents):
在LangChain中,智能體是一個能夠理解和生成文本的實體。這些智能體可以配置特定的行為和數據源,並經過訓練以執行各種與語言相關的任務,這使得它們成為各種應用的多功能工具。
創建LangChain智能體:
智能體可以配置為使用“工具”來收集所需的數據並製定良好的響應。請看下面的示例。它使用Serp API(一個互聯網搜索API)來搜索與問題或輸入相關的信息,並使用這些信息來做出響應。它還使用llm-math工具執行數學運算——例如,轉換單位或查找兩個值之間的百分比變化:
<code class="language-python">from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")</code>
如你所見,在完成所有基本的導入和初始化LLM (llm = OpenAI(model="gpt-3.5-turbo", temperature=0))之後,代碼使用tools = load_tools(["serpapi", "llm-math"], llm=llm)加載智能體工作所需的工具。然後,它使用initialize_agent函數創建智能體,為其提供指定的工具,並為其提供ZERO_SHOT_REACT_DESCRIPTION描述,這意味著它將不記得以前的問題。
智能體測試示例1:
讓我們用以下輸入來測試這個智能體:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
如你所見,它使用了以下邏輯:
智能體測試示例2:
LangChain智能體不僅限於搜索互聯網。我們可以將幾乎任何數據源(包括我們自己的數據源)連接到LangChain智能體,並向其提出有關數據的問題。讓我們嘗試創建一個在CSV數據集上訓練的智能體。
從Kaggle上的SHIVAM BANSAL處下載此Netflix電影和電視節目數據集,並將其移動到你的目錄中。現在將此代碼添加到一個新的Python文件中:
<code class="language-bash">pip3 install langchain openai</code>
此代碼調用create_csv_agent函數並使用netflix_titles.csv數據集。下圖顯示了我們的測試。
如上所示,其邏輯是在cast列中查找所有“Christian Bale”的出現。
我們還可以像這樣創建一個Pandas DataFrame智能體:
<code class="language-python">from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")</code>
如果我們運行它,我們將看到如下所示的結果。
這些只是一些例子。我們可以將幾乎任何API或數據集與LangChain一起使用。
模型(Models):
LangChain中有三種類型的模型:大型語言模型(LLM)、聊天模型和文本嵌入模型。讓我們通過一些示例來探索每種類型的模型。
大型語言模型(Language Model):
LangChain提供了一種在Python中使用大型語言模型的方法,以根據文本輸入生成文本輸出。它不像聊天模型那樣複雜,最適合簡單的輸入-輸出語言任務。以下是用OpenAI的示例:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
如上所示,它使用gpt-3.5-turbo模型為提供的輸入(“Come up with a rap name for Matt Nikonorov”)生成輸出。在這個例子中,我將溫度設置為0.9,以使LLM更具創造性。它想出了“MC MegaMatt”。我給它打9/10分。
聊天模型(Chat Model):
讓LLM模型想出說唱名字很有趣,但如果我們想要更複雜的答案和對話,我們需要使用聊天模型來提升我們的水平。從技術上講,聊天模型與大型語言模型有何不同?用LangChain文檔中的話說:
聊天模型是大型語言模型的一種變體。雖然聊天模型在後台使用大型語言模型,但它們使用的接口略有不同。它們不使用“文本輸入,文本輸出”的API,而是使用“聊天消息”作為輸入和輸出的接口。
這是一個簡單的Python聊天模型腳本:
<code class="language-bash">pip3 install langchain openai</code>
如上所示,代碼首先發送一個SystemMessage,並告訴聊天機器人要友好和非正式,之後它發送一個HumanMessage,告訴聊天機器人說服我們Djokovich比Federer更好。
如果你運行這個聊天機器人模型,你將看到如下所示的結果。
嵌入(Embeddings):
嵌入提供了一種將文本塊中的單詞和數字轉換為向量的方法,然後可以將這些向量與其他單詞或數字關聯起來。這聽起來可能很抽象,所以讓我們來看一個例子:
<code class="language-python">from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")</code>
這將返回一個浮點數列表:[0.022762885317206383, -0.01276398915797472, 0.004815981723368168, -0.009435392916202545, 0.010824492201209068]。這就是嵌入的樣子。
嵌入模型的用例:
如果我們想訓練一個聊天機器人或LLM來回答與我們的數據或特定文本樣本相關的問題,我們需要使用嵌入。讓我們創建一個簡單的CSV文件(embs.csv),其中包含一個“text”列,其中包含三條信息:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
現在,這是一個腳本,它將使用嵌入來獲取問題“Who was the tallest human ever?”並在CSV文件中找到正確的答案:
<code class="language-python">from langchain.llms import OpenAI from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.agents import create_csv_agent import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" agent = create_csv_agent( OpenAI(temperature=0), "netflix_titles.csv", verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, ) agent.run("In how many movies was Christian Bale casted")</code>
如果我們運行此代碼,我們將看到它輸出“Robert Wadlow was the tallest human ever”。該代碼通過獲取每條信息的嵌入並找到與問題“Who was the tallest human ever?”的嵌入最相關的嵌入來找到正確的答案。嵌入的力量!
塊(Chunks):
LangChain模型不能同時處理大型文本並使用它們來生成響應。這就是塊和文本分割的用武之地。讓我們來看兩種在將文本數據饋送到LangChain之前將其分割成塊的簡單方法。
按字符分割塊:
為了避免塊中的突然中斷,我們可以通過在換行符或雙換行符的每次出現處分割文本,來按段落分割文本:
<code class="language-python">from langchain.agents import create_pandas_dataframe_agent from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.llms import OpenAI import pandas as pd import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" df = pd.read_csv("netflix_titles.csv") agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True) agent.run("In what year were the most comedy movies released?")</code>
遞歸分割塊:
如果我們想嚴格地按一定長度的字符分割文本,我們可以使用RecursiveCharacterTextSplitter:
<code class="language-python">from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" llm = OpenAI(model="gpt-3.5-turbo", temperature=0.9) print(llm("Come up with a rap name for Matt Nikonorov"))</code>
塊大小和重疊:
在查看上面的示例時,你可能想知道塊大小和重疊參數的確切含義,以及它們對性能的影響。這可以用兩點來解釋:
鏈(Chains):
鏈基本上是多個LLM功能鏈接在一起以執行更複雜的任務,而這些任務無法通過簡單的LLM輸入->輸出方式來完成。讓我們來看一個很酷的例子:
<code class="language-bash">pip3 install langchain openai</code>
此代碼將兩個變量輸入到其提示中,並製定一個有創意的答案(temperature=0.9)。在這個例子中,我們要求它為一部關於數學的恐怖電影想出一個好標題。運行此代碼後的輸出是“The Calculating Curse”,但這並沒有真正顯示鏈的全部功能。
讓我們來看一個更實際的例子:
<code class="language-python">from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")</code>
這段代碼可能看起來令人困惑,所以讓我們逐步講解。
這段代碼讀取Nas(嘻哈藝術家)的簡短傳記,並從文本中提取以下值,並將它們格式化為JSON對象:
在提示中,我們還指定了“Make sure to answer in the correct format”,以便我們始終以JSON格式獲得輸出。這是此代碼的輸出:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
通過向create_structured_output_chain函數提供JSON模式,我們使鏈將其輸出放入JSON格式。
超越OpenAI:
儘管我一直使用OpenAI模型作為LangChain不同功能的示例,但它並不局限於OpenAI模型。我們可以將LangChain與許多其他LLM和AI服務一起使用。 (這是LangChain可集成LLM的完整列表。)
例如,我們可以將Cohere與LangChain一起使用。這是LangChain Cohere集成的文檔,但為了提供一個實際示例,在使用pip3 install cohere安裝Cohere之後,我們可以使用LangChain和Cohere編寫一個簡單的問答代碼,如下所示:
<code class="language-python">from langchain.llms import OpenAI from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.agents import create_csv_agent import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" agent = create_csv_agent( OpenAI(temperature=0), "netflix_titles.csv", verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, ) agent.run("In how many movies was Christian Bale casted")</code>
上面的代碼產生以下輸出:
<code class="language-python">from langchain.agents import create_pandas_dataframe_agent from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.llms import OpenAI import pandas as pd import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" df = pd.read_csv("netflix_titles.csv") agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True) agent.run("In what year were the most comedy movies released?")</code>
結論:
在本指南中,你已經看到了LangChain的不同方面和功能。掌握了這些知識後,你就可以利用LangChain的功能來進行NLP工作,無論你是研究人員、開發人員還是愛好者。
你可以在GitHub上找到包含本文所有圖片和Nas.txt文件的倉庫。
祝你使用Python中的LangChain進行編碼和實驗愉快!
以上是Python的Langchain的完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!